44018723 发表于 2014-7-15 09:11

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


[反汇编练习] 160个CrackMe之034.本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将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/192147191763366.png2、程序分析:想要破解一个程序,必须先了解这个程序。所以,在破解过程中,对最初程序的分析很重要,他可以帮助我们理解作者的目的和意图,特别是对于注册码的处理细节,从而方便我们反向跟踪和推导。和上一节一样,打开CHM,选择第34个Cruehead.3.exe,保存下来。运行程序,程序界面如下:
http://images.cnitblog.com/blog/573547/201407/150854361315880.png
悲剧啊,啥也没有!PEID:MASM32 / TASM32 [覆盖]汇编写的程序啊!哎!要么很简单,要么就很坑啦! 3、思路分析和破解流程1、打开OD,将exe拖到OD窗口中,等程序暂停后,不用理会(先不要运行,否则无法进行爆破)。2、右键->中文搜索插件->智能搜索,找到提示成功字符串:http://images.cnitblog.com/blog/573547/201407/150854501156942.png很容易找到提示成功的字符串:Good work cracker! 选中它,右键->Follow.
00401362/$8B0D 49214000 mov ecx,dword ptr ds:
00401368|.8B7424 04   mov esi,dword ptr ss:
0040136C|.8B7C24 08   mov edi,dword ptr ss:
00401370|.83C7 0C       add edi,0xC
00401373|.F3:A4         rep movs byte ptr es:,byte ptr ds:[>
00401375|.66:C707 210Dmov word ptr ds:,0xD21
0040137A|.83C7 02       add edi,0x2
0040137D|.8B7424 0C   mov esi,dword ptr ss:
00401381|.B9 1A000000   mov ecx,0x1A
00401386|.F3:A4         rep movs byte ptr es:,byte ptr ds:[>
00401388|.6A 30         push 0x30                              ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
0040138A|.68 57214000   push 00402157                            ; |Good work cracker!
0040138F|.68 6A214000   push 0040216A                            ; |Cracked by:               Now try the next crackme!
00401394|.FF35 04204000 push dword ptr ds:             ; |hOwner = NULL
0040139A|.E8 19000000   call <jmp.&USER32.MessageBoxA>         ; \MessageBoxA
0040139F\.C3            retn
这里只进行了一个提示,我们在头部下断,跟踪,发现这里调用了这段代码:
00401187|.58            pop eax                                  ;// 将结果出栈,问题在于怎样才能找到对应入栈的地方
00401188|.3C 01         cmp al,0x1                               ;// 比较是否成功
0040118A      75 17         jnz short 004011A3                     ;// 不成功则跳转,想要爆破就要改这里
0040118C|.68 86214000   push 00402186                            ;ASCII "xt crackme!"
00401191|.68 6A214000   push 0040216A                            ;ASCII "Cracked by: !\rNow try the next crackme!"
00401196|.68 08204000   push 00402008
0040119B|.E8 C2010000   call 00401362
004011A0|.83C4 0C       add esp,0xC
在0040118A地址处,如果跳转则直接到失败的地方了!所以,想要爆破,只需要将这个判断跳转修改为Nop。
地址: 0040118A 选中 jnz short 004011A3,右键->Binary->Fill with NOPs。F9,运行程序!http://images.cnitblog.com/blog/573547/201407/150854557715481.png4、注册机的探索这个汇编代码也不长,但是汇编的代码逻辑性一般都很差,所以,我们还是从头开始分析吧:
00401000 >/$6A 00         push 0x0                                 ; /pModule = NULL
00401002|.E8 7D040000   call <jmp.&KERNEL32.GetModuleHandleA>    ; \GetModuleHandleA
00401007|.A3 E9204000   mov dword ptr ds:,eax
0040100C|.C705 F9204000>mov dword ptr ds:,0x0
00401016|.6A 00         push 0x0                                 ; /hTemplateFile = NULL
00401018|.68 80000000   push 0x80                              ; |Attributes = NORMAL
0040101D|.6A 03         push 0x3                                 ; |Mode = OPEN_EXISTING
0040101F|.6A 00         push 0x0                                 ; |pSecurity = NULL
00401021|.6A 03         push 0x3                                 ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
00401023|.68 000000C0   push 0xC0000000                        ; |Access = GENERIC_READ|GENERIC_WRITE
00401028|.68 D7204000   push 004020D7                            ; |FileName = "CRACKME3.KEY"
0040102D|.E8 76040000   call <jmp.&KERNEL32.CreateFileA>         ; \CreateFileA
00401032|.83F8 FF       cmp eax,-0x1
00401035|.75 0C         jnz short 00401043                     ;// 存在则跳过
00401037|>68 0E214000   push 0040210E                            ;ASCII "CrackMe v3.0             "
0040103C|.E8 B4020000   call 004012F5
00401041|.EB 6B         jmp short 004010AE
00401043|>A3 F5204000   mov dword ptr ds:,eax
00401048|.B8 12000000   mov eax,0x12
0040104D|.BB 08204000   mov ebx,00402008
00401052|.6A 00         push 0x0                                 ; /pOverlapped = NULL
00401054|.68 A0214000   push 004021A0                            ; |pBytesRead = Cruehead.004021A0
00401059|.50            push eax                                 ; |BytesToRead => 12 (18.)
0040105A|.53            push ebx                                 ; |Buffer => Cruehead.00402008
0040105B|.FF35 F5204000 push dword ptr ds:             ; |hFile = 00000044 (window)
00401061|.E8 30040000   call <jmp.&KERNEL32.ReadFile>            ; \ReadFile
00401066|.833D A0214000>cmp dword ptr ds:,0x12         ;// 比较这个地址的文本是否为0x12
0040106D|.^ 75 C8         jnz short 00401037
0040106F|.68 08204000   push 00402008
00401074|.E8 98020000   call 00401311                            ;// 进行一些数据比较
00401079|.8135 F9204000>xor dword ptr ds:,0x12345678
00401083|.83C4 04       add esp,0x4
00401086|.68 08204000   push 00402008
0040108B|.E8 AC020000   call 0040133C                            ;// 一个加法
00401090|.83C4 04       add esp,0x4
00401093|.3B05 F9204000 cmp eax,dword ptr ds:
00401099|.0F94C0      sete al
0040109C|.50            push eax
0040109D|.84C0          test al,al
0040109F|.^ 74 96         je short 00401037
004010A1|.68 0E214000   push 0040210E                            ;ASCII "CrackMe v3.0             "
004010A6|.E8 9B020000   call 00401346
004010AB|.83C4 04       add esp,0x4
004010AE|>6A 00         push 0x0                                 ; /Title = NULL
004010B0|.68 28214000   push 00402128                            ; |Class = "No need to disasm the code!"
004010B5|.E8 9A030000   call <jmp.&USER32.FindWindowA>         ; \FindWindowA
这里查找了CRACKME3.KEY文件,然后通过ReadFile读取文件处理。我们在exe所在目录下,新建一个空文件:CRACKME3.KEY由于从地址 00401066 开始,进行了大量的内存数据修改和比较处理,并且没有参照内容,分析了很长时间还是不知道怎样才是正确的,所以只有放弃了!有关内存处理的地方如下:
00401007|.A3 E9204000   mov dword ptr ds:,eax
0040100C|.C705 F9204000>mov dword ptr ds:,0x0

00401043|> \A3 F5204000   mov dword ptr ds:,eax

00401052|.6A 00         push 0x0                                 ; /pOverlapped = NULL
00401054|.68 A0214000   push 004021A0                            ; |pBytesRead = Cruehead.004021A0
00401059|.50            push eax                                 ; |BytesToRead => 12 (18.)
0040105A|.53            push ebx                                 ; |Buffer => Cruehead.00402008
0040105B|.FF35 F5204000 push dword ptr ds:             ; |hFile = NULL
00401061|.E8 30040000   call <jmp.&KERNEL32.ReadFile>            ; \ReadFile
将读取的文本存放在内存中,然后进行数据比较,这部分是最重点的内容:
00401066|.833D A0214000>cmp dword ptr ds:,0x12         ;// 比较这个地址的字节是否为0x12
0040106D|.^ 75 C8         jnz short 00401037
0040106F|.68 08204000   push 00402008
00401074|.E8 98020000   call 00401311                            ;// 进行一些数据比较
00401079|.8135 F9204000>xor dword ptr ds:,0x12345678
00401083|.83C4 04       add esp,0x4
00401086|.68 08204000   push 00402008
0040108B|.E8 AC020000   call 0040133C                            ;// 一个加法
00401090|.83C4 04       add esp,0x4
00401093|.3B05 F9204000 cmp eax,dword ptr ds:
00401099|.0F94C0      sete al
0040109C|.50            push eax
0040109D|.84C0          test al,al
0040109F|.^ 74 96         je short 00401037

Call 00401037:
00401311/$33C9          xor ecx,ecx
00401313|.33C0          xor eax,eax
00401315|.8B7424 04   mov esi,dword ptr ss:
00401319|.B3 41         mov bl,0x41
0040131B|>8A06          /mov al,byte ptr ds:
0040131D|.32C3          |xor al,bl
0040131F|.8806          |mov byte ptr ds:,al
00401321|.46            |inc esi
00401322|.FEC3          |inc bl
00401324|.0105 F9204000 |add dword ptr ds:,eax
0040132A|.3C 00         |cmp al,0x0
0040132C|.74 07         |je short 00401335
0040132E|.FEC1          |inc cl
00401330|.80FB 4F       |cmp bl,0x4F
00401333|.^ 75 E6         \jnz short 0040131B
00401335|>890D 49214000 mov dword ptr ds:,ecx
0040133B\.C3            retn

Call 0040133C:
0040133C/$8B7424 04   mov esi,dword ptr ss:
00401340|.83C6 0E       add esi,0xE
00401343|.8B06          mov eax,dword ptr ds:
00401345\.C3            retn
到此结束!BY笨笨D幸福

jmkflb 发表于 2014-7-15 09:22

支持大神一下

haobo1648246261 发表于 2014-7-15 09:19

同上!不懂!有时间在看看。。

菜逼小奇 发表于 2014-7-15 09:19

阿水小水 发表于 2014-7-15 09:37

支持楼主

落叶、随风 发表于 2014-7-15 09:16

不懂   但是支持

bao宝明 发表于 2014-7-15 10:31

bao宝明 发表于 2014-7-15 10:37

骑乌龟的帅蜗牛 发表于 2014-7-15 10:45

支持技术型文章

microcartoon 发表于 2014-7-15 11:57

注册码的算法其实不是很难
页: [1] 2
查看完整版本: [反汇编练习] 160个CrackMe之034