我之前写过一篇关于破解 ArtIcons Pro 5.2 的文章,那时的 ArtIcons 5.27 估计是程序设计时出现错误,导致了只要输入符合规则的字符串即可成功注册的错误。但这种错误毕竟不多见,因此今天我们还是要来一次真正的暴力破解,以便能够随便输入注册码就注册成功(为什么不直接获取注册码?那是因为我没有精力去分析注册算法)。
首先还是来常规的检测和信息收集。
第一步,打开 PEiD 0.95,检查是否加壳。
没有加壳,那么就免去了脱壳的烦恼。我一直在想,Delphi XE 都出来了,开发方为什么还一直在用十多年前的编译器?
第二步,打开程序,输入错误的注册码,获取关键信息。
关键信息是 “Wrong Key.”。
第三步,打开 OllyDbg,载入主程序 ARTICONS.EXE(其实也就这一个程序),查找关键信息。
双击文本进入反汇编窗口。
往上能看到如 “Please enter email used in your order” 的信息。这能充分说明注册码的判断在此信息之后。
第四步,设置断点,进行跟踪。
我在 00542AA4 设置断点(WHY?因为如果你仔细观察的话,会发现 00542AA4 刚好是上面 jnz short 00542AA4 跳转后的地址)。按 F9 键运行程序,随便输入一个注册码。程序中断。
这是我突然发现, 00542AAC 的指令为 cmp eax,0A,这是一个比较指令,他比较的是什么呢?再看前面一条 mov eax,[local.2],local.2 是什么呢?它就是一个函数里的第二个局部变量。那么 local.2 等于什么呢?双击此行的反汇编部分,弹出了反汇编窗口。
我们看到这是 ebp-8 的值指向的数据,。此时 ebp 是多少呢?,在寄存器窗口可以看到是 0018F2E4,那么 ebp-8 就等于 0018F2DC。那么此地址指向的数据是什么呢?我在堆栈窗口里寻找,发现他就是我输入的注册码。
现在已经知道 eax 中存放的是我输入的注册码,那么我们现在可以进入到 00542AA7 这个 call 里面了。于是我选中 00542AA7,按 Enter 进入其中。发现他让 eax 的值等于 eax-4的地址所指向的DWORD类型的整数。
那么这个数字是什么呢?其实我之前的那篇文章就提到了,是字符串的长度。原来程序要判断注册码的长度是否为 0A,0A 等于十进制的 10,也就是说注册码的长度是10。于是我重新输入了10个0,中断在刚才的位置。继续 F8 运行。发现程序在 00542AD5 处没有跳转,将要弹出 Wrong Key. 的错误框。
于是我将 00542AD5 的 je 改为了 jnz,使得程序能够继续运行。按 F8,程序跳到了 00542AE1。继续 F8。当程序运行到 00542AE4 时,程序突然弹出了错误框,提示为 Invalid Key.。
于是我跟进了 515AFC 这个 call 里,发现程序又进行了一次判断。照理把 je 改为 jnz,重新输入注册码继续。
继续单步运行,发现运行到 00542AF7 程序又要做一次判断,照理又把 je 改为 jnz。F9 运行,发现程序弹出了消息。
再打开程序的关于对话框,发现已成功注册。
但是重新启动程序后,发现又变成了未注册版。看来刚才的修改只骗过了注册那一功能。于是我需要继续修改。
我想一个程序里判断注册状态的代码应该是通用的。于是我在刚才的三个判断函数的开头设下断点,重新运行,程序果然在刚运行时被中断了下来。
我跟入了 515A9C 这个 call,发现程序最后更改 eax 的地方是在 00515AF3,根据这个 call 之后的 xor eax,eax 可以看出当 eax 的值为 0是能通过判断。
于是我直接把这个 mov eax,esi 改为了 xor eax,eax,其他两个也一样。最后保存修改。然后发现随便填一个十位注册码即可注册成功,而且永久有效。
但是我对这个长度限制很不满意,于是把判断长度那一段的 jge short 00542ABD 改为了 jmp short 00542ABD,这项输入一位注册码也可以了。
最后是字体的问题。这个很简单。用 Resource Hacker 打开破解了的 ARTICONS.EXE 选择 RC 数据,找到 TFM 开头的项,打开,把里面的 “MS Sans Serif” 改为 “宋体”,把 “Font.Height = -11” 改为 “Font.Height = -12” 即可。
大功告成!
因为D8以后,都是垃圾, 极端的垃圾,垃圾到内核设计人员,连常识都不懂的地步(因为都是阿三在主导,只要会英语,临时拉上就干了,不懂的一个东西要几十所的经验才行), 所以,用D开发, 最高只能用到D7