【文章作者】: tzl 
【作者邮箱】: 无
【软件名称】: 中文繁简转换工具 1.2
【软件大小】: 1352KB
【下载地址】: http://www.newhua.com/soft/49685.htm
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: Borland C++ 1999
【使用工具】: OD PEID
【操作平台】: XP SP2
【软件介绍】: 小巧简繁互转工具。支持文本文件的GBK到BIG5、BIG5到GBK、GBK繁体到简体、GBK简体到繁体、BIG5到GBK简体的批量转换。
软件大小:1352KB
软件语言:简体中文
软件类别:国产软件/共享版/中文平台
运行环境:Win9x/Me/NT/2000/XP/2003
加入时间:2006-9-26 16:20:30

今天花了点时间,运气还算不错,比较简单的算法,是给菜鸟学习的好教材。

一、查壳,无壳。

二、运行程序注册提示“注册失败”,查看字符串相关信息,我们在这里下断开始分析。

试练码:123456789012,为什么是12位,在分析中有讲解。

00408F56         53            push ebx
00408F57         8955 B4       mov dword ptr ss:[ebp-4C],edx
00408F5A         8945 B8       mov dword ptr ss:[ebp-48],eax
00408F5D         B8 D8E04900   mov eax,ScTc.0049E0D8
00408F62         E8 CD1A0900   call ScTc.0049AA34
00408F67         66:C745 CC 08>mov word ptr ss:[ebp-34],8
00408F6D         8D45 FC       lea eax,dword ptr ss:[ebp-4]
00408F70         E8 3F8AFFFF   call ScTc.004019B4
00408F75         8BD0          mov edx,eax
00408F77         FF45 D8       inc dword ptr ss:[ebp-28]
00408F7A         8B4D B8       mov ecx,dword ptr ss:[ebp-48]
00408F7D         8B81 1C030000 mov eax,dword ptr ds:[ecx+31C]
00408F83         E8 301C0700   call ScTc.0047ABB8
00408F88         8D45 FC       lea eax,dword ptr ss:[ebp-4]
00408F8B         E8 888FFFFF   call ScTc.00401F18
00408F90         83F8 0C       cmp eax,0C                       ;         试练码位数与OC(12)比较,注册码由12位数字组成
00408F93         0F95C2        setne dl
00408F96         83E2 01       and edx,1                        ;         edx与1进行and运算
00408F99         52            push edx                         ;         edx=1
00408F9A         FF4D D8       dec dword ptr ss:[ebp-28]
00408F9D         8D45 FC       lea eax,dword ptr ss:[ebp-4]     ;         eax=试练码位数
00408FA0         BA 02000000   mov edx,2                        ;         2送edx
00408FA5         E8 1A1C0900   call ScTc.0049ABC4
00408FAA         59            pop ecx
00408FAB         84C9          test cl,cl
00408FAD         74 6E         je short ScTc.0040901D                     关键跳转,注册码为12位时正常跳转,这就是为什么试练码为12位   
00408FAF         6A 10         push 10
00408FB1         66:C745 CC 14>mov word ptr ss:[ebp-34],14
00408FB7         8D45 F8       lea eax,dword ptr ss:[ebp-8]
00408FBA         E8 F589FFFF   call ScTc.004019B4
00408FBF         8BD0          mov edx,eax
00408FC1         FF45 D8       inc dword ptr ss:[ebp-28]
00408FC4         8B0D D44A4A00 mov ecx,dword ptr ds:[4A4AD4]    ;         ScTc.004A5AE0
00408FCA         8B01          mov eax,dword ptr ds:[ecx]
00408FCC         E8 976C0600   call ScTc.0046FC68
00408FD1         8D45 F8       lea eax,dword ptr ss:[ebp-8]
00408FD4         E8 638FFFFF   call ScTc.00401F3C
00408FD9         50            push eax
00408FDA         68 A9DF4900   push ScTc.0049DFA9
00408FDF         8B45 B8       mov eax,dword ptr ss:[ebp-48]
00408FE2         E8 E1820700   call ScTc.004812C8
00408FE7         50            push eax
00408FE8         E8 41270900   call <jmp.&USER32.MessageBoxA>
00408FED         FF4D D8       dec dword ptr ss:[ebp-28]
00408FF0         8D45 F8       lea eax,dword ptr ss:[ebp-8]
00408FF3         BA 02000000   mov edx,2
00408FF8         E8 C71B0900   call ScTc.0049ABC4
00408FFD         8B4D B8       mov ecx,dword ptr ss:[ebp-48]
00409000         8B81 1C030000 mov eax,dword ptr ds:[ecx+31C]
00409006         8B10          mov edx,dword ptr ds:[eax]
00409008         FF92 C0000000 call dword ptr ds:[edx+C0]
0040900E         8B4D BC       mov ecx,dword ptr ss:[ebp-44]
00409011         64:890D 00000>mov dword ptr fs:[0],ecx
00409018         E9 AE010000   jmp ScTc.004091CB
0040901D         66:C745 CC 20>mov word ptr ss:[ebp-34],20                 若为12位试练码则跳转到此
00409023         8D45 F4       lea eax,dword ptr ss:[ebp-C]
00409026         E8 8989FFFF   call ScTc.004019B4               
0040902B         8BD0          mov edx,eax
0040902D         FF45 D8       inc dword ptr ss:[ebp-28]
00409030         8B4D B8       mov ecx,dword ptr ss:[ebp-48]
00409033         8B81 1C030000 mov eax,dword ptr ds:[ecx+31C]
00409039         E8 7A1B0700   call ScTc.0047ABB8               
0040903E         8D55 F4       lea edx,dword ptr ss:[ebp-C]
00409041         8B12          mov edx,dword ptr ds:[edx]       ;          试练码送edx
00409043         A1 30484A00   mov eax,dword ptr ds:[4A4830]    ;          OC(12)送eax
00409048         8B00          mov eax,dword ptr ds:[eax]
0040904A         E8 F18DFFFF   call ScTc.00401E40               ;          算法分析call(1)
0040904F         50            push eax
00409050         FF4D D8       dec dword ptr ss:[ebp-28]
00409053         8D45 F4       lea eax,dword ptr ss:[ebp-C]
00409056         BA 02000000   mov edx,2
0040905B         E8 641B0900   call ScTc.0049ABC4
00409060         59            pop ecx
00409061         84C9          test cl,cl
00409063         0F84 F9000000 je ScTc.00409162                            关键跳转
00409069         C605 E04C4A00>mov byte ptr ds:[4A4CE0],1
00409070         8D45 E8       lea eax,dword ptr ss:[ebp-18]
00409073         E8 3C89FFFF   call ScTc.004019B4
00409078         8BD0          mov edx,eax
0040907A         FF45 D8       inc dword ptr ss:[ebp-28]
0040907D         8B4D B8       mov ecx,dword ptr ss:[ebp-48]
00409080         8B81 1C030000 mov eax,dword ptr ds:[ecx+31C]
00409086         E8 2D1B0700   call ScTc.0047ABB8
0040908B         8D55 E8       lea edx,dword ptr ss:[ebp-18]
0040908E         FF32          push dword ptr ds:[edx]
00409090         BA BEDF4900   mov edx,ScTc.0049DFBE            ;         ASCII "KEY"
00409095         8D45 EC       lea eax,dword ptr ss:[ebp-14]
00409098         E8 671A0900   call ScTc.0049AB04
0040909D         FF45 D8       inc dword ptr ss:[ebp-28]
004090A0         FF30          push dword ptr ds:[eax]
004090A2         66:C745 CC 2C>mov word ptr ss:[ebp-34],2C
004090A8         BA B6DF4900   mov edx,ScTc.0049DFB6            ;         ASCII "REGCODE"
004090AD         8D45 F0       lea eax,dword ptr ss:[ebp-10]
004090B0         E8 4F1A0900   call ScTc.0049AB04
004090B5         FF45 D8       inc dword ptr ss:[ebp-28]
004090B8         8B10          mov edx,dword ptr ds:[eax]
004090BA         A1 E84C4A00   mov eax,dword ptr ds:[4A4CE8]
004090BF         59            pop ecx
004090C0         8B18          mov ebx,dword ptr ds:[eax]
004090C2         FF53 04       call dword ptr ds:[ebx+4]
004090C5         FF4D D8       dec dword ptr ss:[ebp-28]
004090C8         8D45 E8       lea eax,dword ptr ss:[ebp-18]
004090CB         BA 02000000   mov edx,2
004090D0         E8 EF1A0900   call ScTc.0049ABC4
004090D5         FF4D D8       dec dword ptr ss:[ebp-28]
004090D8         8D45 EC       lea eax,dword ptr ss:[ebp-14]
004090DB         BA 02000000   mov edx,2
004090E0         E8 DF1A0900   call ScTc.0049ABC4
004090E5         FF4D D8       dec dword ptr ss:[ebp-28]
004090E8         8D45 F0       lea eax,dword ptr ss:[ebp-10]
004090EB         BA 02000000   mov edx,2
004090F0         E8 CF1A0900   call ScTc.0049ABC4
004090F5         6A 40         push 40
004090F7         66:C745 CC 38>mov word ptr ss:[ebp-34],38
004090FD         8D45 E4       lea eax,dword ptr ss:[ebp-1C]
00409100         E8 AF88FFFF   call ScTc.004019B4
00409105         8BD0          mov edx,eax
00409107         FF45 D8       inc dword ptr ss:[ebp-28]
0040910A         8B0D D44A4A00 mov ecx,dword ptr ds:[4A4AD4]    ; ScTc.004A5AE0
00409110         8B01          mov eax,dword ptr ds:[ecx]
00409112         E8 516B0600   call ScTc.0046FC68
00409117         8D45 E4       lea eax,dword ptr ss:[ebp-1C]
0040911A         E8 1D8EFFFF   call ScTc.00401F3C
0040911F         50            push eax
00409120         68 C2DF4900   push ScTc.0049DFC2
00409125         8B45 B8       mov eax,dword ptr ss:[ebp-48]
00409128         E8 9B810700   call ScTc.004812C8
0040912D         50            push eax
0040912E         E8 FB250900   call <jmp.&USER32.MessageBoxA>   ;              注册成功提示处
********************************************************************************

跟进算法call(1)

00401E40         55            push ebp
00401E41         8BEC          mov ebp,esp
00401E43         83C4 D0       add esp,-30
00401E46         53            push ebx
00401E47         8955 FC       mov dword ptr ss:[ebp-4],edx     ; edx=试练码
00401E4A         8945 D4       mov dword ptr ss:[ebp-2C],eax
00401E4D         B8 10C54900   mov eax,ScTc.0049C510
00401E52         E8 DD8B0900   call ScTc.0049AA34
00401E57         C745 F4 01000>mov dword ptr ss:[ebp-C],1       ; 1=ebp-c
00401E5E         8D55 FC       lea edx,dword ptr ss:[ebp-4]     ; edx=试练码
00401E61         8D45 FC       lea eax,dword ptr ss:[ebp-4]
00401E64         E8 D38C0900   call ScTc.0049AB3C
00401E69         FF45 F4       inc dword ptr ss:[ebp-C]         ; 1+1
00401E6C         66:C745 E8 08>mov word ptr ss:[ebp-18],8       ; 8=ebp-18
00401E72         8D45 FC       lea eax,dword ptr ss:[ebp-4]
00401E75         E8 9E000000   call ScTc.00401F18
00401E7A         83F8 0C       cmp eax,0C
00401E7D         75 76         jnz short ScTc.00401EF5
00401E7F         33D2          xor edx,edx                      ; edx清零
00401E81         8955 D0       mov dword ptr ss:[ebp-30],edx    ; 0=ebp-30
00401E84         8D45 FC       lea eax,dword ptr ss:[ebp-4]     ; ebp-4=OC
00401E87         E8 B0000000   call ScTc.00401F3C
00401E8C         8B55 D0       mov edx,dword ptr ss:[ebp-30]    ; eax=试练码
00401E8F         8A0C10        mov cl,byte ptr ds:[eax+edx]     ; cl=E4
00401E92         51            push ecx                         ; 12F032
00401E93         E8 3CFFFFFF   call ScTc.00401DD4               ; 算法分析call(2)
00401E98         59            pop ecx
00401E99         8BD8          mov ebx,eax                      ; 由call(2)得出,eax=36
00401E9B         8D45 FC       lea eax,dword ptr ss:[ebp-4]
00401E9E         E8 99000000   call ScTc.00401F3C
00401EA3         8B55 D0       mov edx,dword ptr ss:[ebp-30]    ; eax=试练码
00401EA6         3A5C10 06     cmp bl,byte ptr ds:[eax+edx+6]   ; 试练码第7位与“6”比较,相等则注册成功
00401EAA         74 20         je short ScTc.00401ECC
00401EAC         33C0          xor eax,eax
00401EAE         50            push eax
00401EAF         FF4D F4       dec dword ptr ss:[ebp-C]
00401EB2         8D45 FC       lea eax,dword ptr ss:[ebp-4]
00401EB5         BA 02000000   mov edx,2
00401EBA         E8 058D0900   call ScTc.0049ABC4
00401EBF         58            pop eax
00401EC0         8B55 D8       mov edx,dword ptr ss:[ebp-28]
00401EC3         64:8915 00000>mov dword ptr fs:[0],edx
00401ECA         EB 47         jmp short ScTc.00401F13
00401ECC         B0 01         mov al,1                         ; al置1
00401ECE         50            push eax
00401ECF         FF4D F4       dec dword ptr ss:[ebp-C]
00401ED2         8D45 FC       lea eax,dword ptr ss:[ebp-4]
00401ED5         BA 02000000   mov edx,2
00401EDA         E8 E58C0900   call ScTc.0049ABC4
00401EDF         58            pop eax
00401EE0         8B55 D8       mov edx,dword ptr ss:[ebp-28]    ; 试练码送edx
00401EE3         64:8915 00000>mov dword ptr fs:[0],edx
00401EEA         EB 27         jmp short ScTc.00401F13
00401EEC         FF45 D0       inc dword ptr ss:[ebp-30]
00401EEF         837D D0 06    cmp dword ptr ss:[ebp-30],6
00401EF3       ^ 7C 8F         jl short ScTc.00401E84
00401EF5         33C0          xor eax,eax
00401EF7         50            push eax
00401EF8         FF4D F4       dec dword ptr ss:[ebp-C]
00401EFB         8D45 FC       lea eax,dword ptr ss:[ebp-4]
00401EFE         BA 02000000   mov edx,2
00401F03         E8 BC8C0900   call ScTc.0049ABC4
00401F08         58            pop eax
00401F09         8B55 D8       mov edx,dword ptr ss:[ebp-28]
00401F0C         64:8915 00000>mov dword ptr fs:[0],edx
00401F13         5B            pop ebx
00401F14         8BE5          mov esp,ebp
00401F16         5D            pop ebp
00401F17         C3            retn

**********************************************************************************

跟进算法call(2)

00401DD4         55            push ebp
00401DD5         8BEC          mov ebp,esp
00401DD7         0FBE45 08     movsx eax,byte ptr ss:[ebp+8]    ; ebp+8=1,eax=试练码
00401DDB         83C0 D0       add eax,-30                      ; 31与-30进行add运算
00401DDE         83F8 09       cmp eax,9                          eax=1,与9比较
00401DE1         77 57         ja short ScTc.00401E3A             错误判断处,即注册码第一位只能为数字        
00401DE3         FF2485 EA1D40>jmp dword ptr ds:[eax*4+401DEA]    正常跳转,我们的试练码第一位为1,则跳转到00401E16处
00401DEA         121E          adc bl,byte ptr ds:[esi]
00401DEC         40            inc eax
00401DED         0016          add byte ptr ds:[esi],dl
00401DEF         1E            push ds
00401DF0         40            inc eax
00401DF1         001A          add byte ptr ds:[edx],bl
00401DF3         1E            push ds
00401DF4         40            inc eax
00401DF5         001E          add byte ptr ds:[esi],bl
00401DF7         1E            push ds
00401DF8         40            inc eax
00401DF9         0022          add byte ptr ds:[edx],ah
00401DFB         1E            push ds
00401DFC         40            inc eax
00401DFD         0026          add byte ptr ds:[esi],ah
00401DFF         1E            push ds
00401E00         40            inc eax
00401E01         002A          add byte ptr ds:[edx],ch
00401E03         1E            push ds
00401E04         40            inc eax
00401E05         002E          add byte ptr ds:[esi],ch
00401E07         1E            push ds
00401E08         40            inc eax
00401E09         0032          add byte ptr ds:[edx],dh
00401E0B         1E            push ds
00401E0C         40            inc eax
00401E0D         0036          add byte ptr ds:[esi],dh
00401E0F         1E            push ds
00401E10         40            inc eax
00401E12         B0 38         mov al,38                                         试练码第一位若为0的跳转处
00401E14         5D            pop ebp
00401E15         C3            retn
00401E16         B0 36         mov al,36                            ;al=1       试练码第一位若为1的跳转处,我们的试练码运行后跳转到该处                  
00401E18         5D            pop ebp                              ;eax=36
00401E19         C3            retn
00401E1A         B0 34         mov al,34                                         试练码第一位若为2的跳转处                    
00401E1C         5D            pop ebp                          
00401E1D         C3            retn
00401E1E         B0 30         mov al,30                                         试练码第一位若为3的跳转处
00401E20         5D            pop ebp
00401E21         C3            retn
00401E22         B0 35         mov al,35                                         试练码第一位若为4的跳转处
00401E24         5D            pop ebp
00401E25         C3            retn
00401E26         B0 32         mov al,32                                         试练码第一位若为5的跳转处
00401E28         5D            pop ebp
00401E29         C3            retn
00401E2A         B0 39         mov al,39                                         试练码第一位若为6的跳转处
00401E2C         5D            pop ebp
00401E2D         C3            retn
00401E2E         B0 31         mov al,31                                         试练码第一位若为7的跳转处
00401E30         5D            pop ebp
00401E31         C3            retn
00401E32         B0 33         mov al,33                                         试练码第一位若为8的跳转处  
00401E34         5D            pop ebp
00401E35         C3            retn
00401E36         B0 37         mov al,37                                         试练码第一位若为9的跳转处
00401E38         5D            pop ebp
00401E39         C3            retn
00401E3A         33C0          xor eax,eax
00401E3C         5D            pop ebp
00401E3D         C3            retn



**********************************************************************************

算法总结:这又是一个菜鸟学习的好文,算法很简单,注册码只与位数、试练码的第一位及第七位有关,其余位数随意。具体分析如下:

1.注册码位数一定要12位,并且第一位必须为0-9的数字,不能为字母及其他符号;
2.若第一位数字为0,则注册码的第7位必须为8;
  若第一位数字为1,则注册码的第7位必须为6;
  若第一位数字为2,则注册码的第7位必须为4;
  若第一位数字为3,则注册码的第7位必须为0;
  若第一位数字为4,则注册码的第7位必须为5;
  若第一位数字为5,则注册码的第7位必须为2;
  若第一位数字为6,则注册码的第7位必须为9;
  若第一位数字为7,则注册码的第7位必须为1;
  若第一位数字为8,则注册码的第7位必须为3;
  若第一位数字为9,则注册码的第7位必须为7;

  这样组合起来的12位注册码便为真正的注册码,如123456689012等。