44018723 发表于 2014-7-1 11:46

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


[反汇编练习] 160个CrackMe之024.本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将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,选择第24个Chafe.2.EXE,保存下来。运行程序,程序界面如下:
注:它是没有信息框提示错误的。
3、思路分析和破解流程PEID:MASM32 / TASM32步骤:1、打开OD,将exe拖到OD窗口中,等程序暂停后,直接点击运行按钮(F9),不用理会。2、在exe中输入Name: bbdxfKey:123123。3、在OD中反汇编窗口,右键->中文搜索引擎->智能搜索。
我们很容易发现了正确文本提示内容:YES!You found your serial!右键->Follow。大概地浏览下代码:
00401230   .8B45 14       mov eax,dword ptr ss:          ;Case 111 (WM_COMMAND) of switch 004011F5
00401233   .3B05 60314000 cmp eax,dword ptr ds:
00401239   .75 1A         jnz short 00401255
0040123B   .6A 00         push 0x0                                 ; /Style = MB_OK|MB_APPLMODAL
0040123D   .68 96304000   push 00403096                            ; |About TEXme v2.0
00401242   .68 A7304000   push 004030A7                            ; |Small crack-me program written by Chafe/TEX99\n\rRULES: Find a serial that matches your name or write a keygenerator. NO PATCHES IS ALLOWED!\n\r\n\rReleased 19/7-99
00401247   .FF75 08       push dword ptr ss:            ; |hOwner
0040124A   .E8 17020000   call <jmp.&USER32.MessageBoxA>         ; \MessageBoxA
0040124F   .33C0          xor eax,eax
00401251   .C9            leave
00401252   .C2 1000       retn 0x10
00401255   >3B05 58314000 cmp eax,dword ptr ds:          ;// 判断是否是编辑框命令
0040125B   .74 0C         je short 00401269
0040125D   .3B05 54314000 cmp eax,dword ptr ds:
00401263   .0F85 AE000000 jnz 00401317
00401269   >C705 D9124000>mov dword ptr ds:,0x584554   ;// 如果正确
00401273   .6A 00         push 0x0                                 ; /IsSigned = FALSE
00401275   .8D45 FC       lea eax,dword ptr ss:         ; |
00401278   .50            push eax                                 ; |pSuccess
00401279   .6A 64         push 0x64                              ; |ControlID = 64 (100.)
0040127B   .FF35 50314000 push dword ptr ds:             ; |hWnd = 000401E2 ('TEXme v2.0',class='CTEX')
00401281   .E8 BC010000   call <jmp.&USER32.GetDlgItemInt>         ; \GetDlgItemInt
00401286   .837D FC 00    cmp dword ptr ss:,0x0         ;// eax=0x1E240=123456
0040128A   .74 5F         je short 004012EB
0040128C   .50            push eax
0040128D   .6A 14         push 0x14                              ; /Count = 14 (20.)
0040128F   .68 6C314000   push 0040316C                            ; |Buffer = Chafe_2.0040316C
00401294   .FF35 54314000 push dword ptr ds:             ; |hWnd = 000301EA (class='Edit',parent=000401E2)
0040129A   .E8 AF010000   call <jmp.&USER32.GetWindowTextA>      ; \GetWindowTextA
0040129F   .85C0          test eax,eax
004012A1   .74 48         je short 004012EB
004012A3   .A1 0B304000   mov eax,dword ptr ds:          ;CTEX==58455443
004012A8   .BB 6C314000   mov ebx,0040316C
004012AD   >0303          add eax,dword ptr ds:               ;// 前四个字符组成的整数+eax
004012AF   .43            inc ebx
004012B0   .81FB 7C314000 cmp ebx,0040317C                         ;// 去掉第一个字符与0比较
004012B6   .^ 75 F5         jnz short 004012AD                     ;// 最后相当于把所有的字符都加了一遍,还有更多的
004012B8   .5B            pop ebx                                  ;// ebx=123456
004012B9   .03C3          add eax,ebx                              ;// eax=3788FA49
004012BB   .3105 D9124000 xor dword ptr ds:,eax          ;// 修改处的汇编代码
004012C1   .C1E8 10       shr eax,0x10                           ;// 右移10位
004012C4   .66:2905 D9124>sub word ptr ds:,ax            ;// 修改处的汇编代码
004012CB   .BE EC114000   mov esi,004011EC
004012D0   .B9 3E000000   mov ecx,0x3E
004012D5   .33DB          xor ebx,ebx
004012D7   .EB 04         jmp short 004012DD
004012D9      54            push esp
004012DA      45            inc ebp
004012DB      58            pop eax
004012DC      00AD 33D84975 add byte ptr ss:,ch
004012E2   ?FA            cli
004012E3   .81FB FBCFFCAF cmp ebx,0xAFFCCFFB                     ;// 与一个常量比较,最终跳到了一个错误
004012E9    ^ 74 EE         je short 004012D9                        ;// 关键跳转
004012EB   >68 59304000   push 00403059                            ; /Your serial is not valid.
004012F0   .FF35 5C314000 push dword ptr ds:             ; |hWnd = 000301E8 ('Your serial is not valid.',class='Edit',parent=000401E2)
004012F6   .E8 7D010000   call <jmp.&USER32.SetWindowTextA>      ; \SetWindowTextA
004012FB   .33C0          xor eax,eax
004012FD   .C9            leave
004012FE   .C2 1000       retn 0x10
00401301   .68 73 30 40 0>ascii "hs0@",0                           ;YES! You found your serial!!
00401306   .FF35 5C314000 push dword ptr ds:             ; |hWnd = 000301E8 ('Your serial is not valid.',class='Edit',parent=000401E2)
0040130C   .E8 67010000   call <jmp.&USER32.SetWindowTextA>      ; \SetWindowTextA
00401311   .33C0          xor eax,eax
00401313   .C9            leave
00401314   .C2 1000       retn 0x10
00401317   >FF75 14       push dword ptr ss:             ; /lParam; Default case of switch 004011F5
0040131A   .FF75 10       push dword ptr ss:             ; |wParam
0040131D   .FF75 0C       push dword ptr ss:            ; |Message
00401320   .FF75 08       push dword ptr ss:            ; |hWnd
00401323   .E8 08010000   call <jmp.&USER32.DefWindowProcA>      ; \DefWindowProcA
00401328   .C9            leave
00401329   .C2 1000       retn 0x10

我直接就放出分析后的代码。和上一个一样,代码非常简单,关键跳转 je short 004012D9 ,爆破只需要将它改为jmp跳转就可以了。这里省略。
4、注册机的探索注意这段代码
004012B8   .5B               pop ebx                                  ;// ebx=123456
004012B9   .03C3             add eax,ebx                              ;// eax=3788FA49
004012BB   .3105 D9124000    xor dword ptr ds:,eax          ;// 修改处的汇编代码
004012C1   .C1E8 10          shr eax,0x10                           ;// 右移10位
004012C4   .66:2905 D9124000 sub word ptr ds:,ax            ;// 修改处的汇编代码
004012CB   .BE EC114000      mov esi,004011EC
004012D0   .B9 3E000000      mov ecx,0x3E


程序启动时,它未修改和第一次修改的都是这样的:
004012D7   . /EB 04            jmp short 004012DD
004012D9   |54               push esp
004012DA   |45               inc ebp
004012DB   |58               pop eax
004012DC   |00AD 33D84975    add byte ptr ss:,ch
004012E2   ?FA               cli
004012E3   .81FB FBCFFCAF    cmp ebx,0xAFFCCFFB                     ;// 与一个常量比较,最终跳到了一个错误
004012E9    ^ 74 EE            je short 004012D9                        ;// 关键跳转
004012EB   >68 59304000      push 00403059                            ; /Your serial is not valid.
004012F0   .FF35 5C314000    push dword ptr ds:             ; |hWnd = 001101E4 ('Your serial is not valid.',class='Edit',parent=00150228)
004012F6   .E8 7D010000      call <jmp.&USER32.SetWindowTextA>      ; \SetWindowTextA
004012FB   .33C0             xor eax,eax
004012FD   .C9               leave
004012FE   .C2 1000          retn 0x10


最后又被修改为一个错误的代码:
004012D7   .EB 04            jmp short 004012DD
004012D9      53               push ebx
004012DA      62D2             bound edx,edx                            ;Illegal use of register
004012DC      37               aaa
004012DD   >AD               lods dword ptr ds:
004012DE   .33D8             xor ebx,eax
004012E0   .49               dec ecx
004012E1   .^ 75 FA            jnz short 004012DD

这一段代码弄得我崩溃了,相当于进行了一个Hook,但是我却找不到hook之后谁在哪里执行了这段代码。悲剧啊!
在这段代码之下,进行了整数的比较:
004012D7   . /EB 04            jmp short 004012DD
004012D9   |54               push esp
004012DA   |45               inc ebp
004012DB   |58               pop eax
004012DC   |00AD 33D84975    add byte ptr ss:,ch
004012E2   ?FA               cli
004012E3   .81FB FBCFFCAF    cmp ebx,0xAFFCCFFB                     ;// 与一个常量比较,最终跳到了一个错误
004012E9    ^ 74 EE            je short 004012D9                        ;// 关键跳转
004012EB   >68 59304000      push 00403059                            ; /Your serial is not valid.
004012F0   .FF35 5C314000    push dword ptr ds:             ; |hWnd = 001101E4 ('Your serial is not valid.',class='Edit',parent=00150228)
004012F6   .E8 7D010000      call <jmp.&USER32.SetWindowTextA>      ; \SetWindowTextA
004012FB   .33C0             xor eax,eax
004012FD   .C9               leave
004012FE   .C2 1000          retn 0x10

整个算法流程大概是这样的:比如我的Name: bbdxf在地址处存放一个初始值,将它与“bbdxf”的前四个字节组成的整数进行相加,并且每次去除文本第一个字符,一直到ebx=0, 但是,但是调试跟踪发现,它并不是进行len(bbdxf)-1次,而是循环到了不知干什么的地方….(这是最坑人的地方,没办法模拟这个加法的过程!)这个循环结束,将结果保存到eax中,然后hook地址处的代码,最终与 0xAFFCCFFB 进行比较得出结果。
BY笨笨D幸福

shuguang 发表于 2014-7-19 15:07

本帖最后由 shuguang 于 2014-7-19 18:17 编辑

这个爆破都不会,改了jmp也不行。不懂什么叫hook.只能改跳转地址了

44018723 发表于 2014-7-1 13:01

补充:
00401301   .68 73 30 40 0>ascii "hs0@",0                           ;YES! You found your serial!!
这句代码需要处理之后才能正常运行,所以如果不对代码进行正确的hook还是会出错的!但是整个程序找不到对这里进行hook的地方,所以无法进行修改!

augustine 发表于 2015-10-9 11:39

做一个内嵌补丁不就好了。只爆破,追码无视。
页: [1]
查看完整版本: [反汇编练习] 160个CrackMe之024