【文章标题】: 征途辅助工具箱的注册算法分析
【文章作者】: talaqi
【下载地址】: 天空软件站
【保护方式】: 序列号+注册码
【编写语言】: Borland Delphi 6.0 - 7.0
【使用工具】: PEID、OD
【操作平台】: WinXP
【软件介绍】: “征途辅助工具箱”是一款辅助玩征途游戏的工具箱
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
1、首先用Peid查壳,无壳,Borland Delphi 6.0 - 7.0编写。
2、用OD载入程序,找到关键字“请输入注册码”,来到这里:
  004E8B5E   |.  8D4D E8         lea ecx,dword ptr ss:[ebp-18]      ;  提示框(你的序列号是..)
  004E8B61   |.  BA 448D4E00     mov edx,gameTool.004E8D44
  004E8B66   |.  B8 508D4E00     mov eax,gameTool.004E8D50         ;  此处下断,F8 ←来到这里
  004E8B6B   |.  E8 24DBF4FF     call gameTool.00436694                ;  输入注册码
  004E8B70   |.  F6D8            neg al
  004E8B72   |.  1BC0            sbb eax,eax
  004E8B74   |.  85C0            test eax,eax                          ;  测试是否输入注册码
  004E8B76   |.  0F84 E1000000   je gameTool.004E8C5D                  ;  没有就跳走
  004E8B7C   |.  8D45 E0         lea eax,dword ptr ss:[ebp-20]
  004E8B7F   |.  50              push eax
  004E8B80   |.  B9 05000000     mov ecx,5                             ;  ECX赋初值5
  004E8B85   |.  33D2            xor edx,edx                           ;  EDX清零
  004E8B87   |.  8B83 10060000   mov eax,dword ptr ds:[ebx+610]        ;  序列号送EAX
  004E8B8D   |.  E8 D6BCF1FF     call gameTool.00404868                ;  取出序列号的前5位
  004E8B92   |.  6A 00           push 0
  004E8B94   |.  6A 02           push 2
  004E8B96   |.  8B45 E0         mov eax,dword ptr ss:[ebp-20]         ;  序列号前5位送EAX
  004E8B99   |.  E8 4605F2FF     call gameTool.004090E4                ;  转换成16进制形式
  004E8B9E   |.  E8 41C7F1FF     call gameTool.004052E4                ;  前5位的16进制*2,
                                                                       ;  记为a
004E8BA3   |.  8945 F0         mov dword ptr ss:[ebp-10],eax
  004E8BA6   |.  8955 F4         mov dword ptr ss:[ebp-C],edx
  004E8BA9   |.  8D45 E0         lea eax,dword ptr ss:[ebp-20]
  004E8BAC   |.  50              push eax
  004E8BAD   |.  8B83 10060000   mov eax,dword ptr ds:[ebx+610]        ;  序列号再送EAX
  004E8BB3   |.  E8 50BAF1FF     call gameTool.00404608
  004E8BB8   |.  8BC8            mov ecx,eax                           ;  序列号位数送ECX
  004E8BBA   |.  83E9 05         sub ecx,5                             ;  ECX-5
  004E8BBD   |.  BA 06000000     mov edx,6                             ;  EDX赋值为6
  004E8BC2   |.  8B83 10060000   mov eax,dword ptr ds:[ebx+610]        ;  序列号送回EAX
  004E8BC8   |.  E8 9BBCF1FF     call gameTool.00404868                ;  取序列号的后4位,
                                                                       ;  即ECX-5=4
  004E8BCD   |.  6A 00           push 0
  004E8BCF   |.  6A 03           push 3
  004E8BD1   |.  8B45 E0         mov eax,dword ptr ss:[ebp-20]         ;  序列号后4位送EAX
  004E8BD4   |.  E8 0B05F2FF     call gameTool.004090E4                ;  转换成16进制形式
  004E8BD9   |.  E8 06C7F1FF     call gameTool.004052E4                ;  后4位的16进制*3
                                                                       ;  记为b
004E8BDE   |.  0345 F0         add eax,dword ptr ss:[ebp-10]         ;  a+b,求和.记为c
  004E8BE1   |.  1355 F4         adc edx,dword ptr ss:[ebp-C]
  004E8BE4   |.  8945 F0         mov dword ptr ss:[ebp-10],eax
  004E8BE7   |.  8955 F4         mov dword ptr ss:[ebp-C],edx
  004E8BEA   |.  FF75 F4         push dword ptr ss:[ebp-C]
  004E8BED   |.  FF75 F0         push dword ptr ss:[ebp-10]
  004E8BF0   |.  8D45 E4         lea eax,dword ptr ss:[ebp-1C]
  004E8BF3   |.  E8 2804F2FF     call gameTool.00409020
  004E8BF8   |.  8B45 E4         mov eax,dword ptr ss:[ebp-1C]         ;  c的十进制送EAX
  004E8BFB   |.  8B55 E8         mov edx,dword ptr ss:[ebp-18]         ;  试炼码送EDX
  004E8BFE   |.  E8 51BBF1FF     call gameTool.00404754                ;  关键CALL,跟进
  004E8C03   |.  75 58           jnz short gameTool.004E8C5D           ;  不相等则跳向OVER
  (其余代码省略)
  
  跟进关键CALL来到这里:
  00404754   /$  53              push ebx
  00404755   |.  56              push esi
  00404756   |.  57              push edi
  00404757   |.  89C6            mov esi,eax                           ;  c的十进制送ESI
  00404759   |.  89D7            mov edi,edx                           ;  试炼码送EDI
  0040475B   |.  39D0            cmp eax,edx                           ;  c与试炼码进行比较
  0040475D   |.  0F84 8F000000   je gameTool.004047F2                  ;  相等则跳,必须跳,
                                                                       ;  跳到注册成功的地方
00404763   |.  85F6            test esi,esi
  (中间代码省略)
  004047F2   |>  5F              pop edi
  004047F3   |.  5E              pop esi
  004047F4   |.  5B              pop ebx
  004047F5   \.  C3              retn
-----------------------------------------------------------------------------------------
【经验总结】
  序列号前5位数的16进制*2+其余位数的16进制*3,求和。再转换为10进制数即为真正的注册码。

-----------------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!