本帖最后由 ACracker 于 2012-11-14 19:58 编辑
【软件地址】:www.duote.com/soft/54222.html#download
【原帖地址】:http://pleasereverse.me/thread-98-1-1.html
【使用工具】:OD
OD载入,发现为易语言程序(其实偶不会脱加密壳,找的程序都是不带强壳的),F9运行找到注册的地方。
神啊原谅我用万恶易语言万能断点,要怪就ximo牛吧。
ALT+E,双击krnln.fnr,CTRL+B查找FF 55 FC,
确定来到此处F2下断:
输入注册码,点击“立即使用正版软件”,OD 断下,F7进入call,就直接来按钮事件的代码,往下拉看看有没有什么可疑的跳转,能静态认出来,就直接改了。
果断水平不过关认不出来,还是老老实实调吧。F8一路向下,遇到跳转慢下来,看看调过的是神马东西,黄天不负苦心人,找到了一个可疑的大跳。
运行到此处发现,这个跳转实现了,修改Z标志位,让这个跳 跳不起来,F9运行。出现注册成功的字样,但是真的成功了吗?
添加一个文件,点击 立即转换,出现了这个:
又该怎么办呢?不要急,俗话说山重水复疑无路,柳暗花明又一春。
既然那个跳是关键跳,那就看看上面的关键CALL嘛。
[C] 纯文本查看 复制代码 0046977D 8B1D CC0C9900 mov ebx,dword ptr ds:[0x990CCC]
00469783 83C3 04 add ebx,0x4
00469786 895D F8 mov dword ptr ss:[ebp-0x8],ebx
00469789 FF75 F8 push dword ptr ss:[ebp-0x8]
0046978C E8 31020000 call 视频转换.004699C2
00469791 68 02000080 push 0x80000002
00469796 6A 00 push 0x0
00469798 50 push eax
00469799 68 01000000 push 0x1
0046979E BB DC090000 mov ebx,0x9DC
004697A3 E8 83A70000 call 视频转换.00473F2B
004697A8 83C4 10 add esp,0x10
004697AB 33C9 xor ecx,ecx
004697AD 41 inc ecx
004697AE 51 push ecx
004697AF 50 push eax
004697B0 3BC8 cmp ecx,eax
004697B2 0F8F D6010000 jg 视频转换.0046998E ; 关键跳
004697B8 8B1D CC0C9900 mov ebx,dword ptr ds:[0x990CCC]
004697BE 83C3 04 add ebx,0x4
这个跳转是比较ecx与eax的值,ecx大于eax则跳走,即失败。上面的xor ecx,ecx 清0 ecx,inc ecx ,是ecx自加1,所以ecx固定为1 ,所以这里对这个跳有影响的只有eax,eax为0就失败,大于0就成功。
一般关键跳上面一个就是关键CALL,但是这里是例外,跟踪发现
004697A3 E8 83A70000 call 视频转换.00473F2B
这句不会改变eax的值。再验证一次,重新运行,F4运行到004697A3 这个CALL,右键寄存器窗口的eax,选择置1,此事eax变成了1,F8步过这个CALL,发现eax还是1,那么说明以上那个想法是正确的。那么再看一下上面那个CALL是否是关键CALL,再次运行,发现
0046978C E8 31020000 call 视频转换.004699C2
这个CALL将eax置0了,他是关键CALL。跟进去又看到一堆代码,头又大了。静下来想想,我们是爆破,只需要关心eax的值就可以了,于是代码一直往下拉,直到看到retn。
[ColdFusion] 纯文本查看 复制代码 00469BC0 33C9 xor ecx,ecx
00469BC2 41 inc ecx
00469BC3 51 push ecx
00469BC4 50 push eax
00469BC5 3BC8 cmp ecx,eax
00469BC7 0F8F 0E000000 jg 视频转换.00469BDB
00469BCD B8 01000000 mov eax,0x1
00469BD2 E9 22000000 jmp 视频转换.00469BF9
00469BD7 58 pop eax
00469BD8 59 pop ecx
00469BD9 ^ EB E7 jmp X视频转换.00469BC2
00469BDB 83C4 08 add esp,0x8
00469BDE 58 pop eax
00469BDF 59 pop ecx
00469BE0 ^ EB 8A jmp X视频转换.00469B6C
00469BE2 83C4 08 add esp,0x8
00469BE5 58 pop eax
00469BE6 59 pop ecx
00469BE7 ^ E9 2AFFFFFF jmp 视频转换.00469B16
00469BEC 83C4 08 add esp,0x8
00469BEF B8 00000000 mov eax,0x0
00469BF4 E9 00000000 jmp 视频转换.00469BF9
00469BF9 8BE5 mov esp,ebp
00469BFB 5D pop ebp
00469BFC C2 0400 retn 0x4
代码有点奇怪,不过我还是看到了 我想要的00469BCD B8 01000000 mov eax,0x1 将1赋给eax,由上面的分析可以知道eax为1就成功了。但是这句赋值上面有句跳转 跳过这句话,所以可以将那个跳转nop掉就可以了,但是本着爆破程序改动越小越好的原则,将比较语句改一下:cmp ecx,eax改为cmp eax,ecx,这样就只改了一字节。
保存运行
又说成功了,但是真的成功了吗?事实上他妹的还是没有成功。
只能转换前2分钟的视频,应该是作者留的暗桩,但是我看了下,没有跳过这个暗装的地方。
既然已经转换了2分钟说明程序的功能还是完整的,只是提前结束了。
2分钟即120 秒, 120000 毫秒,搜索这两个常量无果。
BP ReadFile、OpenFile、CreateFile,结果还是无果,但是发现了这个程序是调用cmd.exe来转换的,而参数是字符串的,所以搜索字符串,ctrl+f 查找120,找到了一个,双击进入
熟悉DOS命令的 shutdown 关机命令 shutdown -s -t 120 就是120秒后关机。
这里上面有个跳,跳过这个参数,将这个跳改成jmp ,破解就完成了。
这里的比较是这个函数的一个参数与0比较,但是我在上面找到传入的参数的地方直接是Push 0,貌似不改程序,这个跳永远都不会实现。不知道是作者故意这样弄的,还是有地方我没看到。
其实所有的转换功能并不是有这个程序的作者做的,而是由ffmpeg完成的。
总结:
破解的时候,多站在作者的角度想想,作者使用的是什么注册机制,怎么实现,爆破点在哪儿,找到爆破点有哪些方法。
跟代码的时候开始初略的开一下流程,发现不了什么再仔细看,有时候可以省很多时间。
上次爆破的一个软件采用了全局变量作为唯一 注册标志,这个软件采用了唯一算法判断注册成功与否。建议读者再写共享软件的时候注册码分开存放,分段读取判断。
另外求一起学逆向的基友,站内加好友,一个人学太无聊了,没有基情。遇到问题,也没人讨论。
|