|
 |
推荐文章 |
|
|
|
|
|
|
|
|
|
|
|
【软件限制】:功能限制
【作者声明】:初学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<iostream.h>
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呵呵,注册码:"<<s1<<"-"<<s2<<endl;
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
———————————————————————————————— |
|
|
|
|
|
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。 |
|
|
|
|
|
责任编辑: 原点 |
投稿作者: 本站收集 |
|
|
信息来源: 网络 |
录入时间: 2005-5-26 |
|
|
|
| |
|