首页
社区
课程
招聘
答复hsunjun兄弟的“破解软件时如何找关键跳?请赐教~~”一帖 [原创]
发表于: 2005-2-7 12:33 5671

答复hsunjun兄弟的“破解软件时如何找关键跳?请赐教~~”一帖 [原创]

2005-2-7 12:33
5671
【破解作者】 爱国人士
【作者主页】 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直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
附件:crack.rar

这个里面的涉及到的2个crackme
2005-2-7 12:36
0
游客
登录 | 注册 方可回帖
返回
//