一、查看程序信息
二、观察程序特点
我X的了,什么鬼程序,怎么操作都没反应
亏我刚开始看到中文还一股亲切感油然而生
从程序就可以看出来,中国人就是比老外邪恶啊……
三、寻找突破口
字符串倒是能搜到,可你都不会玩,搜到了有个鸟用。
还是用delphi解剖神器吧
在DelphiDecompiler中,可以看到里面有一堆事件
(写这软件的人才是真牛逼,感慨一下)
chkcode KeyUp不知干嘛的,测试一下发现, KeyUp 用户名输入会触发,chkcode序列号输入会触发。这两触发太频繁就就先不下断了。
Panel1DblClick Panel1Click 看起来应该是图片框的双击和单击事件,感觉这俩相比应该比较好欺负,那就根据上面的RVA下两个断点。
四、收集有用信息
输入“12345”、“67890”,先单击好了。
初来乍到,先F8一遍,留意寄存器、堆,看看有没有什么关键的信息。
一
迅速走完一遍,程序没什么反应,但根据前面看到的KeyUp事件,暂时推测序列号是否正确是在案件抬起事件中判断的吧,所以输入错误的情况下,程序走完一遍也没反应。
但是F8的过程中,堆里出现可以信息,信息都存储在04425B**附近。
而且程序了应该有一个0x13次的循环。
数据窗口定位04425B**附近,再走一遍看看。
程序中,发现了个“注册成功”,但代码并没执行到那
向上看发现,原来是在0x13次循环后,直接跳过去了
00458031 81BE 0C030000 8>CMP DWORD PTR DS:[ESI+0x30C],0x85
0045803B 75 76 JNZ SHORT 004_CKme.004580B3
直接在内容中,将[ESI+0x30C]的值改为0x85,看看效果
呵,果然看到朱茵姐姐了
那就对[ESI+0x30C]下断,看看是什么地方修改这个值
绝望,单击、双击、KeyUp、chkcode都没断下来……或许是某些条件没符合
五、换个思路
0x85是个常量,既然有和常量的比较,那理论上应该有对他的赋值
Ctrl+B我们搜搜85 00 00 00,Ctrl+L下一个
搜了一圈还真有一个符合的,MOV
0x457EFE正好是符合我们要求的代码
它的上面是一个JNZ,怪不得我们断不下来,原来直接跳过了
我们在JNZ上面的比较处下断,看看是什么操作会出发这的代码
原来是双击会触发判断。
既然是和常量0x3E比较,和上面一样,我们看看那直接用0x3E赋值了
Ctrl+B我们搜搜3E 00 00 00,Ctrl+L下一个
0x3E的赋值也要进行判断,真够麻烦的
往上点下个断点,看看哪能影响跳转
最可恨的是双击事件竟然不到这个断点
4个事件挨个试过后,是序列号输入会触发
F8走一遍,发现两个CALL都会把ZF位置0
看来要读代码了。
好幸运,只进了一层,F8分别看两个函数的输入和返回
在第二个函数就发的现了输入的序列号和生成的序列号
换几组用户名密码,试试序列号规则
“黑头Sun Bird”+(用户名长度+5)+“dseloffc-012-OK”+用户名
能不猜就读代码,哈哈哈哈哈
六、总结一下
4个事件各有各的用处
用户名的KeyUp事件是计算了用户名的长度
序列号的chkcode事件是生成了序列号并验证,然后给个状态值0x3E
图片Panel双击事件,判断是否是0x3E,然后给个状态之0x85
图片Panel单击时间,判断是否是0x85,判断是否显示图片