[反汇编练习] 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 18:17 编辑
这个爆破都不会,改了jmp也不行。不懂什么叫hook.只能改跳转地址了 补充:
00401301 .68 73 30 40 0>ascii "hs0@",0 ;YES! You found your serial!!
这句代码需要处理之后才能正常运行,所以如果不对代码进行正确的hook还是会出错的!但是整个程序找不到对这里进行hook的地方,所以无法进行修改! 做一个内嵌补丁不就好了。只爆破,追码无视。
页:
[1]