界面看起来很普通

也没有壳,直接搜索字符串找到关键代码处

但是发现这些都是赋值,并没有实现跳转相关的函数。这里通过给弹窗函数下断点,追一下返回函数来找触发点。

再次点击check,触发断点,接着按ctrl+F9返回到函数部分

再往上多找几个跳转就发现了获取字符串的相关函数了。

从这里重新下断点接着追,可以分析出以下函数内容

这里跟进这个call里面看

这里主要是有一个地方注意,内存地址为0x405030的位置的值,需要自己跟着看一下,算法还是挺简单的。重复打开几次软件发现,这部分的值是固定的。

于是根据这个算法,可以计算出最后的值,然后填写的密码进行比较就可以了,写出注册机
#include <iostream>
#include <string>int main() {std::string username;printf("用户名: ");std::getline(std::cin, username);int userLen = username.length();if ( userLen < 4) {printf("用户名长度过短");return 0;}char str_00405030[8] = { 0x0c,0x0a,0x13,0x09,0x0c,0x0b,0x0a,0x08 };int eax = 0;int esi = 0;for (int ecx = 3; ecx < userLen; ecx++) {int dl = username[ecx];int bl = str_00405030[eax];esi += dl * bl;eax++;if(eax > 7)eax = 0 ;}printf("key: %d", esi);return 0;
}

搞定

其实这个程序总体代码不多,翻源码也是可以看到关键代码的,但是在复杂的程序时就没这么容易 了,所以采取了对窗口函数下断的方式,虽然麻烦了,但是方法更加通用。