【破解作者】 爱国人士
【作者主页】 http://www.pediy.com
【使用工具】 W32DASM,Ollydbg,RTA,PEID,AspackDie
【破解平台】 Win9x/NT/2000/XP
【软件名称】
【破解声明】 烂文一篇,献丑了:) 文章中将讲解3个例子,2个CrackMe,1个实例软件
--------------------------------------------------------------------------------
【破解内容】
昨天上论坛看见有个朋友发贴问怎样判断关键跳和关键CALL,看来这个朋友是刚刚接触了,回帖的都说是靠经验,不错,
确实是靠经验,但这样的回答不是很满意的,我以前也问过这样的问题,他们怎么知道那个就是关键的跳,那个就是关键
的CALL,程序中有成百上千的CALL和跳,怎样判断呢?
小弟不才,今天用3个例子给那个大哥说一下,高手就不看了,我在这里 也献丑了,希望那位大哥可以看到,不然我就
白写了,因为这种文章感觉在论坛精华文章中简直就是垃圾,不值得看的。
例1:
文件来源:《加密解密 第2版》光盘\习题\习题一 \echap301.exe
使用工具:W32DASM,RTA(软件编辑的,主页上有的下)
这个是最简单的crackme了,就用他当例子吧。运行后随便输入序列号确定后有错误提示"Incorrect try again"
先用PEID分析有无壳,发现无壳好办了,用W32DASM打开,在串试参考中查找"Incorrect try again"字符串,找到后双击后来到以下代码:
* Possible StringData Ref from Data Obj ->"Incorrect try again!!"
|
:004015B4 6874304000 push 00403074 ;双击后停在这里
:004015B9 8B4DE0 mov ecx, dword ptr [ebp-20]
这就是找错误提示,那下面该怎么办呢?我们继续向上看代码,有错误的提示就应该有一个判断序列号的指令和一个跳
向错误提示的指令,判断序列号的指令一般用CMP和TEST指令,这些指令后一般都跟有条件跳转指令,这样就可以跳到
正确提示或错误提示上了,分析如下:
* Reference To: KERNEL32.lstrcmpA, Ord:02FCh
|
:0040158D FF1500204000 Call dword ptr [00402000] ;调用函数lsrcmpa比较
:00401593 85C0 test eax, eax ; 做注册码的比较
:00401595 7516 jne 004015AD ;关键跳转指令,不为0就跳到错误提示了
:00401597 6A40 push 00000040
* Possible StringData Ref from Data Obj ->"CrackMe"
|
:00401599 6850304000 push 00403050
* Possible StringData Ref from Data Obj ->"Correct way to go!!"
|
:0040159E 6858304000 push 00403058
:004015A3 8B4DE0 mov ecx, dword ptr [ebp-20]
* Reference To: MFC42.Ordinal:1080, Ord:1080h
|
:004015A6 E853050000 Call 00401AFE
:004015AB EB14 jmp 004015C1
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401595(C)
|
:004015AD 6A40 push 00000040
* Possible StringData Ref from Data Obj ->"CrackMe"
|
:004015AF 686C304000 push 0040306C
* Possible StringData Ref from Data Obj ->"Incorrect try again!!" ;错误提示
|
:004015B4 6874304000 push 00403074 ;刚才双击错误提示来的地方
:004015B9 8B4DE0 mov ecx, dword ptr [ebp-20]
* Reference To: MFC42.Ordinal:1080, Ord:1080h
|
:004015BC E83D050000 Call 00401AFE
这样就找到关键跳了,哈哈,该用TNT来爆了他
用RTA修改jne 004015AD为je 004015AD之后就可以随便输入序列号了,这就是爆破。
例2:
文件来源:《加密与解密实战攻略》CD补充文件 \buchong\CH06\ex612.exe 可以在风飘雪的主页上可以下到该补充包。
工具:Ollydbg
开始工作是一样,先运行程序看看他的提示,然后分析有没有壳,如果有就脱,没有壳直接用OD载入
用OD载入该程序时会提示说是什么代码是加密压缩的........ 不用理他确定之后就可看见汇编代码了。程序是用VB写的
,当然也可以用smartcheck调试工具来搞。
在OD的工具栏上选插件------>命令 ,然后我们输入bpx hmemcpy 回车,他回弹出一个窗口,显示为互相调用的呼叫
在这个窗口中点鼠标右键选在每个命令中设置断点,这时就看见所有的的CALL前都是红色的了,这时关掉这个窗口回主窗口中,
按F9运行程序后回在断点处停下,不用理他,继续按,只到出现程序窗口为止,然后点程序中注册,程序还会被中断
赭石就要再按一下F9就回出现注册的提示框了,我们输入注册名:cracker 注册码:123456 点确定后程序被中断,不理他,继续按F9
并观察堆栈窗口的内容会发现该内容0012F43C 00150AB4 UNICODE "cracker" 再按几下F9后有发现0012F438 00150AEC UNICODE "CRACKER"
小下变大写了,继续按几下F9就可以发现
0012F438 00150A74 UNICODE "123456"
0012F43C 00150B0C UNICODE "ERCRRA"
那"ERCRRA"是什么呢?还用问?注册码呀~~~
回到OD的代码窗口中看看程序中断在那里了
哈哈,程序中断在这里
0041305A . FF15 98104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrCo>; MSVBVM60.__vbaStrComp
继续向下看
0041305A . FF15 98104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrCo>; MSVBVM60.__vbaStrComp
00413060 . 66:85C0 TEST AX,AX
00413063 . 0F85 08010000 JNZ ex612.00413171 ;关键跳
00413069 . A1 10404100 MOV EAX,DWORD PTR DS:[414010]
如果把关键跳的JNZ改成JZ就等于是爆破了,不过都跟出注册码了这个就没有必要了吧?
那么刚才的分析过程叫动态调试跟注册码,那个bpx hmemcpy 命令是设置万能断点,看的教程多了你就明白了。
例3:
文件来源:互联网,自己下吧,软件名:非凡定时关机助手 V4.5 版
工具:W32DASM,PEID,AspackDie
先运行程序,随便输入注册确定后有错误提示,分析壳发现是ASPack 2.12 -> Alexey Solodovnikov
用AspackDie脱壳后运行程序发现可以正常运行,这样就不来修复PE文件了。
W32DASM打开该程序,在串式参考中查找错误提示"注册码不正确,无法注册",双击后来到以下代码:
:004A3CF4 53 push ebx
:004A3CF5 8BD8 mov ebx, eax
:004A3CF7 8BC3 mov eax, ebx
:004A3CF9 E85EFEFFFF call 004A3B5C
:004A3CFE 84C0 test al, al ;真假比较
:004A3D00 7409 je 004A3D0B ;关键跳
:004A3D02 8BC3 mov eax, ebx
:004A3D04 E8AFFBFFFF call 004A38B8
:004A3D09 5B pop ebx
:004A3D0A C3 ret
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A3D00(C)
|
* Possible StringData Ref from Code Obj ->"注册码不正确,无法注册"
|
:004A3D0B B8203D4A00 mov eax, 004A3D20 ;双击来到这里
我们顺着错误提示向上找,可以找到 je 004A3D0B ,当鼠标点在该行时就是绿色的了,这时我们跟随这个条转指令,
看看他跳到那里了,当你点jump to 时发现跳到了
* Possible StringData Ref from Code Obj ->"注册码不正确,无法注册"
|
:004A3D0B B8203D4A00 mov eax, 004A3D20
这时就可以确定这个跳就是关键跳了
将je 004A3D0B修改为 jne 004A3D0B就算成功了,随便输入注册名和注册码就可以了
那么在往上看见的CALL就应该是注册码的算法了,也就是关键的CALL了
--------------------------------------------------------------------------------
【破解总结】
一般找关键跳都是通过错误提示来找的,也就是找到错误提示后向上查看代码,找JE、JNE、JZ、JNE等
条件跳转指令,还要通过自己的分析、判断和测试来确定是否为关键跳,既然有关键跳那就一定有一些比较指令
如:CMP、TEST指令等,这些一般都是注册码相关的判断指令,是比较真码与假码的,再往上看就应该看见有CALL指令了
是通过这个CALL来调用子程序计算注册码或是调用已经计算好的注册码。这些都与自己的破解经验是分不开。
多看看教程会学到很多东西的。
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课