44018723 发表于 2014-6-25 21:55

[反汇编练习] 160个CrackMe之018

本帖最后由 44018723 于 2014-6-25 22:33 编辑

[反汇编练习] 160个CrackMe之018.本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注册机的东西。其中,文章中按照如下逻辑编排(解决如下问题):1、使用什么环境和工具2、程序分析3、思路分析和破解流程4、注册机的探索----------------------------------提醒各位看客: 如果文章中的逻辑看不明白,那你一定是没有亲手操刀!OD中的跳转提示很强大,只要你跟踪了,不用怎么看代码就理解了!----------------------------------1、工具和环境:WinXP SP3 + 52Pojie六周年纪念版OD + PEID + 汇编金手指。160个CrackMe的打包文件。下载地址: http://pan.baidu.com/s/1xUWOY密码: jbnq注:1、Win7系统对于模块和程序开启了随机初始地址的功能,会给分析带来很大的负担,所以不建议使用Win7进行分析。2、以上工具都是在52PoJie论坛下的原版程序,NOD32不报毒,个人承诺绝对不会进行任何和木马病毒相关内容。http://images.cnitblog.com/blog/573547/201406/152219166701903.png 2、程序分析:想要破解一个程序,必须先了解这个程序。所以,在破解过程中,对最初程序的分析很重要,他可以帮助我们理解作者的目的和意图,特别是对于注册码的处理细节,从而方便我们反向跟踪和推导。和上一节一样,打开CHM,选择第18个Brad Soblesky.1.exe,保存下来。运行程序,程序界面如下:

3、思路分析和破解流程又见信息框,哈哈哈!PEID查看: Microsoft Visual C++ 6.0和以前的一样,直接上步骤:1、打开OD,将exe拖到OD窗口中,等程序暂停后,直接点击运行按钮(F9),不用理会。2、在exe中输入伪码:123123。点击OK按钮,弹出错误信息框,不要关闭。3、在OD中点击暂停按钮(Ctrl+F12),再点击堆栈K按钮(Ctrl+K),可以看到当前堆栈情况。堆栈区很长,我们从底部开始看:

由于大量地使用了mfc42模块,基本100%可断定使用的是C++的MFC框架写的。下面的那部分属于消息派遣,在最后的一个调用的地方,我们右键跟进去看看:00401C73|.50            push eax                                 ; /pStartupinfo
00401C74|.FF15 0C204000 call dword ptr ds:[<&KERNEL32.GetStartup>; \GetStartupInfoA
00401C7A|.F645 D0 01    test byte ptr ss:,0x1
00401C7E|.74 11         je short 00401C91
00401C80|.0FB745 D4   movzx eax,word ptr ss:
00401C84|.EB 0E         jmp short 00401C94
00401C86|>803E 20       /cmp byte ptr ds:,0x20
00401C89|.^ 76 D8         |jbe short 00401C63
00401C8B|.46            |inc esi
00401C8C|.8975 8C       |mov ,esi
00401C8F|.^ EB F5         \jmp short 00401C86
00401C91|>6A 0A         push 0xA
00401C93|.58            pop eax
00401C94|>50            push eax
00401C95|.56            push esi
00401C96|.53            push ebx
00401C97|.53            push ebx                                 ; /pModule
00401C98|.FF15 08204000 call dword ptr ds:[<&KERNEL32.GetModuleH>; \GetModuleHandleA
00401C9E|.50            push eax
00401C9F|.E8 5E000000   call 00401D02
00401CA4|.8945 98       mov ,eax
00401CA7|.50            push eax                                 ; /status
00401CA8|.FF15 AC214000 call dword ptr ds:[<&MSVCRT.exit>]       ; \exit
00401CAE|.8B45 EC       mov eax,
00401CB1|.8B08          mov ecx,dword ptr ds:
00401CB3|.8B09          mov ecx,dword ptr ds:
00401CB5|.894D 88       mov ,ecx
00401CB8|.50            push eax
00401CB9|.51            push ecx
00401CBA|.E8 15000000   call <jmp.&MSVCRT._XcptFilter>
00401CBF|.59            pop ecx
00401CC0|.59            pop ecx
00401CC1\.C3            retn
根据GetStartUp,GetModuleHandleA很容易判断出不是进行注册码处理的,所以,我们还要继续向上看信息框部分:

这里就很容易地发现了信息框部分!并且注意到在信息框被调用之前有一个exe模块调用的函数,<jmp.&MFC42.#4224>被调用的函数为Brad_sob.004015BC,我们选中这一句,右键->Show call。4、在反汇编窗口向上浏览相关代码,发现两处很明显的提示内容:0040155F|.50            push eax                                 ; /String
00401560|.FF15 04204000 call dword ptr ds:[<&KERNEL32.lstrlenA>] ; \lstrlenA
00401566|.8945 F0       mov ,eax
00401569|.837D F0 01    cmp ,0x1
0040156D|.73 16         jnb short 00401585
0040156F|.6A 40         push 0x40
00401571|.68 2C304000   push 0040302C                            ;ASCII "CrackMe"
00401576|.68 34304000   push 00403034                            ;ASCII "Enter Registration Number"
0040157B|.8B4D E0       mov ecx,
0040157E|.E8 7B050000   call <jmp.&MFC42.#4224>
00401583|.EB 3C         jmp short 004015C1
00401585|>8D4D E4       lea ecx,
00401588|.51            push ecx                                 ; /String2 = "<BrD-SoB>"
00401589|.8D55 F4       lea edx,                        ; |
0040158C|.52            push edx                                 ; |String1 = "123123"
0040158D|.FF15 00204000 call dword ptr ds:[<&KERNEL32.lstrcmpA>] ; \lstrcmpA
00401593|.85C0          test eax,eax
00401595|.75 16         jnz short 004015AD
00401597|.6A 40         push 0x40
00401599|.68 50304000   push 00403050                            ;ASCII "CrackMe"
0040159E|.68 58304000   push 00403058                            ;ASCII "Correct way to go!!"
004015A3|.8B4D E0       mov ecx,
004015A6|.E8 53050000   call <jmp.&MFC42.#4224>
004015AB|.EB 14         jmp short 004015C1
004015AD|>6A 40         push 0x40
004015AF|.68 6C304000   push 0040306C                            ;ASCII "CrackMe"
004015B4|.68 74304000   push 00403074                            ;ASCII "Incorrect try again!!"
004015B9|.8B4D E0       mov ecx,
004015BC|.E8 3D050000   call <jmp.&MFC42.#4224>
C++代码就是好啊,汇编代码及其干净!lstrcmp这个函数进行了文本比较,然后就根据比较结果判断成功还是失败!jnz 004015AD就是关键跳转啦!我们选中这一行,右键->Binary->Fill with NOPs。试试看,哈哈,是不是成功啦!
4、注册机的探索我们已经知道了注册码比较的位置,先直接看看注册码是什么样的?在 lstrcmp 这个函数上下断F2,然后就如同上面那个汇编注释的内容一样,他竟然是固定的!!<BrD-SoB>或许我们猜错了,试一试,OK!确实是固定的!http://images.cnitblog.com/blog/573547/201406/252143258928954.png
BY笨笨D幸福


hainanxiayu 发表于 2014-6-25 23:41

谢谢分享·····学习下··

zc123 发表于 2014-6-25 23:29

默默支持大神。。

shuguang 发表于 2014-7-16 22:19

这个简单

touyuan001 发表于 2015-5-26 09:26

刷刷存在感,顺便标记下。下次看,才看到005
页: [1]
查看完整版本: [反汇编练习] 160个CrackMe之018