说明:看雪论坛里面已经有了一篇分析[天天日记本2.1.1]注册算法的文章,作者是
我烦死机代码,本文是对原文的一点补充,因为作者没有给出注册机,而根据汇编代码来写出注册机,对我来说,就像我四年后的高考一样,还十分遥远,所以就有了这篇文章。不过其实还有一种破解方法,那就是写一篇介绍这个软件的文章,告诉作者你的文章在什么杂志上面发表,然后作者查明之后就会给你注册码,还可以赚稿费,很爽的哦!
破解工具:OllyDbg, DeDe, C32Asm, 计算器
爆破思路:
在原文中,作者说到软件脱壳之后就无法正常使用,很明显是在某个地方做了文件校验,甚至有可能涉及到 CRC|RSA|DES 之类乱七八糟的,既然可以顺利脱壳,那么只要用DeDe找到验证的代码,再改一下,就可以顺利地进行爆破。
爆破过程:
从原文知道程序加了Aspack 2.12的壳,所以打开 OllyDbg,用OllyScript打开脱Aspack的脚本进行脱壳(注意:如果是利用其他方法进行脱壳,可能以下所讲的地址会有所不同,但不影响爆破)。
打开DeDe4,找有Save字样的过程,因为脱壳之后无法保存,那这里面肯定有问题。很快可以找到一个过程FileSaveExecute,双击打开这个过程,可以看到以下代码:
* Reference to: Forms.TApplication.GetExeName(TApplication):AnsiString;
|
00560884 E8EB33F4FF call 004A3C74 //得到程序的文件名
00560889 8B45F0 mov eax, [ebp-$10]
* Reference to: InGlobal.FileSizeByName(AnsiString):Int64;
|
0056088C E87FB8F9FF call 004FC110 //得到程序的大小
00560891 83FA00 cmp edx, +$00 //这个好像是大小不大于0跳
00560894 7505 jnz 0056089B
00560896 3D00F61E00 cmp eax, $000A1200 //A1200是脱壳之前的文件大小
0056089B 0F85A0010000 jnz 00560A41 //不相等跳
看来我的推断没有错,而且是使用了最简单的办法,对比文件大小。在资源管理器里面可以看到脱壳之前的文件大小是659968字节,用计算器转换成十六进制就是A1200,而脱壳之后的文件大小是2029056字节,十六进制为1EF600。
本来我想用Aspack把脱壳之后的文件重新压回去,但是这样还是差十几KB的大小,所以我打开OllyDbg,点击右键,搜索->所有命令,输入 cmp eax, 0A1200 (注意DeDe反汇编出来的数据表示形式是Delphi的语法,注意别弄错了),结果显示找到四个,其中一个就是FileSaveExecute过程里面的,其余三个分别是FileNewExecute、FileDelExecute、TreeViewChange过程里面的,记下找到的这几个地址,打开C32Asm,(没有的可以用Hedit、Hex Workshop等编辑器代替)文件->打开十六进制文件,打开脱壳之后的文件,按Ctrl+W切换到汇编模式,按Ctrl+G,输入刚才记下的几个地址,分别将这几处的代码 cmp eax,A1200改为 cmp eax, 1EF600 //(这个数值是脱壳之后的文件大小,可能有变动),然后再按Ctrl+G跳转到0055D854,把 JE 0055D969 修改为 JMP 0055D969,保存,爆破成功。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)