CKme
Delphi,是Windows平台下Object Pascal语言集成开发环境,支持应用程序快速开发。Delphi Decompiler 是Delphi的反编译工具
第一步
查壳,查信息
第二步
运行程序 :没有按钮,只能两个文本框,一个用户名,一个注册码,作者提示:如果注册成功,程序中会出现"朱茵"小姐的一幅靓照。
第三步
用DeDe反编译看一下 Events(事件) Controls(控件)
现了5个事件,第一个窗体创建与输入的字符应该无关,而后面的键盘按键放下、面板单击和面板双击、还有检查密码,应该就和用户名/注册码的获取和检测有关了,还可以看到“注册成功”的代码段就是面板单击事件中。通过测试发现,KeyUp事件是为了获取输入的用户名,chkcode事件是为了获取输入的注册码并检测我们对这个四个事件下断点,当输入注册码时断在了此处:
程序调用的过程很少,有用的只有Edit2的事件(chkcode)和panel1的两个事件(单击事件和双击事件。)
第四步
打开OD,智能搜索发现了“注册成功字符串”,向上看一看,发现了一个关键跳转,这个跳转会跳过注册成功的,所以这里不能跳,我们看到这里的关键跳的比较条件是[esi+0x0c]和 0x85进行比较
第五步
看一下chkcode事件的代码,从chkcode事件的代码中可以看到,如果输入的序列号正确,则往地址 [esi+0x30c] 中写入 0x3E 。
第六步
按DeDe中的反编译事件地址,先对Edit2的事件(chkcode)代码下断点,跟踪后,代码有一个跳转为关键跳转。将地址 [esi+0x3C] 与 0x3E比较,如果相等则写入 0x85
第七步
看看单击面板,也就是最一开始的“注册成功”,这样我们来理一理思路。
重点:每次输入用户名的时候,事件KeyUp(00457E4C)都会获取用户输入的字符,并保存起来,并获取输入的用户名的长度保存起来,每次输入序列号的时候,事件chkcode(0045C40)都会获取输入的字符并保存起来,在生成正确的字符串(正确的序列号时代码中出现字符串的拼接)并与之对比,如果正确,就向地址[esi+0x3C] 中写入 0x3E。在面板双击事件(0045E7C)中会检测地址[esi+0x3C] 的值是否为0x3E,是的话就向地址[esi+0x3C] 写入0x85 ,在面板单击事件(00457FB8)中检测地址[esi+0x3C] 的值是否为0x85是的话顺序执行到注册成功处,否则跳过注册成功。
结果如图 用户名:(啥都行)
注册码:黑头Sun Bird11dseloffc-012-OK+用户名
希望大家可以学到一些东西!