-
-
HAPPYTOWN的KeyGenMe_04.exe分析(实属超级菜鸟文章)
-
发表于: 2007-2-3 22:31 4435
-
【文章标题】: HAPPYTOWN的KeyGenMe_04.exe分析
【文章作者】: mingren
【作者邮箱】: lirui_1004@sina.com
【作者主页】: www.3boys.cn
【软件名称】: KeyGenMe_04
【下载地址】: http://bbs.pediy.com/showthread.php?s=&threadid=33853
【编写语言】: Delphi
【使用工具】: OD
【操作平台】: XP
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
不知道有没有人写过这个软件算法的文章...呵呵
HAPPYTOWN的KeyGenMe_04.exe分析
用户名随便输入但是必须大于2位。注册码为10位的数字
【详细过程】
0045004C /. 55 push ebp 在此处按F4程序运行 输入用户名(必须大于2位)和注册码(必须是10位数字)
0045004D |. 8BEC mov ebp, esp
0045004F |. 83C4 DC add esp, -24
00450052 |. 33C9 xor ecx, ecx
00450054 |. 894D F8 mov dword ptr [ebp-8], ecx
00450057 |. 894D F4 mov dword ptr [ebp-C], ecx
0045005A |. 8955 E0 mov dword ptr [ebp-20], edx
0045005D |. 8945 FC mov dword ptr [ebp-4], eax
00450060 |. 33C0 xor eax, eax
00450062 |. 55 push ebp
00450063 |. 68 8D014500 push 0045018D
00450068 |. 64:FF30 push dword ptr fs:[eax]
0045006B |. 64:8920 mov dword ptr fs:[eax], esp
0045006E |. 8D55 F8 lea edx, dword ptr [ebp-8]
00450071 |. 8B45 FC mov eax, dword ptr [ebp-4]
00450074 |. 8B80 00030000 mov eax, dword ptr [eax+300]
0045007A |. E8 D9F2FDFF call 0042F358
0045007F |. 8B45 F8 mov eax, dword ptr [ebp-8] ; 把用户名传送到EAX
00450082 |. E8 4940FBFF call 004040D0 ; 计算用户名用长度
00450087 |. 8945 F0 mov dword ptr [ebp-10], eax ; 返回用户名的长度
0045008A |. 837D F0 02 cmp dword ptr [ebp-10], 2 ; 用2减去第一个操作数(用户名长度)
0045008E |. 0F8C DE000000 jl 00450172 ; 小于2就跳掉
00450094 |. 8D55 F4 lea edx, dword ptr [ebp-C] ;
00450097 |. 8B45 FC mov eax, dword ptr [ebp-4] ;
0045009A |. 8B80 08030000 mov eax, dword ptr [eax+308]
004500A0 |. E8 B3F2FDFF call 0042F358
004500A5 |. 8B45 F4 mov eax, dword ptr [ebp-C] ; 取注册码
004500A8 |. E8 2340FBFF call 004040D0 ; 计算注册码长度
004500AD |. 8945 EC mov dword ptr [ebp-14], eax ; 返回注册码长度
004500B0 |. 837D EC 0A cmp dword ptr [ebp-14], 0A ; 比较注册码长度,长度必须是10位
004500B4 |. 0F85 B8000000 jnz 00450172
004500BA |. 8B45 EC mov eax, dword ptr [ebp-14]
004500BD |. 85C0 test eax, eax
004500BF |. 7E 34 jle short 004500F5
004500C1 |. 8945 E4 mov dword ptr [ebp-1C], eax ; 送注册码长度
004500C4 |. C745 E8 01000>mov dword ptr [ebp-18], 1 ;
004500CB |> 8B45 F4 /mov eax, dword ptr [ebp-C]
004500CE |. 8B55 E8 |mov edx, dword ptr [ebp-18]
004500D1 |. 807C10 FF 30 |cmp byte ptr [eax+edx-1], 30 ; 比较注册码是否大于ACSII码 0
004500D6 |. 0F82 96000000 |jb 00450172
004500DC |. 8B45 F4 |mov eax, dword ptr [ebp-C]
004500DF |. 8B55 E8 |mov edx, dword ptr [ebp-18]
004500E2 |. 807C10 FF 39 |cmp byte ptr [eax+edx-1], 39 ; 比较注册码ASCII码是否小于 9
004500E7 |. 0F87 85000000 |ja 00450172
004500ED |. FF45 E8 |inc dword ptr [ebp-18] ; 堆栈数据加1 到第二位
004500F0 |. FF4D E4 |dec dword ptr [ebp-1C] ; 堆栈数据减1
004500F3 |.^ 75 D6 \jnz short 004500CB ; 循环比较注册码大小
004500F5 |> 8B45 F4 mov eax, dword ptr [ebp-C] ; 把注册码传送到EAX
004500F8 |. 0FB600 movzx eax, byte ptr [eax] ; 取第0位
004500FB |. 8B55 F4 mov edx, dword ptr [ebp-C]
004500FE |. 0FB652 05 movzx edx, byte ptr [edx+5] ; 取第5位
00450102 |. 03C2 add eax, edx ; 相加
00450104 |. 83F8 6D cmp eax, 6D ; ACSII等于6D就过
00450107 |. 75 69 jnz short 00450172
00450109 |. 8B45 F4 mov eax, dword ptr [ebp-C]
0045010C |. 0FB640 01 movzx eax, byte ptr [eax+1]
00450110 |. 8B55 F4 mov edx, dword ptr [ebp-C]
00450113 |. 0FB652 06 movzx edx, byte ptr [edx+6]
00450117 |. 03C2 add eax, edx
00450119 |. 83F8 67 cmp eax, 67 ; 取第一位和第六位ASCII相加等于67就过
0045011C |. 75 54 jnz short 00450172
0045011E |. 8B45 F4 mov eax, dword ptr [ebp-C]
00450121 |. 0FB640 02 movzx eax, byte ptr [eax+2]
00450125 |. 8B55 F4 mov edx, dword ptr [ebp-C]
00450128 |. 0FB652 07 movzx edx, byte ptr [edx+7]
0045012C |. 03C2 add eax, edx
0045012E |. 83F8 69 cmp eax, 69 ; 取第二位和第七位ASCII相加等于69就过
00450131 |. 75 3F jnz short 00450172
00450133 |. 8B45 F4 mov eax, dword ptr [ebp-C]
00450136 |. 0FB640 03 movzx eax, byte ptr [eax+3]
0045013A |. 8B55 F4 mov edx, dword ptr [ebp-C]
0045013D |. 0FB652 08 movzx edx, byte ptr [edx+8]
00450141 |. 03C2 add eax, edx
00450143 |. 83F8 70 cmp eax, 70 ; 取第三位和第八位ASCII相加等于70就过
00450146 |. 75 2A jnz short 00450172
00450148 |. 8B45 F4 mov eax, dword ptr [ebp-C]
0045014B |. 0FB640 04 movzx eax, byte ptr [eax+4]
0045014F |. 8B55 F4 mov edx, dword ptr [ebp-C]
00450152 |. 0FB652 09 movzx edx, byte ptr [edx+9]
00450156 |. F7EA imul edx ; 取第四位和第九位相乘
00450158 |. 3D 8C0A0000 cmp eax, 0A8C ; EDX和EAX相乘等于A8C就通过
0045015D |. 75 13 jnz short 00450172
0045015F |. 6A 40 push 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00450161 |. 68 98014500 push 00450198 ; |Title = "Congratulations"
00450166 |. 68 A8014500 push 004501A8 ; |Text = "Good job,man!"
0045016B |. 6A 00 push 0 ; |hOwner = NULL
0045016D |. E8 2E63FBFF call <jmp.&user32.MessageBoxA> ; \MessageBoxA
00450172 |> 33C0 xor eax, eax
00450174 |. 5A pop edx
--------------------------------------------------------------------------------
【经验总结】
从来没有算出过注册码,这是第一次。很多汇编语句看不懂。。试着看OD寄存器里面EAX和EDX的值才慢慢理解这条语句的含
义。加注释的地方希望高手看看有没有错误。。。不要误人子弟就好了。。还有就是希望高手门在分析算法的过程中,能把
注释加的详细点,关键语句是干什么的希望能标出来。因为象我等这样的菜鸟很多破解的算法看不懂。
注册算法,C语言不好,随机生成10位能用的注册码现在还不知道怎么写。。。我这里有一串自己算出来能用的注册码 9777240296
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2007年02月03日 下午 09:52:01
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- [求助]求教大神关于wifi握手包的问题 4905
- [求助]网络验证如何突破啊!! 4836
- [求助]关于一个网络验证的破解!! 4872
- [求助]关于一个PHP教程的破解! 望高手指点一下 4251