【破文标题】菜鸟破解之三“定时播映系统的注册算法分析”
【破文作者】紫色缘[TFW][PCG]
【作者邮箱】Cn_Fish@126.com
【作者主页】www.cniso.org
【破解工具】OD/peid
【破解平台】Win9x/NT/2000/XP
【软件名称】****播放系统
【软件大小】2MB
【原版下载】不提供~
【保护方式】无
【软件简介】功能不错的一个播放系统
------------------------------------------------------------------------
【破解过程】
第一先启动主程序,在输入假码后出现错误提示框。
再使用Peid查壳后,发现是Borland Delphi 6.0 - 7.0语言编写,于是用OD载入查找到字符:
超级字串参考+        , 条目 835
 地址=00500E39
 反汇编=push    00500FAC
 文本字串=错误 86599
双击后来到500E39代码处,想分析一下注册的算法过程,即向上找到事件触发点~~ 

--------------------代码如下-----------------------

00500C62   .  55              push    ebp                            ;  在此下断,F8继续
00500C63   .  68 B10E5000     push    00500EB1
00500C68   .  64:FF30         push    dword ptr fs:[eax]
00500C6B   .  64:8920         mov     fs:[eax], esp
00500C6E   .  A1 34A35100     mov     eax, [51A334]                  ;  [51A334]送入EAX
00500C73   .  C700 8B140000   mov     dword ptr [eax], 148B          ;  148B送入[EAX]
00500C79   .  C740 04 0000000>mov     dword ptr [eax+4], 0
00500C80   .  A1 5CA05100     mov     eax, [51A05C]                  ;  [51A05C]送入EAX
00500C85   .  8B00            mov     eax, [eax]                     ;  [EAX]送入EAX
00500C87   .  8B80 A4030000   mov     eax, [eax+3A4]
00500C8D   .  66:BE EBFF      mov     si, 0FFEB                      ;  SI=FFEB
00500C91   .  E8 8633F0FF     call    0040401C                       ;  关键call,跟进
00500C96   .  8D55 F8         lea     edx, [ebp-8]
00500C99   .  8B45 FC         mov     eax, [ebp-4]
00500C9C   .  8B80 00030000   mov     eax, [eax+300]
00500CA2   .  E8 3159F5FF     call    004565D8                       ;  读取假码位数
00500CA7   .  8B45 F8         mov     eax, [ebp-8]                   ;  假码位数送入EAX
00500CAA   .  BA 140F5000     mov     edx, 00500F14                  ;  999999999999
00500CAF   .  E8 5843F0FF     call    0040500C                       ;  EAX与EDX做比较
00500CB4   .  0F83 B6010000   jnb     00500E70                       ;  大于则跳
00500CBA   .  8D55 F4         lea     edx, [ebp-C]
00500CBD   .  8B45 FC         mov     eax, [ebp-4]
00500CC0   .  8B80 00030000   mov     eax, [eax+300]
00500CC6   .  E8 0D59F5FF     call    004565D8                       ;  读取假码位数
00500CCB   .  8B45 F4         mov     eax, [ebp-C]                   ;  假码位数送入EAX
00500CCE   .  BA 2C0F5000     mov     edx, 00500F2C                  ;  0000000000
00500CD3   .  E8 3443F0FF     call    0040500C                       ;  EAX与EDX做比较
00500CD8   .  0F86 92010000   jbe     00500E70                       ;  小于或等于则跳转到注册码不正确
00500CDE   .  8D55 F0         lea     edx, [ebp-10]
00500CE1   .  8B45 FC         mov     eax, [ebp-4]
00500CE4   .  8B80 00030000   mov     eax, [eax+300]
00500CEA   .  E8 E958F5FF     call    004565D8
00500CEF   .  8B45 F0         mov     eax, [ebp-10]                  ;  假码位数送入EAX
00500CF2   .  50              push    eax                            ;  EAX入栈
00500CF3   .  A1 34A35100     mov     eax, [51A334]                  ;  [51A334]送入EAX
00500CF8   .  FF70 04         push    dword ptr [eax+4]              ; /Arg2
00500CFB   .  FF30            push    dword ptr [eax]                ; |此处出现真码16进制
00500CFD   .  8D45 EC         lea     eax, [ebp-14]                  ; |
00500D00   .  E8 5B8CF0FF     call    00409960                       ; \转为10进制%d
00500D05   .  8B55 EC         mov     edx, [ebp-14]                  ;  真码入EDX
00500D08   .  58              pop     eax                            ;  假码弹出
00500D09   .  E8 FE42F0FF     call    0040500C                       ;  经典比较/可做内存注册机
00500D0E   .  0F85 23010000   jnz     00500E37                       ;  此处爆破nop~~
00500D14   .  A1 34A35100     mov     eax, [51A334]
00500D19   .  FF70 04         push    dword ptr [eax+4]              ; /Arg2
00500D1C   .  FF30            push    dword ptr [eax]                ; |Arg1
00500D1E   .  8D45 E8         lea     eax, [ebp-18]                  ; |
00500D21   .  E8 3A8CF0FF     call    00409960                       ; \dsbyxt.00409960
00500D26   .  8B55 E8         mov     edx, [ebp-18]
00500D29   .  A1 80A15100     mov     eax, [51A180]
00500D2E   .  83C0 04         add     eax, 4
00500D31   .  E8 2E3FF0FF     call    00404C64
00500D36   .  A1 5CA05100     mov     eax, [51A05C]
00500D3B   .  8B00            mov     eax, [eax]
00500D3D   .  8B80 90030000   mov     eax, [eax+390]
00500D43   .  66:BE EBFF      mov     si, 0FFEB
00500D47   .  E8 D032F0FF     call    0040401C
00500D4C   .  A1 34A35100     mov     eax, [51A334]
00500D51   .  C700 05000000   mov     dword ptr [eax], 5
00500D57   .  C740 04 0000000>mov     dword ptr [eax+4], 0
00500D5E   .  6A 40           push    40                             ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00500D60   .  68 380F5000     push    00500F38                       ; |系统信息
00500D65   .  68 440F5000     push    00500F44                       ; |注册成功!\n\n你将获得本软件终身免费升级权。\n\n感谢你

使用**播放软件!
00500D6A   .  6A 00           push    0                              ; |hOwner = NULL
00500D6C   .  E8 3F6FF0FF     call    <jmp.&user32.MessageBoxA>      ; \MessageBoxA
00500D71   .  A1 5CA05100     mov     eax, [51A05C]
00500D76   .  8B00            mov     eax, [eax]
00500D78   .  8B80 5C030000   mov     eax, [eax+35C]
00500D7E   .  33D2            xor     edx, edx
00500D80   .  E8 13BBF6FF     call    0046C898
00500D85   .  B2 01           mov     dl, 1
00500D87   .  A1 D0854900     mov     eax, [4985D0]
00500D8C   .  E8 9779F9FF     call    00498728
00500D91   .  A3 30BE5100     mov     [51BE30], eax
00500D96   .  8B15 18A35100   mov     edx, [51A318]                  ;  dsbyxt.0051C188
00500D9C   .  8B12            mov     edx, [edx]
00500D9E   .  A1 30BE5100     mov     eax, [51BE30]
00500DA3   .  E8 607AF9FF     call    00498808
00500DA8   .  8B15 70A35100   mov     edx, [51A370]                  ;  dsbyxt.0051C184
00500DAE   .  8B12            mov     edx, [edx]
00500DB0   .  8D45 E4         lea     eax, [ebp-1C]
00500DB3   .  B9 940F5000     mov     ecx, 00500F94                  ;  markjl
00500DB8   .  E8 5741F0FF     call    00404F14
00500DBD   .  8B55 E4         mov     edx, [ebp-1C]
00500DC0   .  33C9            xor     ecx, ecx
00500DC2   .  A1 30BE5100     mov     eax, [51BE30]
00500DC7   .  E8 F07AF9FF     call    004988BC
00500DCC   .  84C0            test    al, al
00500DCE   .  74 3D           je      short 00500E0D
00500DD0   .  BA A40F5000     mov     edx, 00500FA4                  ;  gc_id
00500DD5   .  A1 30BE5100     mov     eax, [51BE30]
00500DDA   .  E8 C17DF9FF     call    00498BA0
00500DDF   .  84C0            test    al, al
00500DE1   .  74 2A           je      short 00500E0D
00500DE3   .  BA A40F5000     mov     edx, 00500FA4                  ;  gc_id
00500DE8   .  A1 30BE5100     mov     eax, [51BE30]
00500DED   .  E8 867CF9FF     call    00498A78
00500DF2   .  3D F0000000     cmp     eax, 0F0
00500DF7   .  7E 14           jle     short 00500E0D
00500DF9   .  B9 C8000000     mov     ecx, 0C8
00500DFE   .  BA A40F5000     mov     edx, 00500FA4                  ;  gc_id
00500E03   .  A1 30BE5100     mov     eax, [51BE30]
00500E08   .  E8 437CF9FF     call    00498A50
00500E0D   >  A1 30BE5100     mov     eax, [51BE30]
00500E12   .  E8 0930F0FF     call    00403E20
00500E17   .  A1 5CA05100     mov     eax, [51A05C]
00500E1C   .  8B00            mov     eax, [eax]
00500E1E   .  8B80 04030000   mov     eax, [eax+304]
00500E24   .  B2 01           mov     dl, 1
00500E26   .  E8 456FF4FF     call    00447D70
00500E2B   .  A1 28BE5100     mov     eax, [51BE28]
00500E30   .  E8 DB9AF7FF     call    0047A910
00500E35   .  EB 70           jmp     short 00500EA7
00500E37   >  6A 10           push    10                             ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
00500E39   .  68 AC0F5000     push    00500FAC                       ; |错误 86599
00500E3E   .  68 B80F5000     push    00500FB8                       ; |对不起,注册码不正确!
00500E43   .  6A 00           push    0                              ; |hOwner = NULL
00500E45   .  E8 666EF0FF     call    <jmp.&user32.MessageBoxA>      ; \MessageBoxA
00500E4A   .  8B45 FC         mov     eax, [ebp-4]
00500E4D   .  8B80 00030000   mov     eax, [eax+300]
00500E53   .  33D2            xor     edx, edx
00500E55   .  E8 BE57F5FF     call    00456618
00500E5A   .  A1 5CA05100     mov     eax, [51A05C]
00500E5F   .  8B00            mov     eax, [eax]
00500E61   .  8B80 04030000   mov     eax, [eax+304]
00500E67   .  33D2            xor     edx, edx
00500E69   .  E8 026FF4FF     call    00447D70
00500E6E   .  EB 37           jmp     short 00500EA7
00500E70   >  6A 10           push    10                             ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
00500E72   .  68 D00F5000     push    00500FD0                       ; |错误 efgkc
00500E77   .  68 B80F5000     push    00500FB8                       ; |对不起,注册码不正确!
00500E7C   .  6A 00           push    0                              ; |hOwner = NULL
00500E7E   .  E8 2D6EF0FF     call    <jmp.&user32.MessageBoxA>      ; \MessageBoxA
00500E83   .  8B45 FC         mov     eax, [ebp-4]
00500E86   .  8B80 00030000   mov     eax, [eax+300]
00500E8C   .  33D2            xor     edx, edx
00500E8E   .  E8 8557F5FF     call    00456618
00500E93   .  A1 5CA05100     mov     eax, [51A05C]
00500E98   .  8B00            mov     eax, [eax]
00500E9A   .  8B80 04030000   mov     eax, [eax+304]
00500EA0   .  33D2            xor     edx, edx
00500EA2   .  E8 C96EF4FF     call    00447D70
00500EA7   >  33C0            xor     eax, eax
00500EA9   .  5A              pop     edx
00500EAA   .  59              pop     ecx
00500EAB   .  59              pop     ecx
00500EAC   .  64:8910         mov     fs:[eax], edx
00500EAF   .  EB 14           jmp     short 00500EC5
00500EB1   .^ E9 4A34F0FF     jmp     00404300
00500EB6   .  A1 28BE5100     mov     eax, [51BE28]
00500EBB   .  E8 509AF7FF     call    0047A910
00500EC0   .  E8 A337F0FF     call    00404668
00500EC5   >  8B45 FC         mov     eax, [ebp-4]
00500EC8   .  8B80 08030000   mov     eax, [eax+308]
00500ECE   .  33D2            xor     edx, edx
00500ED0   .  E8 4F55F5FF     call    00456424
00500ED5   .  33C0            xor     eax, eax
00500ED7   .  5A              pop     edx
00500ED8   .  59              pop     ecx
00500ED9   .  59              pop     ecx
00500EDA   .  64:8910         mov     fs:[eax], edx
00500EDD   .  68 040F5000     push    00500F04
00500EE2   >  8D45 E4         lea     eax, [ebp-1C]
00500EE5   .  BA 03000000     mov     edx, 3
00500EEA   .  E8 453DF0FF     call    00404C34
00500EEF   .  8D45 F0         lea     eax, [ebp-10]
00500EF2   .  BA 03000000     mov     edx, 3
00500EF7   .  E8 383DF0FF     call    00404C34
00500EFC   .  C3              retn
00500EFD   .^ E9 B236F0FF     jmp     004045B4
00500F02   .^ EB DE           jmp     short 00500EE2
00500F04   .  5F              pop     edi
00500F05   .  5E              pop     esi
00500F06   .  5B              pop     ebx
00500F07   .  8BE5            mov     esp, ebp
00500F09   .  5D              pop     ebp
00500F0A   .  C3              retn

------------------------跟进500C91处的代码如下----------------------------------------

0040401C   $  50              push    eax
0040401D   .  51              push    ecx
0040401E   .  8B00            mov     eax, [eax]
00404020   .  E8 C7FFFFFF     call    00403FEC                       ;  这里跟进
00404025   .  59              pop     ecx
00404026   .  58              pop     eax
00404027   .  74 02           je      short 0040402B
00404029   .  FFE6            jmp     esi
0040402B   >  59              pop     ecx
0040402C   .^ E9 AFECFFFF     jmp     00402CE0
00404031   .  C3              retn

------------------------跟进404020处的代码如下-----------------------------------------

其中这里有2个call,虽然说地址跟进是一样,但是有2段代码....小弟不明白,请各位大侠指点一二~

00403FEC  /$  57              push    edi
00403FED  |.  96              xchg    eax, esi
00403FEE  |.  EB 02           jmp     short 00403FF2
00403FF0  |>  8B36            /mov     esi, [esi]
00403FF2  |>  8B7E D0          mov     edi, [esi-30]
00403FF5  |.  85FF            |test    edi, edi
00403FF7  |.  74 0D           |je      short 00404006
00403FF9  |.  0FB70F          |movzx   ecx, word ptr [edi]
00403FFC  |.  51              |push    ecx
00403FFD  |.  83C7 02         |add     edi, 2
00404000  |.  F2:66:AF        |repne   scas word ptr es:[edi]
00404003  |.  74 0A           |je      short 0040400F
00404005  |.  59              |pop     ecx
00404006  |>  8B76 DC         |mov     esi, [esi-24]
00404009  |.  85F6            |test    esi, esi
0040400B  |.^ 75 E3           \jnz     short 00403FF0
0040400D  |.  5F              pop     edi
0040400E  |.  C3              retn
0040400F  |>  58              pop     eax
00404010  |.  01C0            add     eax, eax
00404012  |.  29C8            sub     eax, ecx
00404014  |.  8B7447 FC       mov     esi, [edi+eax*2-4]
00404018  |.  5F              pop     edi
00404019  \.  C3              retn
0040401A      8BC0            mov     eax, eax
0040401C   $  50              push    eax
0040401D   .  51              push    ecx
0040401E   .  8B00            mov     eax, [eax]
00404020   .  E8 C7FFFFFF     call    00403FEC                       
00404025   .  59              pop     ecx
00404026   .  58              pop     eax
00404027   .  74 02           je      short 0040402B
00404029   . /FFE6            jmp     esi                            ;  *****.0044055C  (注意这里直接跳转)
0040402B   >  59              pop     ecx
0040402C   .^ E9 AFECFFFF     jmp     00402CE0
00404031   .  C3              retn

中间省略N行代码~~~

0044055C  /$  55              push    ebp
0044055D  |.  8BEC            mov     ebp, esp
0044055F  |.  83C4 F8         add     esp, -8
00440562  |.  8945 FC         mov     [ebp-4], eax
00440565  |.  8B45 FC         mov     eax, [ebp-4]
00440568  |.  E8 DB340300     call    00473A48
0044056D  |.  8945 F8         mov     [ebp-8], eax
00440570  |.  837D F8 00      cmp     dword ptr [ebp-8], 0
00440574  |.  74 12           je      short 00440588
00440576  |.  8B45 FC         mov     eax, [ebp-4]
00440579  |.  8B80 14020000   mov     eax, [eax+214]
0044057F  |.  8B55 F8         mov     edx, [ebp-8]
00440582  |.  8982 4C020000   mov     [edx+24C], eax
00440588  |>  8B45 FC         mov     eax, [ebp-4]
0044058B  |.  E8 707D0100     call    00458300                       ;  算法
00440590  |.  59              pop     ecx
00440591  |.  59              pop     ecx
00440592  |.  5D              pop     ebp
00440593  \.  C3              retn

------------------------跟进44058B处的代码如下-----------------------------------------

中间省略N行代码~~~

00458363  |.  8B40 6C         mov     eax, [eax+6C]
00458366  |.  8B08            mov     ecx, [eax]
00458368  |.  FF51 18         call    [ecx+18]
0045836B  |.  EB 1F           jmp     short 0045838C
0045836D  |>  8B45 FC         mov     eax, [ebp-4]
00458370  |.  66:83B8 2201000>cmp     word ptr [eax+122], 0
00458378  |.  74 12           je      short 0045838C
0045837A  |.  8B5D FC         mov     ebx, [ebp-4]
0045837D  |.  8B55 FC         mov     edx, [ebp-4]
00458380  |.  8B83 24010000   mov     eax, [ebx+124]
00458386  |.  FF93 20010000   call    [ebx+120]                      ;  算法call
0045838C  |>  5B              pop     ebx
0045838D  |.  59              pop     ecx
0045838E  |.  5D              pop     ebp
0045838F  \.  C3              retn

------------------------跟进458386处的代码如下(算法call)-----------------------------------------

00511884  /.  55              push    ebp                            ;  跟到此,F8继续
00511885  |.  8BEC            mov     ebp, esp
00511887  |.  6A 00           push    0
00511889  |.  6A 00           push    0
0051188B  |.  6A 00           push    0
0051188D  |.  53              push    ebx
0051188E  |.  56              push    esi
0051188F  |.  57              push    edi
00511890  |.  33C0            xor     eax, eax
00511892  |.  55              push    ebp
00511893  |.  68 DD1A5100     push    00511ADD
00511898  |.  64:FF30         push    dword ptr fs:[eax]
0051189B  |.  64:8920         mov     fs:[eax], esp
0051189E  |.  8D45 FC         lea     eax, [ebp-4]
005118A1  |.  8B15 C0BF5100   mov     edx, [51BFC0]
005118A7  |.  E8 FC33EFFF     call    00404CA8
005118AC  |.  8D45 F8         lea     eax, [ebp-8]
005118AF  |.  E8 5C33EFFF     call    00404C10
005118B4  |.  8B45 FC         mov     eax, [ebp-4]                   ;出硬盘序列号送入EAX
005118B7  |.  E8 0C36EFFF     call    00404EC8
005118BC  |.  8BF0            mov     esi, eax                       ;  EAX -->ESI
005118BE  |.  85F6            test    esi, esi                       ;  测试ESI是否小于E
005118C0  |.  0F8E 8D010000   jle     00511A53                       ;  小于则跳转
005118C6  |.  BB 01000000     mov     ebx, 1
005118CB  |>  8D45 F4         /lea     eax, [ebp-C]
005118CE  |.  50              |push    eax
005118CF  |.  B9 01000000     |mov     ecx, 1
005118D4  |.  8BD3            |mov     edx, ebx
005118D6  |.  8B45 FC         |mov     eax, [ebp-4]                  ;  硬盘序列号送入EAX
005118D9  |.  E8 4238EFFF     |call    00405120
005118DE  |.  8B45 F4         |mov     eax, [ebp-C]
005118E1  |.  BA F41A5100     |mov     edx, 00511AF4                 ;  9
005118E6  |.  E8 2137EFFF     |call    0040500C
005118EB  |.  0F87 B2000000   |ja      005119A3
005118F1  |.  8D45 F8         |lea     eax, [ebp-8]
005118F4  |.  50              |push    eax
005118F5  |.  B9 01000000     |mov     ecx, 1
005118FA  |.  8BD3            |mov     edx, ebx
005118FC  |.  8B45 FC         |mov     eax, [ebp-4]
005118FF  |.  E8 1C38EFFF     |call    00405120
00511904  |.  8B45 F8         |mov     eax, [ebp-8]
00511907  |.  E8 8C80EFFF     |call    00409998
0051190C  |.  8BF8            |mov     edi, eax
0051190E  |.  8BC7            |mov     eax, edi
00511910  |.  F7EB            |imul    ebx
00511912  |.  71 05           |jno     short 00511919
00511914  |.  E8 4724EFFF     |call    00403D60
00511919  |>  83C0 03         |add     eax, 3                        ;  EAX=EAX+3
0051191C  |.  71 05           |jno     short 00511923
0051191E  |.  E8 3D24EFFF     |call    00403D60
00511923  |>  99              |cdq                                   ;  双字扩展
00511924  |.  33C2            |xor     eax, edx
00511926  |.  2BC2            |sub     eax, edx                      ;  EAX=EAX-EDX
00511928  |.  71 05           |jno     short 0051192F
0051192A  |.  E8 3124EFFF     |call    00403D60
0051192F  |>  8BF8            |mov     edi, eax                      ;  EAX送入EDI
00511931  |.  833D DCBF5100 0>|cmp     dword ptr [51BFDC], 0         ;  比较是否取完
00511938  |.  75 0E           |jnz     short 00511948
0051193A  |.  813D D8BF5100 F>|cmp     dword ptr [51BFD8], 5F5E0FF
00511944  |.  76 2F           |jbe     short 00511975
00511946  |.  EB 02           |jmp     short 0051194A
00511948  |>  7E 2B           |jle     short 00511975
0051194A  |>  6A 00           |push    0
0051194C  |.  68 80969800     |push    989680
00511951  |.  8B05 D8BF5100   |mov     eax, [51BFD8]
00511957  |.  8B15 DCBF5100   |mov     edx, [51BFDC]
0051195D  |.  E8 5E44EFFF     |call    00405DC0
00511962  |.  71 05           |jno     short 00511969
00511964  |.  E8 F723EFFF     |call    00403D60
00511969  |>  8905 D8BF5100   |mov     [51BFD8], eax
0051196F  |.  8915 DCBF5100   |mov     [51BFDC], edx
00511975  |>  8BC7            |mov     eax, edi
00511977  |.  99              |cdq
00511978  |.  52              |push    edx
00511979  |.  50              |push    eax
0051197A  |.  8B05 D8BF5100   |mov     eax, [51BFD8]
00511980  |.  8B15 DCBF5100   |mov     edx, [51BFDC]
00511986  |.  E8 CD42EFFF     |call    00405C58
0051198B  |.  71 05           |jno     short 00511992
0051198D  |.  E8 CE23EFFF     |call    00403D60
00511992  |>  8905 D8BF5100   |mov     [51BFD8], eax                 ;  EAX送入[51BFD8]
00511998  |.  8915 DCBF5100   |mov     [51BFDC], edx
0051199E  |.  E9 A8000000     |jmp     00511A4B
005119A3  |>  833D DCBF5100 0>|cmp     dword ptr [51BFDC], 0
005119AA  |.  75 0E           |jnz     short 005119BA
005119AC  |.  813D D8BF5100 7>|cmp     dword ptr [51BFD8], 98967F
005119B6  |.  76 2F           |jbe     short 005119E7
005119B8  |.  EB 02           |jmp     short 005119BC
005119BA  |>  7E 2B           |jle     short 005119E7
005119BC  |>  6A 00           |push    0
005119BE  |.  68 40420F00     |push    0F4240
005119C3  |.  8B05 D8BF5100   |mov     eax, [51BFD8]
005119C9  |.  8B15 DCBF5100   |mov     edx, [51BFDC]
005119CF  |.  E8 EC43EFFF     |call    00405DC0
005119D4  |.  71 05           |jno     short 005119DB
005119D6  |.  E8 8523EFFF     |call    00403D60
005119DB  |>  8905 D8BF5100   |mov     [51BFD8], eax
005119E1  |.  8915 DCBF5100   |mov     [51BFDC], edx
005119E7  |>  8B45 FC         |mov     eax, [ebp-4]                  ;  硬盘序列号送入EAX
005119EA  |.  4B              |dec     ebx                           ;  减1
005119EB  |.  85C0            |test    eax, eax
005119ED  |.  74 05           |je      short 005119F4
005119EF  |.  3B58 FC         |cmp     ebx, [eax-4]
005119F2  |.  72 05           |jb      short 005119F9
005119F4      E8 5F23EFFF     call    00403D58
005119F9  |>  43              |inc     ebx                           ;  +1
005119FA  |.  8A4418 FF       |mov     al, [eax+ebx-1]               ;  开始取硬盘序列号的每一位ASCII值
005119FE  |.  25 FF000000     |and     eax, 0FF                      ;  取的值与0FF做and运算
00511A03  |.  33D2            |xor     edx, edx                      ;  EDX清0
00511A05  |.  52              |push    edx                           ;  EDX入栈
00511A06  |.  50              |push    eax                           ;  EAX入栈
00511A07  |.  8B05 D8BF5100   |mov     eax, [51BFD8]                 ;  [51BFD8]送入EAX
00511A0D  |.  8B15 DCBF5100   |mov     edx, [51BFDC]                 ;  [51BFDC]送入EDX
00511A13  |.  E8 4042EFFF     |call    00405C58
00511A18  |.  71 05           |jno     short 00511A1F
00511A1A  |.  E8 4123EFFF     |call    00403D60
00511A1F  |>  83C0 07         |add     eax, 7                        ;  EAX=EAX+7
00511A22  |.  83D2 00         |adc     edx, 0                        ;  EDX=EDX+0=0
00511A25  |.  71 05           |jno     short 00511A2C
00511A27  |.  E8 3423EFFF     |call    00403D60
00511A2C  |>  85D2            |test    edx, edx
00511A2E  |.  7D 0F           |jge     short 00511A3F
00511A30  |.  33C9            |xor     ecx, ecx
00511A32  |.  F7D8            |neg     eax
00511A34  |.  87CA            |xchg    edx, ecx
00511A36  |.  1BD1            |sbb     edx, ecx
00511A38  |.  71 05           |jno     short 00511A3F
00511A3A  |.  E8 2123EFFF     |call    00403D60
00511A3F  |>  8905 D8BF5100   |mov     [51BFD8], eax                 ;  EAX送入[51BFD8]
00511A45  |.  8915 DCBF5100   |mov     [51BFDC], edx                 ;  EDX送入[51BFDC]
00511A4B  |>  43              |inc     ebx                           ;  ebx(计数器)加1
00511A4C  |.  4E              |dec     esi                           ;  减1
00511A4D  |.^ 0F85 78FEFFFF   \jnz     005118CB                      ;  循环取
00511A53  |>  8B05 D8BF5100   mov     eax, [51BFD8]
00511A59  |.  8B15 DCBF5100   mov     edx, [51BFDC]
00511A5F  |.  85D2            test    edx, edx
00511A61  |.  7D 0F           jge     short 00511A72
00511A63  |.  33C9            xor     ecx, ecx
00511A65  |.  F7D8            neg     eax
00511A67  |.  87CA            xchg    edx, ecx
00511A69  |.  1BD1            sbb     edx, ecx
00511A6B  |.  71 05           jno     short 00511A72
00511A6D  |.  E8 EE22EFFF     call    00403D60
00511A72  |>  8905 D8BF5100   mov     [51BFD8], eax                  ;  EAX(一系列运算完毕的16进制)送入[51BFD8]
00511A78  |.  8915 DCBF5100   mov     [51BFDC], edx
00511A7E  |.  833D DCBF5100 0>cmp     dword ptr [51BFDC], 0
00511A85  |.  75 0E           jnz     short 00511A95
00511A87  |.  813D D8BF5100 F>cmp     dword ptr [51BFD8], 3B9AC9FF   ;  真码16进制与"3B9AC9FF"作对比
00511A91  |.  76 2F           jbe     short 00511AC2                 ;  小于就跳
00511A93  |.  EB 02           jmp     short 00511A97
00511A95  |>  7E 2B           jle     short 00511AC2
00511A97  |>  6A 00           push    0
00511A99  |.  68 00CA9A3B     push    3B9ACA00
00511A9E  |.  8B05 D8BF5100   mov     eax, [51BFD8]
00511AA4  |.  8B15 DCBF5100   mov     edx, [51BFDC]
00511AAA  |.  E8 1143EFFF     call    00405DC0
00511AAF  |.  71 05           jno     short 00511AB6
00511AB1  |.  E8 AA22EFFF     call    00403D60
00511AB6  |>  8905 D8BF5100   mov     [51BFD8], eax
00511ABC  |.  8915 DCBF5100   mov     [51BFDC], edx
00511AC2  |>  33C0            xor     eax, eax
00511AC4  |.  5A              pop     edx
00511AC5  |.  59              pop     ecx
00511AC6  |.  59              pop     ecx
00511AC7  |.  64:8910         mov     fs:[eax], edx
00511ACA  |.  68 E41A5100     push    00511AE4
00511ACF  |>  8D45 F4         lea     eax, [ebp-C]
00511AD2  |.  BA 03000000     mov     edx, 3
00511AD7  |.  E8 5831EFFF     call    00404C34
00511ADC  \.  C3              retn                                   ;  返回




------------------------------------------------------------------------
【算法总结】
1、硬盘序列号必须为14位 ,可记为A 
2、取A的每一位ASCII值与0FF做and 运算再加上7,最后全部累加为16进制,可记为B
3、然后把B转换为10进制,即是注册码

后记:

1.其实在破解的时候:触发事件一断下来就给了我们真码的16进制.
(当时没太在意,可一直找不出关键call,然后就一层层call跟进,最后找到正确的算法核心)

2.以下出现一系列的ascii"999999999999"及ascii"0000000000"都没有与算法搭上边,当时被这些迷惑住了,呵呵~~~

3.感谢你看到此处~~很简单的一个算法~ 其他也没啥好说的了.有不当之处,请各位大侠多多指正~~~

------------------------------------------------------------------------
【版权声明】本文纯属技术交流, 转载请注明作者信息并保持文章的完整, 谢谢!