【破文标题】:菜鸟看懂算法以后之三_____快刀英语V1.15算法分析
【破解目标】:快刀英语V1.15
【破解作者】:jney2
【破解日期】:2005年4月26日
【作者声明】:破解,我是菜鸟,更要学习,练习!!!一点心得,大家分享。如有错误,蒙请老大指正。
【破解平台】:XP+OD
【算法分析】:

一、
005070E0   .  55             push ebp
005070E1   .  8BEC           mov ebp,esp
005070E3   .  B9 15000000    mov ecx,15
005070E8   >  6A 00          push 0
005070EA   .  6A 00          push 0
005070EC   .  49             dec ecx
005070ED   .^ 75 F9          jnz short 快刀英语.005070E8
005070EF   .  53             push ebx
005070F0   .  56             push esi
005070F1   .  57             push edi
005070F2   .  8BD8           mov ebx,eax
005070F4   .  33C0           xor eax,eax
005070F6   .  55             push ebp
005070F7   .  68 BC745000    push 快刀英语.005074BC
005070FC   .  64:FF30        push dword ptr fs:[eax]
005070FF   .  64:8920        mov dword ptr fs:[eax],esp
00507102   .  BE D0745000    mov esi,快刀英语.005074D0
00507107   .  8D7D BA        lea edi,dword ptr ss:[ebp-46]
0050710A   .  B9 08000000    mov ecx,8
0050710F   .  F3:A5          rep movs dword ptr es:[edi],dword ptr ds:[esi]
00507111   .  A4             movs byte ptr es:[edi],byte ptr ds:[esi]
00507112   .  8D55 B4        lea edx,dword ptr ss:[ebp-4C]
00507115   .  8B83 04030000  mov eax,dword ptr ds:[ebx+304]
0050711B   .  E8 3CD3F5FF    call 快刀英语.0046445C
00507120   .  8B45 B4        mov eax,dword ptr ss:[ebp-4C]                   ;eax=01472814, (ASCII "F4E8-C8D4") 机器码

00507123   .  50             push eax
00507124   .  8D55 B0        lea edx,dword ptr ss:[ebp-50]
00507127   .  8B83 FC020000  mov eax,dword ptr ds:[ebx+2FC]
0050712D   .  E8 2AD3F5FF    call 快刀英语.0046445C
00507132   .  8B55 B0        mov edx,dword ptr ss:[ebp-50]                  ;EDX 0146E75C ASCII "jney2@21cn.com" 邮件地址
00507135   .  8D45 FC        lea eax,dword ptr ss:[ebp-4]
00507138   .  59             pop ecx                                        ;ECX 01472814 ASCII "F4E8-C8D4"
00507139   .  E8 B2D4EFFF    call 快刀英语.004045F0
0050713E   .  6A 20          push 20
00507140   .  8D45 BA        lea eax,dword ptr ss:[ebp-46]
00507143   .  50             push eax
00507144   .  8B45 FC        mov eax,dword ptr ss:[ebp-4]                    ;EAX 0146E778 ASCII "jney2@21cn.comF4E8-C8D4"
00507147   .  E8 58D6EFFF    call 快刀英语.004047A4
0050714C   .  50             push eax
0050714D   .  E8 86FFFFFF    call <jmp.&mcd.MakeCode>                        ;看函数名就知道是关键CALL了,F7跟进
00507152   .  8D45 AC        lea eax,dword ptr ss:[ebp-54]
00507155   .  8D55 BA        lea edx,dword ptr ss:[ebp-46]
00507158   .  B9 21000000    mov ecx,21
0050715D   .  E8 F2D3EFFF    call 快刀英语.00404554
00507162   .  8B45 AC        mov eax,dword ptr ss:[ebp-54]
00507165   .  50             push eax
00507166   .  8D55 A8        lea edx,dword ptr ss:[ebp-58]
00507169   .  8B83 00030000  mov eax,dword ptr ds:[ebx+300]
0050716F   .  E8 E8D2F5FF    call 快刀英语.0046445C
00507174   .  8B55 A8        mov edx,dword ptr ss:[ebp-58]                   ;假码
00507177   .  58             pop eax                                         ;真码
00507178   .  E8 73D5EFFF    call 快刀英语.004046F0                          ;在此可作内存注册机
0050717D   .  74 1D          je short 快刀英语.0050719C
0050717F   .  6A 10          push 10
00507181   .  B9 F4745000    mov ecx,快刀英语.005074F4
00507186   .  BA FC745000    mov edx,快刀英语.005074FC
0050718B   .  A1 18EE5000    mov eax,dword ptr ds:[50EE18]
00507190   .  8B00           mov eax,dword ptr ds:[eax]
00507192   .  E8 45D5F7FF    call 快刀英语.004846DC
00507197   .  E9 77020000    jmp 快刀英语.00507413
0050719C   >  A1 A8EC5000    mov eax,dword ptr ds:[50ECA8]
005071A1   .  8B00           mov eax,dword ptr ds:[eax]
005071A3   .  FFB0 60050000  push dword ptr ds:[eax+560]
005071A9   .  A1 A8EC5000    mov eax,dword ptr ds:[50ECA8]

二、

00382371    8BEC             mov ebp,esp
00382373    6A 00            push 0
00382375    6A 00            push 0
00382377    53               push ebx
00382378    56               push esi
00382379    57               push edi
0038237A    33C0             xor eax,eax
0038237C    55               push ebp
0038237D    68 F2233800      push mcd.003823F2
00382382    64:FF30          push dword ptr fs:[eax]
00382385    64:8920          mov dword ptr fs:[eax],esp
00382388    33DB             xor ebx,ebx
0038238A    33C0             xor eax,eax
0038238C    55               push ebp
0038238D    68 C6233800      push mcd.003823C6
00382392    64:FF30          push dword ptr fs:[eax]
00382395    64:8920          mov dword ptr fs:[eax],esp
00382398    8D45 F8          lea eax,dword ptr ss:[ebp-8]
0038239B    8B55 08          mov edx,dword ptr ss:[ebp+8]
0038239E    E8 DD17FFFF      call mcd.00373B80
003823A3    8B45 F8          mov eax,dword ptr ss:[ebp-8]                ;EAX 01350B0C ASCII "jney2@21cn.comF4E8-C8D4"
003823A6    8D55 FC          lea edx,dword ptr ss:[ebp-4]
003823A9    E8 8AFEFFFF      call mcd.00382238                           ;关键CALL,F7跟进
003823AE    8B4D 10          mov ecx,dword ptr ss:[ebp+10]
003823B1    8B55 FC          mov edx,dword ptr ss:[ebp-4]
003823B4    8B45 0C          mov eax,dword ptr ss:[ebp+C]
003823B7    E8 F84BFFFF      call mcd.00376FB4
003823BC    33C0             xor eax,eax
003823BE    5A               pop edx
003823BF    59               pop ecx
003823C0    59               pop ecx
003823C1    64:8910          mov dword ptr fs:[eax],edx
003823C4    EB 11            jmp short mcd.003823D7
003823C6  ^ E9 310EFFFF      jmp mcd.003731FC
003823CB    E8 F0EDFEFF      call mcd.003711C0                              ; jmp to ntdll.RtlGetLastWin32Error
003823D0    8BD8             mov ebx,eax
003823D2    E8 0510FFFF      call mcd.003733DC
003823D7    33C0             xor eax,eax
003823D9    5A               pop edx
003823DA    59               pop ecx
003823DB    59               pop ecx
003823DC    64:8910          mov dword ptr fs:[eax],edx
003823DF    68 F9233800      push mcd.003823F9
003823E4    8D45 F8          lea eax,dword ptr ss:[ebp-8]
003823E7    BA 02000000      mov edx,2
003823EC    E8 BB15FFFF      call mcd.003739AC
003823F1    C3               retn
003823F2  ^ E9 310FFFFF      jmp mcd.00373328
003823F7  ^ EB EB            jmp short mcd.003823E4
003823F9    8BC3             mov eax,ebx
003823FB    5F               pop edi
003823FC    5E               pop esi
003823FD    5B               pop ebx
003823FE    59               pop ecx
003823FF    59               pop ecx
00382400    5D               pop ebp
00382401    C2 0C00          retn 0C

三、

00382238    55               push ebp
00382239    8BEC             mov ebp,esp
0038223B    83C4 EC          add esp,-14
0038223E    53               push ebx
0038223F    56               push esi
00382240    57               push edi
00382241    33C9             xor ecx,ecx
00382243    894D EC          mov dword ptr ss:[ebp-14],ecx
00382246    894D F0          mov dword ptr ss:[ebp-10],ecx
00382249    8BF2             mov esi,edx
0038224B    8945 F8          mov dword ptr ss:[ebp-8],eax
0038224E    8B45 F8          mov eax,dword ptr ss:[ebp-8]
00382251    E8 BE1BFFFF      call mcd.00373E14
00382256    33C0             xor eax,eax
00382258    55               push ebp
00382259    68 54233800      push mcd.00382354
0038225E    64:FF30          push dword ptr fs:[eax]
00382261    64:8920          mov dword ptr fs:[eax],esp
00382264    8B45 F8          mov eax,dword ptr ss:[ebp-8]
00382267    E8 B819FFFF      call mcd.00373C24                   ; 取字符串长度
0038226C    8945 F4          mov dword ptr ss:[ebp-C],eax        ;EAX为长度,保存在dword ptr ss:[ebp-C]
0038226F    8BC6             mov eax,esi
00382271    E8 1217FFFF      call mcd.00373988
00382276    33C0             xor eax,eax
00382278    8945 FC          mov dword ptr ss:[ebp-4],eax
0038227B    8B7D F4          mov edi,dword ptr ss:[ebp-C]         ;取字符串长度
0038227E    85FF             test edi,edi
00382280    7C 12            jl short mcd.00382294
00382282    47               inc edi
00382283    33DB             xor ebx,ebx
00382285    8B45 F8          mov eax,dword ptr ss:[ebp-8]
00382288    0FB64418 FF      movzx eax,byte ptr ds:[eax+ebx-1]
0038228D    0145 FC          add dword ptr ss:[ebp-4],eax
00382290    43               inc ebx
00382291    4F               dec edi
00382292  ^ 75 F1            jnz short mcd.00382285                ;该循环将字符串每个字符的ASCII值累加保存在dword ptr ss:[ebp-4]
00382294    8B7D F4          mov edi,dword ptr ss:[ebp-C]          ;取字符串长度
00382297    85FF             test edi,edi
00382299    7E 26            jle short mcd.003822C1
0038229B    BB 01000000      mov ebx,1
003822A0    55               push ebp
003822A1    8D4D F0          lea ecx,dword ptr ss:[ebp-10]
003822A4    8B45 F8          mov eax,dword ptr ss:[ebp-8]
003822A7    8A4418 FF        mov al,byte ptr ds:[eax+ebx-1]         ;取字符串的第N位ASCII值
003822AB    8BD3             mov edx,ebx                            ;N位
003822AD    E8 E6FEFFFF      call mcd.00382198                      ;关键CALL
003822B2    59               pop ecx
003822B3    8B55 F0          mov edx,dword ptr ss:[ebp-10]
003822B6    8BC6             mov eax,esi
003822B8    E8 6F19FFFF      call mcd.00373C2C
003822BD    43               inc ebx
003822BE    4F               dec edi
003822BF  ^ 75 DF            jnz short mcd.003822A0
003822C1    BF 01000000      mov edi,1
003822C6    8B06             mov eax,dword ptr ds:[esi]          ;取字符串首地址:EAX 01350B50 ASCII "ondsipt2b7KxononihKxonSzqmNfWqsFSzqmdHdsDFk5t2"
003822C8    E8 5719FFFF      call mcd.00373C24                   ; 取字符串长度
003822CD    8BD8             mov ebx,eax                         ;EAX为长度
003822CF    83FB 18          cmp ebx,18
003822D2    7F 2E            jg short mcd.00382302               ;字符长度大于24位跳走,如果不够则再重新取“邮件地址+机器码”字符串进行处理直到注册码满足25位。
003822D4    55               push ebp
003822D5    8B45 F8          mov eax,dword ptr ss:[ebp-8]
003822D8    8A4438 FF        mov al,byte ptr ds:[eax+edi-1]
003822DC    8D4D EC          lea ecx,dword ptr ss:[ebp-14]
003822DF    8BD3             mov edx,ebx
003822E1    E8 B2FEFFFF      call mcd.00382198
003822E6    59               pop ecx
003822E7    8B55 EC          mov edx,dword ptr ss:[ebp-14]
003822EA    8BC6             mov eax,esi
003822EC    E8 3B19FFFF      call mcd.00373C2C
003822F1    47               inc edi
003822F2    3B7D F4          cmp edi,dword ptr ss:[ebp-C]
003822F5    75 05            jnz short mcd.003822FC
003822F7    BF 01000000      mov edi,1
003822FC    43               inc ebx
003822FD    83FB 19          cmp ebx,19                      
00382300  ^ 75 D2            jnz short mcd.003822D4             ;字符长度不为25则继续循环
00382302    BB 04000000      mov ebx,4
00382307    8D0C9B           lea ecx,dword ptr ds:[ebx+ebx*4]
0038230A    41               inc ecx
0038230B    8BD6             mov edx,esi
0038230D    B8 6C233800      mov eax,mcd.0038236C
00382312    E8 F51BFFFF      call mcd.00373F0C
00382317    4B               dec ebx
00382318    85DB             test ebx,ebx
0038231A  ^ 75 EB            jnz short mcd.00382307              ;以上循环在得到的25位字符中每隔5位插入字符“-”
0038231C    8B06             mov eax,dword ptr ds:[esi]
0038231E    E8 0119FFFF      call mcd.00373C24
00382323    8BC8             mov ecx,eax
00382325    8BC6             mov eax,esi
00382327    BA 1E000000      mov edx,1E
0038232C    E8 931BFFFF      call mcd.00373EC4
00382331    33C0             xor eax,eax
00382333    5A               pop edx
00382334    59               pop ecx
00382335    59               pop ecx
00382336    64:8910          mov dword ptr fs:[eax],edx
00382339    68 5B233800      push mcd.0038235B
0038233E    8D45 EC          lea eax,dword ptr ss:[ebp-14]
00382341    BA 02000000      mov edx,2
00382346    E8 6116FFFF      call mcd.003739AC
0038234B    8D45 F8          lea eax,dword ptr ss:[ebp-8]
0038234E    E8 3516FFFF      call mcd.00373988
00382353    C3               retn
00382354  ^ E9 CF0FFFFF      jmp mcd.00373328
00382359  ^ EB E3            jmp short mcd.0038233E
0038235B    5F               pop edi
0038235C    5E               pop esi                                        ; 快刀英语.005074F1
0038235D    5B               pop ebx
0038235E    8BE5             mov esp,ebp
00382360    5D               pop ebp
00382361    C3               retn

四、

00382198    55               push ebp
00382199    8BEC             mov ebp,esp
0038219B    83C4 F8          add esp,-8
0038219E    53               push ebx
0038219F    56               push esi
003821A0    57               push edi
003821A1    8BF9             mov edi,ecx
003821A3    8955 F8          mov dword ptr ss:[ebp-8],edx
003821A6    8845 FF          mov byte ptr ss:[ebp-1],al
003821A9    8B45 08          mov eax,dword ptr ss:[ebp+8]
003821AC    8B40 FC          mov eax,dword ptr ds:[eax-4]                 ;"jney2@21cn.comF4E8-C8D4"的ASCII值累加和
003821AF    B9 05000000      mov ecx,5
003821B4    99               cdq
003821B5    F7F9             idiv ecx                                      ; 除以5
003821B7    8BDA             mov ebx,edx                                   ; 余数入EBX      
003821B9    4B               dec ebx
003821BA    74 0B            je short mcd.003821C7                         
003821BC    4B               dec ebx
003821BD    74 14            je short mcd.003821D3
003821BF    4B               dec ebx
003821C0    74 1D            je short mcd.003821DF
003821C2    4B               dec ebx
003821C3    74 26            je short mcd.003821EB
003821C5    EB 30            jmp short mcd.003821F7
003821C7    BB 02000000      mov ebx,2                                     ; 余数为1的参数:2,2 得到第1位(字符长度为3)
003821CC    BE 02000000      mov esi,2
003821D1    EB 2E            jmp short mcd.00382201
003821D3    BB 03000000      mov ebx,3                                     ; 余数为2的参数:3,1 得到前1、2位
003821D8    BE 01000000      mov esi,1
003821DD    EB 22            jmp short mcd.00382201
003821DF    BB 02000000      mov ebx,2                                     ; 余数为3的参数:2,1 得到第1、3位
003821E4    BE 01000000      mov esi,1
003821E9    EB 16            jmp short mcd.00382201
003821EB    BB 01000000      mov ebx,1                                     ; 余数为4的参数:1,2 得到第3位
003821F0    BE 02000000      mov esi,2
003821F5    EB 0A            jmp short mcd.00382201
003821F7    BB 01000000      mov ebx,1                                     ; 余数为0的参数:1,1 得到第2、3位
003821FC    BE 01000000      mov esi,1
00382201    33C0             xor eax,eax
00382203    8A45 FF          mov al,byte ptr ss:[ebp-1]                    ;取字符串的第N位的ASCII值
00382206    0345 F8          add eax,dword ptr ss:[ebp-8]
00382209    8B55 08          mov edx,dword ptr ss:[ebp+8]                  ;加上N
0038220C    0342 FC          add eax,dword ptr ds:[edx-4]                  ;加上"jney2@21cn.comF4E8-C8D4"的ASCII值累加和
0038220F    B9 19000000      mov ecx,19
00382214    99               cdq
00382215    F7F9             idiv ecx                                       ;除以25
00382217    8B1495 A4333800  mov edx,dword ptr ds:[edx*4+3833A4]            ;根据余数获得不同的字符串
0038221E    8BC7             mov eax,edi
00382220    E8 B717FFFF      call mcd.003739DC                              ;根据前面5种参数取得相应和字符子串
                                                                            ;具体规则:将EDX所指待处理字符串的第EBX
位起连续去掉ESI位字符,余下的字符即为新的字符子串;(见上所列)

00382225    8BC7             mov eax,edi
00382227    8BCE             mov ecx,esi
00382229    8BD3             mov edx,ebx
0038222B    E8 941CFFFF      call mcd.00373EC4
00382230    5F               pop edi
00382231    5E               pop esi
00382232    5B               pop ebx
00382233    59               pop ecx
00382234    59               pop ecx
00382235    5D               pop ebp
00382236    C3               retn

五、字符对照表:

余数为0对应的字符串:Pk5
余数为1对应的字符串:BsO
余数为2对应的字符串:1wd
余数为3对应的字符串:TsF
余数为4对应的字符串:39d
余数为5对应的字符串:IKx
余数为6对应的字符串:aA6
余数为7对应的字符串:0Yc
余数为8对应的字符串:eNf
余数为9对应的字符串:3qm
余数为10对应的字符串:Zt2
余数为11对应的字符串:xVj
余数为12对应的字符串:hDF
余数为13对应的字符串:UzC
余数为14对应的字符串:uip
余数为15对应的字符串:4b7
余数为16对应的字符串:nMJ
余数为17对应的字符串:kon
余数为18对应的字符串:Zih
余数为19对应的字符串:Qdg
余数为20对应的字符串:KWq
余数为21对应的字符串:vSz
余数为22对应的字符串:7ds
余数为23对应的字符串:prR
余数为24对应的字符串:fdH

六、算法总结:
1、“邮件地址+机器码”字符串是算法入口参数;如:"jney2@21cn.comF4E8-C8D4"
2、将“邮件地址+机器码”字符串的ASCII值累加;
3、利用(ASCII值累加和+第N位ASCII值+N)MOD 25 的余数查找对应的字符串;
4、ASCII值累加和 MOD 5 的余数将决定截取子串的方式,然后取得相应的子串;
5、将取得的子串连在一起,如果“邮件地址+机器码”字符串处理完后得到的字符串超过25位则只取前25位字符作为注册码;如果“邮件地址+机器码”字符串处理完后得到注册码不够25位,将重复算法第3、4步直到注册码满足25位;
6、将25位注册码第隔5位添加-,然后得到真正的29位注册码;
7、真码与假码比较。


本文完。