【破文标题】:菜鸟看懂算法以后之三_____快刀英语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、真码与假码比较。
本文完。