总的来说,这次破解的难度不大,时间也要的不长,如果说吧学习收集资料的过程都算上的话,也不会超过5hours。说得直接点就是,不会比pediy的大牛们出的"题目难"。
三天前的下午4点左右,也就是12/23/2009,一个同事发给我一个关于破解的文章,我粗略的看了下,就理清楚了其破解的思路。
虽然我看懂了,但我却没有真正实实在在的进行过软件的破解.由于也接触过一些相关的知识,也想看下自己这些年有没有对实际挑战的能力,就进行了一次尝试性的破解工作.(heihei,提前透露下:我成功了!)
工欲善其事,必先利其器!不需要有太多的想法,首先要决定的就是用那个调试器(debugger).对于高手们来说,可能还会想下用那个debugger会更快一些,但对我来说就不存在着个问题了(苦涩的笑笑),拿出不知道什么时候收藏的ollydbg1.10汉化版.
而后又到http://www.ollydbg.de上下载最新的ollydbg2.02,这时候可能就有人要问我了,你不都有了1.10的汉化版,又跑去下载2.02的英文版做什么?
我在这里解答下:那是因为我压根就没有打算用1.10来对AVIjoiner进行破解,原因有二,我希望我的工具尽可能的犀利.另一个原因是,虽然我不在意中文版还是英文版,但我还是会先用下中文版,以求对整个软件有个个基本的认识(好久没用,都忘了).
在粗略的跑了跑1.10,对软件的基本操作有个大概的了解后,我就启动了ollydbg2.02来对AVIjoiner的破解.
step 1:
在注册的窗口中随意的输入username和registration code,如
username: numax
registration code: 123456
在经过四五次的组合后,我得出了一个最基本的结论:
1: username的长度必须>=2
2: registration code的长度必须>=8
呵呵,至此,就可以开始正式的调试破解了.
step 2:
在step 1中,我们可以看到有这样类似的错误:
Please input correct User Name
或者
Please input correct Registration Code! 搜寻类似的字符,并在此处这两处下了断点再说.(笨法子,没什么经验也不想动脑筋.比这更让我无奈的是,就算我动脑筋,我也想不出什么更好的法子来.)
好了,在ollydbg中加载AVIjoiner后,
在username中输入:numax,
在registration code输入:12345678 代码分析:
CPU Disasm
Address Hex dump Command Comments 00405C70 /. 83EC 0C SUB ESP,0C
00405C73 |. 55 PUSH EBP
00405C74 |. 56 PUSH ESI
00405C75 |. 57 PUSH EDI
00405C76 |. BF 01000000 MOV EDI,1
00405C7B |. 57 PUSH EDI ; /Arg1 => 1
00405C7C |. 8BF1 MOV ESI,ECX ; |
00405C7E |. E8 04A00100 CALL 0041FC87 ; \AVIJoiner.0041FC87
00405C83 |. 8B46 70 MOV EAX,DWORD PTR DS:[ESI+70]
00405C86 |. 8B68 F4 MOV EBP,DWORD PTR DS:[EAX-0C]
00405C89 |. 83FD 02 CMP EBP,2
00405C8C |. 7D 15 JGE SHORT 00405CA3
00405C8E |. 6A 00 PUSH 0 ; /Arg3 = 0
00405C90 |. 6A 00 PUSH 0 ; |Arg2 = 0
00405C92 |. 68 E4D24200 PUSH OFFSET AVIJoiner.0042D2E4 ; |Arg1 = ASCII "Please input correct User Name!"
00405C97 |. E8 B4FD0100 CALL 00425A50 ; \AVIJoiner.00425A50
00405C9C |. 5F POP EDI
00405C9D |. 5E POP ESI
00405C9E |. 5D POP EBP
00405C9F |. 83C4 0C ADD ESP,0C
00405CA2 |. C3 RETN
00405CA3 |> 8B4E 74 MOV ECX,DWORD PTR DS:[ESI+74]
00405CA6 |. 8379 F4 08 CMP DWORD PTR DS:[ECX-0C],8
00405CAA |. 7D 15 JGE SHORT 00405CC1
00405CAC |. 6A 00 PUSH 0 ; /Arg3 = 0
00405CAE |. 6A 00 PUSH 0 ; |Arg2 = 0
00405CB0 |. 68 BCD24200 PUSH OFFSET AVIJoiner.0042D2BC ; |Arg1 = ASCII "Please input correct Registration Code!"
00405CB5 |. E8 96FD0100 CALL 00425A50 ; \AVIJoiner.00425A50
00405CBA |. 5F POP EDI
00405CBB |. 5E POP ESI
00405CBC |. 5D POP EBP
00405CBD |. 83C4 0C ADD ESP,0C
00405CC0 |. C3 RETN
00405CC1 |> 8B46 70 MOV EAX,DWORD PTR DS:[ESI+70] ; ASCII "numax"
00405CC4 |. 8B48 F4 MOV ECX,DWORD PTR DS:[EAX-0C] ; numax: [eax-0c],the length of username
00405CC7 |. 85C9 TEST ECX,ECX ; numax: check the length of username
00405CC9 |. 7D 0A JGE SHORT 00405CD5
00405CCB |. 68 57000780 PUSH 80070057
00405CD0 |. E8 5BB7FFFF CALL 00401430
00405CD5 |> 8A10 MOV DL,BYTE PTR DS:[EAX] ; numax: first character 'n'
00405CD7 |. 8B46 70 MOV EAX,DWORD PTR DS:[ESI+70]
00405CDA |. 3978 F4 CMP DWORD PTR DS:[EAX-0C],EDI
00405CDD |. 7D 0A JGE SHORT 00405CE9
00405CDF |. 68 57000780 PUSH 80070057
00405CE4 |. E8 47B7FFFF CALL 00401430
00405CE9 |> 8A40 01 MOV AL,BYTE PTR DS:[EAX+1] ; numax: second character 'u'
00405CEC |. 884424 0E MOV BYTE PTR SS:[ESP+0E],AL
00405CF0 |. 8B46 70 MOV EAX,DWORD PTR DS:[ESI+70]
00405CF3 |. 8B48 F4 MOV ECX,DWORD PTR DS:[EAX-0C]
00405CF6 |. 85C9 TEST ECX,ECX
00405CF8 |. 7D 0A JGE SHORT 00405D04
00405CFA |. 68 57000780 PUSH 80070057
00405CFF |. E8 2CB7FFFF CALL 00401430
00405D04 |> 8B4E 70 MOV ECX,DWORD PTR DS:[ESI+70]
00405D07 |. 53 PUSH EBX
00405D08 |. 8A18 MOV BL,BYTE PTR DS:[EAX]
00405D0A |. 3979 F4 CMP DWORD PTR DS:[ECX-0C],EDI
00405D0D |. 7D 0A JGE SHORT 00405D19
00405D0F |. 68 57000780 PUSH 80070057
00405D14 |. E8 17B7FFFF CALL 00401430
00405D19 |> 0FB6C2 MOVZX EAX,DL ; numax: start address, simple calculating related to username
00405D1C |. 83C8 41 OR EAX,00000041
00405D1F |. 99 CDQ
00405D20 |. BF 0A000000 MOV EDI,0A
00405D25 |. F7FF IDIV EDI
00405D27 |. 0FB64424 12 MOVZX EAX,BYTE PTR SS:[ESP+12]
00405D2C |. 83C8 56 OR EAX,00000056
00405D2F |. 885424 16 MOV BYTE PTR SS:[ESP+16],DL
00405D33 |. 99 CDQ
00405D34 |. F7FF IDIV EDI
00405D36 |. 0FB6C3 MOVZX EAX,BL
00405D39 |. 83C8 49 OR EAX,00000049
00405D3C |. 885424 12 MOV BYTE PTR SS:[ESP+12],DL
00405D40 |. 99 CDQ
00405D41 |. F7FF IDIV EDI
00405D43 |. 0FB641 01 MOVZX EAX,BYTE PTR DS:[ECX+1]
00405D47 |. 83C8 4A OR EAX,0000004A
00405D4A |. 8BCF MOV ECX,EDI
00405D4C |. 885424 17 MOV BYTE PTR SS:[ESP+17],DL
00405D50 |. 99 CDQ
00405D51 |. F7F9 IDIV ECX
00405D53 |. 33C0 XOR EAX,EAX
00405D55 |. 33C9 XOR ECX,ECX
00405D57 |. 85ED TEST EBP,EBP
00405D59 |. 885424 18 MOV BYTE PTR SS:[ESP+18],DL
00405D5D |. 7E 20 JLE SHORT 00405D7F
00405D5F |. 90 NOP
00405D60 |> 85C9 /TEST ECX,ECX
00405D62 |. 0F8C D2000000 |JL 00405E3A
00405D68 |. 8B7E 70 |MOV EDI,DWORD PTR DS:[ESI+70]
00405D6B |. 3B4F F4 |CMP ECX,DWORD PTR DS:[EDI-0C]
00405D6E |. 0F8F C6000000 |JG 00405E3A
00405D74 |. 0FB6140F |MOVZX EDX,BYTE PTR DS:[ECX+EDI]
00405D78 |. 03C2 |ADD EAX,EDX
00405D7A |. 41 |INC ECX
00405D7B |. 3BCD |CMP ECX,EBP
00405D7D |.^ 7C E1 \JL SHORT 00405D60
00405D7F |> 8B4E 74 MOV ECX,DWORD PTR DS:[ESI+74]
00405D82 |. 8B51 F4 MOV EDX,DWORD PTR DS:[ECX-0C]
00405D85 |. 85D2 TEST EDX,EDX ; numax: end address, simple calculating related to username
00405D87 |. 7D 0A JGE SHORT 00405D93
00405D89 |. 68 57000780 PUSH 80070057
00405D8E |. E8 9DB6FFFF CALL 00401430
00405D93 |> 8A11 MOV DL,BYTE PTR DS:[ECX] ; numax: end address, simple calculating related to regcode
00405D95 |. 8B4E 74 MOV ECX,DWORD PTR DS:[ESI+74]
00405D98 |. 8379 F4 01 CMP DWORD PTR DS:[ECX-0C],1
00405D9C |. 885424 19 MOV BYTE PTR SS:[ESP+19],DL
00405DA0 |. 7D 0A JGE SHORT 00405DAC
00405DA2 |. 68 57000780 PUSH 80070057
00405DA7 |. E8 84B6FFFF CALL 00401430
00405DAC |> 8A49 01 MOV CL,BYTE PTR DS:[ECX+1]
00405DAF |. 8B7E 74 MOV EDI,DWORD PTR DS:[ESI+74]
00405DB2 |. 884C24 13 MOV BYTE PTR SS:[ESP+13],CL
00405DB6 |. 837F F4 02 CMP DWORD PTR DS:[EDI-0C],2
00405DBA |. 7D 0A JGE SHORT 00405DC6
00405DBC |. 68 57000780 PUSH 80070057
00405DC1 |. E8 6AB6FFFF CALL 00401430
00405DC6 |> 8A4F 02 MOV CL,BYTE PTR DS:[EDI+2]
00405DC9 |. 8B7E 74 MOV EDI,DWORD PTR DS:[ESI+74]
00405DCC |. 884C24 14 MOV BYTE PTR SS:[ESP+14],CL
00405DD0 |. 837F F4 03 CMP DWORD PTR DS:[EDI-0C],3
00405DD4 |. 7D 0A JGE SHORT 00405DE0
00405DD6 |. 68 57000780 PUSH 80070057
00405DDB |. E8 50B6FFFF CALL 00401430
00405DE0 |> 8A4F 03 MOV CL,BYTE PTR DS:[EDI+3]
00405DE3 |. 8B7E 74 MOV EDI,DWORD PTR DS:[ESI+74]
00405DE6 |. 884C24 15 MOV BYTE PTR SS:[ESP+15],CL
00405DEA |. 837F F4 04 CMP DWORD PTR DS:[EDI-0C],4
00405DEE |. 7D 0A JGE SHORT 00405DFA
00405DF0 |. 68 57000780 PUSH 80070057
00405DF5 |. E8 36B6FFFF CALL 00401430
00405DFA |> 8A4F 04 MOV CL,BYTE PTR DS:[EDI+4]
00405DFD |. 8B7E 74 MOV EDI,DWORD PTR DS:[ESI+74]
00405E00 |. 837F F4 05 CMP DWORD PTR DS:[EDI-0C],5
00405E04 |. 7D 0A JGE SHORT 00405E10
00405E06 |. 68 57000780 PUSH 80070057
00405E0B |. E8 20B6FFFF CALL 00401430
00405E10 |> 8A5F 05 MOV BL,BYTE PTR DS:[EDI+5]
00405E13 |. 8B7E 74 MOV EDI,DWORD PTR DS:[ESI+74]
00405E16 |. 885C24 1A MOV BYTE PTR SS:[ESP+1A],BL
00405E1A |. 837F F4 06 CMP DWORD PTR DS:[EDI-0C],6
00405E1E |. 7D 0A JGE SHORT 00405E2A
00405E20 |. 68 57000780 PUSH 80070057
00405E25 |. E8 06B6FFFF CALL 00401430
00405E2A |> 8A5F 06 MOV BL,BYTE PTR DS:[EDI+6]
00405E2D |. 8B7E 74 MOV EDI,DWORD PTR DS:[ESI+74]
00405E30 |. 885C24 1B MOV BYTE PTR SS:[ESP+1B],BL
00405E34 |. 837F F4 07 CMP DWORD PTR DS:[EDI-0C],7
00405E38 |. 7D 0A JGE SHORT 00405E44 ; numax: end address, simple calculating related to regcode
00405E3A |> 68 57000780 PUSH 80070057
00405E3F |. E8 ECB5FFFF CALL 00401430
00405E44 |> 8A5F 07 MOV BL,BYTE PTR DS:[EDI+7] ; numax: start address, checking regcode and username
00405E47 |. 0FB67C24 16 MOVZX EDI,BYTE PTR SS:[ESP+16]
00405E4C |. 0FB6D2 MOVZX EDX,DL
00405E4F |. 83EA 30 SUB EDX,30
00405E52 |. 3BFA CMP EDI,EDX ; edi, regcode first character
00405E54 |. 75 48 JNE SHORT 00405E9E
00405E56 |. 0FB65424 13 MOVZX EDX,BYTE PTR SS:[ESP+13]
00405E5B |. 0FB67C24 12 MOVZX EDI,BYTE PTR SS:[ESP+12]
00405E60 |. 83EA 30 SUB EDX,30
00405E63 |. 3BFA CMP EDI,EDX ; edi, regcode second character
00405E65 |. 75 37 JNE SHORT 00405E9E
00405E67 |. 0FB65424 14 MOVZX EDX,BYTE PTR SS:[ESP+14]
00405E6C |. 0FB67C24 17 MOVZX EDI,BYTE PTR SS:[ESP+17]
00405E71 |. 83EA 30 SUB EDX,30
00405E74 |. 3BFA CMP EDI,EDX ; edi, regcode third character
00405E76 |. 75 26 JNE SHORT 00405E9E
00405E78 |. 0FB65424 15 MOVZX EDX,BYTE PTR SS:[ESP+15]
00405E7D |. 0FB67C24 18 MOVZX EDI,BYTE PTR SS:[ESP+18]
00405E82 |. 83EA 30 SUB EDX,30
00405E85 |. 3BFA CMP EDI,EDX ; edi, regcode fourth character
00405E87 |. 75 15 JNE SHORT 00405E9E
00405E89 |. 99 CDQ
00405E8A |. BF 0A000000 MOV EDI,0A
00405E8F |. F7FF IDIV EDI
00405E91 |. 0FB6C2 MOVZX EAX,DL
00405E94 |. 0FB6D1 MOVZX EDX,CL
00405E97 |. 83EA 30 SUB EDX,30 ; edx, regcode fifth character
00405E9A |. 3BC2 CMP EAX,EDX ; numax: end address, checking regcode and username
00405E9C |. 74 38 JE SHORT 00405ED6
00405E9E |> 807C24 19 39 CMP BYTE PTR SS:[ESP+19],39 ; numax: built-in regcode: "93023147"
00405EA3 |. 0F85 83000000 JNE 00405F2C
00405EA9 |. 807C24 13 33 CMP BYTE PTR SS:[ESP+13],33
00405EAE |. 75 7C JNE SHORT 00405F2C
00405EB0 |. 807C24 14 30 CMP BYTE PTR SS:[ESP+14],30
00405EB5 |. 75 75 JNE SHORT 00405F2C
00405EB7 |. 807C24 15 32 CMP BYTE PTR SS:[ESP+15],32
00405EBC |. 75 6E JNE SHORT 00405F2C
00405EBE |. 80F9 33 CMP CL,33
00405EC1 |. 75 69 JNE SHORT 00405F2C
00405EC3 |. 807C24 1A 31 CMP BYTE PTR SS:[ESP+1A],31
00405EC8 |. 75 62 JNE SHORT 00405F2C
00405ECA |. 807C24 1B 34 CMP BYTE PTR SS:[ESP+1B],34
00405ECF |. 75 5B JNE SHORT 00405F2C
00405ED1 |. 80FB 37 CMP BL,37 ;
00405ED4 |. 75 56 JNE SHORT 00405F2C
00405ED6 |> 6A 00 PUSH 0 ; /Arg3 = 0
00405ED8 |. 6A 00 PUSH 0 ; |Arg2 = 0
00405EDA |. 68 A0D24200 PUSH OFFSET AVIJoiner.0042D2A0 ; |Arg1 = ASCII "Registration has succeeded!"
00405EDF |. E8 6CFB0100 CALL 00425A50 ; \AVIJoiner.00425A50
00405EE4 |. 8B7E 70 MOV EDI,DWORD PTR DS:[ESI+70]
00405EE7 |. E8 49210200 CALL 00428035 ; [AVIJoiner.00428035
00405EEC |. 8B40 04 MOV EAX,DWORD PTR DS:[EAX+4]
00405EEF |. 57 PUSH EDI ; /Arg3
00405EF0 |. 68 2CCF4200 PUSH OFFSET AVIJoiner.0042CF2C ; |Arg2 = ASCII "username"
00405EF5 |. 68 24CF4200 PUSH OFFSET AVIJoiner.0042CF24 ; |Arg1 = ASCII "Option"
00405EFA |. 8BC8 MOV ECX,EAX ; |
00405EFC |. E8 8FFC0100 CALL 00425B90 ; \AVIJoiner.00425B90
00405F01 |. 8B7E 74 MOV EDI,DWORD PTR DS:[ESI+74]
00405F04 |. E8 2C210200 CALL 00428035 ; [AVIJoiner.00428035
00405F09 |. 8B40 04 MOV EAX,DWORD PTR DS:[EAX+4]
00405F0C |. 57 PUSH EDI ; /Arg3
00405F0D |. 68 10CF4200 PUSH OFFSET AVIJoiner.0042CF10 ; |Arg2 = ASCII "registration_code"
00405F12 |. 68 24CF4200 PUSH OFFSET AVIJoiner.0042CF24 ; |Arg1 = ASCII "Option"
00405F17 |. 8BC8 MOV ECX,EAX ; |
00405F19 |. E8 72FC0100 CALL 00425B90 ; \AVIJoiner.00425B90
00405F1E |. 5B POP EBX
00405F1F |. 5F POP EDI
00405F20 |. 8BCE MOV ECX,ESI
00405F22 |. 5E POP ESI
00405F23 |. 5D POP EBP
00405F24 |. 83C4 0C ADD ESP,0C
00405F27 |. E9 53870100 JMP 0041E67F
00405F2C |> 6A 00 PUSH 0 ; /Arg3 = 0
00405F2E |. 6A 00 PUSH 0 ; |Arg2 = 0
00405F30 |. 68 88D24200 PUSH OFFSET AVIJoiner.0042D288 ; |Arg1 = ASCII "Registration failed!"
00405F35 |. E8 16FB0100 CALL 00425A50 ; \AVIJoiner.00425A50
00405F3A |. 5B POP EBX
00405F3B |. 5F POP EDI
00405F3C |. 5E POP ESI
00405F3D |. 5D POP EBP
00405F3E |. 83C4 0C ADD ESP,0C
00405F41 \. C3 RETN
我简单的用文字描述下这段代码的意思,并按照功能不同将其分为以下几个部分:
1: 简单检查username,registration code,
* 如果username的长度小于2,将提示:Please input correct User Name
* 如果registration code的长度小于8将提示:Please input correct Registration Code
2: 基于username进行计算,代码中我用
numax: start address, simple calculating related to username
numax: end address, simple calculating related to username
进行了明确的标明.
仔细阅读下这段代码,我发现大多都是进行除10取余的计算,并保存余数.在该段的结束部分,由计算了username字串ascii的码的总和.
3: 基于registration进行计算,代码中我用
numax: start address, simple calculating related to regcode
numax: end address, simple calculating related to regcode
进行了明确的标明.
个人认为,这段基本上就是废码,将以个个字符存入栈后在比较registration code的长度。客观地来说,十分类似花指令.
4: 基于第二段所得的余数及username字串ascii的码的和,与registration code 进行比较.共五伦,如果都相等,认为username与registration code有效.
5:注册成功或失败的提示框.
step 3:
获得注册码.
对于想研究算法的人来说呢,可以粗略的看下step 2种提到的代码的第2部分:“基于username进行计算",但对于破解的人来说嘛,呵呵,只要找到,step 2种提到的第4部分就好了.
这次成功的破解对我来说可是意义重大,以前所学虽然没有得到全面的认证,但却至少也从一点反应出我曾经的努力并没有白费.
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!