算法分析——幼儿学语言 2003.4 (P-Code) 开 发 商: http://www.mykidhome.com
【软件限制】:功能限制 【作者声明】:初学Crack,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教! 【破解工具】:TRW2000娃娃修改版、Ollydbg1.09、PEiD、W32Dasm 9.0白金版 ————————————————————————————————— 【过 程】: 朋友拿来这个大家伙,说要给他未来的baby找一个好玩的程序。^O^ ^O^ 打开一看又是P-Code!哎,再看看,知道碰上难缠的“对手”了。重新静下心来细心跟踪,也想试试WKTVBDE,无奈字体太小,只好还是用我顺手的武器。 曾有朋友问是如何找到某某核心代码的,我有点哑口无言。一般的程序用那些常用的断点就差不多了,看看相关的资料及其他朋友的笔记就能明白。但是还有一些东东比较奇特,作者或许自己就是CRACK高手吧,让人有点无处下手的感觉。这时就需要耐心和细心了,最好还能有一点点的运气。 ^O^ ^O^ 譬如下面的这点代码,我整整分析了一个通宵才追出来!作者尽量避开了我们常用的拦截断点,中间还搀杂了大量的其它运算,让人转的头晕目眩。^O^ ^O^ 但是,秘密总会藏在里面的,就让我们披沙沥金吧。
幼儿学语言.exe 无壳。 Visual Basic 6.0 编写,P-Code。
序列号:555490825 试炼码:123456789-54321 ————————————————————————————————— 一、注册码中间要有-(2D)
660146D5 55 PUSH EBP 660146D6 8BEC MOV EBP,ESP 660146D8 57 PUSH EDI 660146D9 8B7D 08 MOV EDI,DWORD PTR SS:[EBP+8] ====>EDI=123456789-54321 试炼码
660146DC 8B4D 10 MOV ECX,DWORD PTR SS:[EBP+10] 660146DF 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C] ====>AX=2D
660146E2 0BE4 OR ESP,ESP 660146E4 F2:66:AF REPNE SCAS WORD PTR ES:[EDI] ====>逐位比较输入的试炼码中是否有-
660146E7 B8 00000000 MOV EAX,0 660146EC 75 03 JNZ SHORT MSVBVM60.660146F1 ====>有 - 则不跳
660146EE 8D47 FE LEA EAX,DWORD PTR DS:[EDI-2] 660146F1 5F POP EDI 660146F2 5D POP EBP 660146F3 C2 0C00 RETN 0C ————————————————————————————————— 二、分别取试炼码-前后的2部分
660F91D1 8D0451 LEA EAX,DWORD PTR DS:[ECX+EDX*2] 660F91D4 50 PUSH EAX 660F91D5 FF15 E8190066 CALL DWORD PTR DS:[<&OLEAUT32.#4_SysAllo>; OLEAUT32.SysAllocStringLen 660F91DB 85C0 TEST EAX,EAX 1、 ====>EAX=123456789 试炼码的第一部分 2、 ====>EAX=54321 试炼码的第二部分
660F91DD 8907 MOV DWORD PTR DS:[EDI],EAX 660F91DF 75 22 JNZ SHORT MSVBVM60.660F9203 ————————————————————————————————— 三、分别求试炼码-前后2部分数字的16进制值
653733DD 8D0C9B LEA ECX,DWORD PTR DS:[EBX+EBX*4] 653733E0 33DB XOR EBX,EBX 653733E2 8A18 MOV BL,BYTE PTR DS:[EAX] ====>依次取试炼码的数字
653733E4 40 INC EAX 653733E5 4E DEC ESI 653733E6 8D1C4B LEA EBX,DWORD PTR DS:[EBX+ECX*2] 653733E9 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20] 653733EC 49 DEC ECX ====>计数器
653733ED 894D E0 MOV DWORD PTR SS:[EBP-20],ECX 653733F0 ^ 75 EB JNZ SHORT OLEAUT32.653733DD ====>循环运算!
653733F2 8945 F4 MOV DWORD PTR SS:[EBP-C],EAX 653733F5 895D F8 MOV DWORD PTR SS:[EBP-8],EBX 1、 ====>[ESP-8]=075BCD15(H)=123456789(D) 试炼码的第一部分 2、 ====>[ESP-8]=0000D431(H)=54321(D) 试炼码的第二部分 ————————————————————————————————— 四、其实下面得到的参数可以看作是固定值 ^-^ ^-^
66105191 58 POP EAX 66105192 66:010424 ADD WORD PTR SS:[ESP],AX 66105196 ^ 0F80 C6EEFFFF JO MSVBVM60.66104062 6610519C 33C0 XOR EAX,EAX 6610519E 8A06 MOV AL,BYTE PTR DS:[ESI] 661051A0 46 INC ESI 661051A1 FF2485 58EA0F66 JMP DWORD PTR DS:[EAX*4+660FEA58] 661051A8 58 POP EAX 661051A9 010424 ADD DWORD PTR SS:[ESP],EAX 1、 ====>[ESP]=0000674E + 00006EE8=D636 参数① 2、 ====>[ESP]=00005F20 + 0000666F=C58F
4、 ====>[ESP]=0000674E + 00005FB7=C705 5、 ====>[ESP]=0000C705 + 000051EF=118F4 参数③
661051AC ^ 0F80 B0EEFFFF JO MSVBVM60.66104062 661051B2 33C0 XOR EAX,EAX 661051B4 8A06 MOV AL,BYTE PTR DS:[ESI] 661051B6 46 INC ESI 661051B7 FF2485 58EA0F66 JMP DWORD PTR DS:[EAX*4+660FEA58] 661051BE 58 POP EAX 661051BF 5B POP EBX 661051C0 010424 ADD DWORD PTR SS:[ESP],EAX 661051C3 115C24 04 ADC DWORD PTR SS:[ESP+4],EBX 661051C7 ^ 0F80 95EEFFFF JO MSVBVM60.66104062 661051CD 33C0 XOR EAX,EAX 661051CF 8A06 MOV AL,BYTE PTR DS:[ESI] 661051D1 46 INC ESI 661051D2 FF2485 58EA0F66 JMP DWORD PTR DS:[EAX*4+660FEA58] 661051D9 DEC1 FADDP ST(1),ST 661051DB 33C0 XOR EAX,EAX 661051DD 8A06 MOV AL,BYTE PTR DS:[ESI] 661051DF 46 INC ESI 661051E0 FF2485 58EA0F66 JMP DWORD PTR DS:[EAX*4+660FEA58] 661051E7 58 POP EAX 661051E8 280424 SUB BYTE PTR SS:[ESP],AL 661051EB ^ 0F82 71EEFFFF JB MSVBVM60.66104062 661051F1 33C0 XOR EAX,EAX 661051F3 8A06 MOV AL,BYTE PTR DS:[ESI] 661051F5 46 INC ESI 661051F6 FF2485 58EA0F66 JMP DWORD PTR DS:[EAX*4+660FEA58] 661051FD 58 POP EAX 661051FE 66:290424 SUB WORD PTR SS:[ESP],AX 66105202 ^ 0F80 5AEEFFFF JO MSVBVM60.66104062 66105208 33C0 XOR EAX,EAX 6610520A 8A06 MOV AL,BYTE PTR DS:[ESI] 6610520C 46 INC ESI 6610520D FF2485 58EA0F66 JMP DWORD PTR DS:[EAX*4+660FEA58] 66105214 58 POP EAX 66105215 290424 SUB DWORD PTR SS:[ESP],EAX 3、 ====>[ESP]=0000C58F - 0000749F=50F0 参数②
66105218 ^ 0F80 44EEFFFF JO MSVBVM60.66104062 ————————————————————————————————— 五、对序列号进行运算
6610534D 59 POP ECX 6610534E 58 POP EAX 6610534F 99 CDQ 66105350 F7F9 IDIV ECX ====>EAX=211C1E09(H)=555490825(D) 序列号 1、 ====>EDX=211C1E09 % 0000D636=00008F73 2、 ====>EDX=211C1E09 % 000050F0=00002099 3、 ====>EDX=211C1E09 % 000118F4=0000550D(H)=21773(D) ★★ 66105352 52 PUSH EDX 66105353 33C0 XOR EAX,EAX 66105355 8A06 MOV AL,BYTE PTR DS:[ESI] 66105357 46 INC ESI 66105358 FF2485 58EA0F66 JMP DWORD PTR DS:[EAX*4+660FEA58]
…… ……省略…… ……
66105282 59 POP ECX 66105283 58 POP EAX 66105284 F7E9 IMUL ECX 4、 ====>ECX=00008F73 * 00002099=12441BBB(H)=306453435(D) ★★ 66105286 ^ 0F80 D6EDFFFF JO MSVBVM60.66104062 6610528C 50 PUSH EAX 6610528D 33C0 XOR EAX,EAX 6610528F 8A06 MOV AL,BYTE PTR DS:[ESI] 66105291 46 INC ESI 66105292 FF2485 58EA0F66 JMP DWORD PTR DS:[EAX*4+660FEA58] ————————————————————————————————— …… ……省略…… …… ————————————————————————————————— 六、比较注册码:呵呵,没有用 __VarBstrCmp、__vbaVarTstEq 等常用的函数呀。
660FE925 5A POP EDX 660FE926 58 POP EAX 660FE927 2BC2 SUB EAX,EDX ====>其实这里的相减就是比较2部分的值是否相等!
1、 ====>EAX=12441BBB(H)=306453435(D) 这就是注册码的第一部分 ====>EDX=075BCD15(H)=123456789(D) 试炼码的第一部分 ——————————————————— 2、 ====>EAX=0000D431(H)=54321(D) 试炼码的第二部分 ====>EDX=0000550D(H)=21773(D) 这就是注册码的第二部分
660FE929 83F8 01 CMP EAX,1 660FE92C 1BC0 SBB EAX,EAX 660FE92E 50 PUSH EAX 660FE92F 33C0 XOR EAX,EAX 660FE931 8A06 MOV AL,BYTE PTR DS:[ESI] 660FE933 46 INC ESI 660FE934 FF2485 58EA0F66 JMP DWORD PTR DS:[EAX*4+660FEA58] ———————————————————————————————— 七、最后的结局:恭喜或是Sorry ^O^ ^O^ 看你的选择了 ^O^ ^O^
6608613D FFD6 CALL ESI ====>BAD BOY! ====>呵呵,胜利女神! ————————————————————————————————— 【算 法 总 结】: 1、注册码为2部分构成:s1-s2 中间有 - 2、取序列号的16进制值 其实就是当前系统盘的硬盘序列号 设为:m 3、s1=(m%0X0000D636)*(m%0X000050F0) 4、s2=m%000118F4 看完了才知道只是这简单的几句,可是…… …… ————————————————————————————————— 【C++ KeyGen】:
#include void main() { unsigned long int m,s1,s2; cout<<"\n\n★★★★幼儿学语言 2003.4 KeyGen{14th}★★★★\n\n\n\n"; cout<<"请输入序列号:"; cin >>m; s1=(m%0X0000D636)*(m%0X000050F0); s2=m%0X000118F4; cout<<"\n呵呵,注册码:"<cout<<"\n\n\nCracked By 巢水工作坊——fly [OCN][FCG] 2003-06-06 16:00 COMPILE"; cout<<"\n\n\n * * * 按回车退出!* * *";cin.get();cin.get(); } ————————————————————————————————— 【注册信息保存】: 同目录下的 ldk.pas 文件中。 ————————————————————————————————— 【整 理】: 序列号:555490825 注册码:306453435-21773 ————————————————————————————————— |
|
查看所有2条评论>>