首页
社区
课程
招聘
HAPPYTOWN的KeyGenMe_04.exe分析(实属超级菜鸟文章)
发表于: 2007-2-3 22:31 4435

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期)

收藏
免费 7
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//