破解Boonz’s CreakMe
【作者】:riusksk(泉哥)
【主页】:http://riusksk.blogbus.com
【软件】:http://www.ccgcn.com/bbs/attachment.php?aid=431
【时间】:2009年8月27日星期四
【声明】:纯属技术学习,如有错误之处,烦请指出!
首先用OD载入,F9运行之,在用户名一框中(作者真懒,连用户名,密码之类的字样都懒得写上,只有两个文本框,上框用户名,下框密码)先填上1,看看是否是用户名长度限制,这只是个人习惯而已,至少总比在逆向分析的时候才知道好吧,呵呵……测试结果如下图1:
图1
由此可见,用户名长度必须在4—50之间。接着我用”riusksk”作为用户名,密码为”78787878”来分析一下。输入之后,点击check按钮,提示 "Hello, Mr. Badboy!"。我们“查找“->“所有参考文件字串”后,发现这个CM居然是用明码比较的,如下图2所示:
图2
单纯找出注册码这不是我们的目的,我们关注的应该是算法。双击提示字符串"Hello, Mr. Badboy!"来到下列地址:
00401000 >/$ 6A 00 PUSH 0 ; /pModule = NULL
00401002 |. E8 6D030000 CALL <JMP.&kernel32.GetModuleHandleA> ; GetModuleHandleA
00401007 |. A3 F0DC4000 MOV DWORD PTR DS:[40DCF0],EAX
0040100C |. 6A 00 PUSH 0 ; /lParam = NULL
0040100E |. 68 2B104000 PUSH keygenme.0040102B ; |DlgProc = keygenme.0040102B
00401013 |. 6A 00 PUSH 0 ; |hOwner = NULL
00401015 |. 68 E9030000 PUSH 3E9 ; |pTemplate = 3E9
0040101A |. FF35 F0DC4000 PUSH DWORD PTR DS:[40DCF0] ; |hInst = 00400000
00401020 |. E8 79030000 CALL <JMP.&user32.DialogBoxParamA> ; DialogBoxParamA
00401025 |. 50 PUSH EAX ; /ExitCode
00401026 . E8 43030000 CALL <JMP.&kernel32.ExitProcess> ; ExitProcess
0040102B /. 55 PUSH EBP
0040102C |. 8BEC MOV EBP,ESP
0040102E |. 817D 0C 10010>CMP DWORD PTR SS:[EBP+C],110
00401035 |. 75 7F JNZ SHORT keygenme.004010B6
00401037 |. 6A EC PUSH -14 ; /Index = GWL_EXSTYLE
00401039 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
0040103C |. E8 75030000 CALL <JMP.&user32.GetWindowLongA> ; GetWindowLongA
00401041 |. 0D 00000800 OR EAX,80000
00401046 |. 50 PUSH EAX ; /NewValue
00401047 |. 6A EC PUSH -14 ; |Index = GWL_EXSTYLE
00401049 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
0040104C |. E8 8F030000 CALL <JMP.&user32.SetWindowLongA> ; SetWindowLongA
00401051 |. 6A 03 PUSH 3 ; /Flags = SWP_NOSIZE|SWP_NOMOVE
00401053 |. 6A 00 PUSH 0 ; |Height = 0
00401055 |. 6A 00 PUSH 0