本帖最后由 Blackk 于 2011-4-16 21:26 编辑
【破文标题】bs#2kgenme 分析
【破文作者】Blackk
【破解工具】OD,PEID,LordPE,IEC
【破解平台】XP SP3
------------------------------------------------------------------------
【破解过程】
用PEID查壳:FSG 2.0 -> bart/xt
脱壳就不多说了,懒得浪费时间咯(脱壳文件已经打包在一起了)...
//OD载入脱壳后的CM00456BC0 > $ 55 push ebp
00456BC1 . 8BEC mov ebp, esp
00456BC3 . 83C4 F0 add esp, -10
00456BC6 . B8 D8694500 mov eax, 004569D8
00456BCB . E8 A0F0FAFF call 00405C70
00456BD0 . 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00456BD2 . 68 186C4500 push 00456C18 ; |Title = "Nag for you"
00456BD7 . 68 246C4500 push 00456C24 ; |Text = "Hi, cracker!",LF,"Wellcome.. Just find out where the serial is checking,",LF,"and make a keygen. It's a good idea to write a solution and share it.",LF,"Be careful! There is a lot of bugs.."
00456BDC . 6A 00 push 0 ; |hOwner = NULL
00456BDE . E8 25FAFAFF call <jmp.&user32.MessageBoxA> ; \MessageBoxA
去NAG.........,这个方法太多啦,随便您怎么弄,我就不占空间啦.....
用OD搜索字符串插件,可以找到关键信息,双击:you're great,man! 向上找到入口点,F20045645C /. 55 push ebp
0045645D |. 8BEC mov ebp, esp
0045645F |. 83C4 F8 add esp, -8
00456462 |. 33C0 xor eax, eax
运行程序,输入用户名和假码,按下Register,程序假死,但是一直到程序正常运行我们的断点都没有断下.....
在命令行输入:bp Sleep, 回到程序领空, 向上找到代码入口: 00456660 /. 55 push ebp
00456661 |. 8BEC mov ebp, esp
00456663 |. 33C9 xor ecx, ecx
00456665 |. 51 push ecx
00456666 |. 51 push ecx
下好断点,按下Register,断点生效,单步向下走:004566BE |. E8 A5F9FAFF call <jmp.&kernel32.lstrlen> ; \lstrlenA
004566C3 |. 83F8 08 cmp eax, 8 ; 比较用户名是否为8位
004566E3 |. E8 80F9FAFF call <jmp.&kernel32.lstrlen> ; \lstrlenA
004566E8 |. 83F8 08 cmp eax, 8 ; 比较注册码是否为8位
从这里我们知道用户名和注册码都应该为8位,重新输入:
用户名:MeBlackk 假码: 12345678
按Register,稍等,我们就看到程序断在了验证的入口: 0045645C /. 55 push ebp
0045645D |. 8BEC mov ebp, esp
0045645F |. 83C4 F8 add esp, -8
00456462 |. 33C0 xor eax, eax
00456464 |. 33D2 xor edx, edx
单步走,看算法:
0045646C |. 8B05 0C9C4500 mov eax, dword ptr [459C0C] ; 用户名的前4位放入EAX
00456472 |. 8B1D 109C4500 mov ebx, dword ptr [459C10] ; 用户名的后4位放入EBX
00456478 |. 31D8 xor eax, ebx ; EAX=EAX XOR EBX
0045647A |. 0D 0FF0F00F or eax, 0FF0F00F ; EAX=EAX OR 0FF0F00F
0045647F |. 01D8 add eax, ebx ; EAX=EAX+EBX
00456481 |. 8945 FC mov dword ptr [ebp-4], eax ; EAX放入EBP-4中
00456484 |. 8B05 189C4500 mov eax, dword ptr [459C18] ; 注册码的前4位放入EAX
0045648A |. 8B1D 1C9C4500 mov ebx, dword ptr [459C1C] ; 注册码的后4位放入EBX
00456490 |. 01D8 add eax, ebx ; EAX=EAX+EBX
00456492 |. C1C8 09 ror eax, 9 ; 右循环移位指令
00456495 |. 31D8 xor eax, ebx ; EAX=EAX XOR EBX
00456497 |. C1E8 02 shr eax, 2 ; EAX逻辑右移2位
0045649A |. 35 ADDE0FFF xor eax, FF0FDEAD ; EAX=EAX XOR FF0FDEAD
0045649F |. 8945 F8 mov dword ptr [ebp-8], eax ; EAX放入EBP-8
004564A2 |. 0345 FC add eax, dword ptr [ebp-4] ; EAX=EAX+EBP-4
004564A5 |. 2D 32C44C0C sub eax, 0C4CC432 ; EAX=EAX-0C4CC432
//注册判断
004564AB |. 3D 4C4C494B cmp eax, 4B494C4C ; EAX和4B494C4C比较.
004564B0 |. 75 2D jnz short 004564DF ; 不相等就Over....
修改标志位我们继续向下走 004564BA |. E8 99FBFAFF call <jmp.&kernel32.lstrcmpW> ; 字符串比较
004564BF |. 85C0 test eax, eax
004564C1 |. 75 15 jnz short 004564D8 ; 判断用户名的计算结果和注册码的计算结果是否相等....
依然修改标志位,向下走...
开心把,奇迹马上就要诞生了,真的.....奇迹发生了..004564C3 |. 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
004564C5 |. 68 F0644500 push 004564F0 ; |you're great, man!
004564CA |. 68 04654500 push 00456504 ; |good work!
004564CF |. 6A 00 push 0 ; |hOwner = NULL
004564D1 |. E8 3201FBFF call <jmp.&user32.MessageBoxA> ; \MessageBoxA
这里明明有一个MessageBoxA,但是我们却并没有看到Box....经过分析我找到了关键点:
Ctrl+G:输入00457DD0,来到了这里:00457DD0 58 pop eax
00457DD1 83C4 10 add esp, 10
00457DD4 50 push eax
00457DD5 C3 retn
把这段修改为:00457DD0 8BFF mov edi, edi
00457DD1 55 push ebp
00457DD4 8BEC mov ebp, esp
00457DD5 833D 1C04D777>cmp dword ptr [77D7041C], 0
保存修改后的代码,这样就可以进行爆破了...
------------------------------------------------------------------------
【破解总结】
1.算法看起来不是很难,但是想逆推出正确的注册码还是有一定的难度,像我这种菜鸟只能爆破...所以还请大牛指教怎样逆推注册码....
2.此CM最大的亮点就是MessageBoxA的代码修改,我这也是第一次遇到这样的CM,又给我开拓了知识啊...…………^^
------------------------------------------------------------------------
【版权声明】
额,这个...转载请保持文章的完整性,顺便说下出处吧^^...
分析有错误,请大牛指出
CM下载:
CM.rar
(536.05 KB, 下载次数: 5)
|