界面看起来很普通
也没有壳,直接搜索字符串找到关键代码处
但是发现这些都是赋值,并没有实现跳转相关的函数。这里通过给弹窗函数下断点,追一下返回函数来找触发点。
再次点击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;
}
搞定
其实这个程序总体代码不多,翻源码也是可以看到关键代码的,但是在复杂的程序时就没这么容易 了,所以采取了对窗口函数下断的方式,虽然麻烦了,但是方法更加通用。