标 题:DDXia主页crackme中的aLoNg3x的破解过程(难度:简单)
(4千字)
发信人:cqzrd
时 间:2000-5-27 9:03:16
详细信息:
这次破的软件是DDXia主页(http://go.163.com/~ddxia/)中crackme中的aLoNg3x
(解压后名字为crackme100.exe ),有兴趣的同志可以去下一个来试试。
功能:无,专供练手。级别:1。
工具:TRW2000121。
步骤:
1、打开后在name框中输入大名,字母数必须>5个,原因在后面会讲到。
code框随便输入几个数即可。
2、bpx hmemcpy设断。F5 退出。
3、再随便输入一个数,TRW弹出。
4、pmodule返回程式空间。不断按F10,直到:
00442CE7 8D55F8
lea edx, dword ptr [ebp-08]
00442CEA 8B83E0020000 mov eax, dword
ptr [ebx+000002E0]
00442CF0 E8CB05FEFF call 004232C0
--->获取name及其字数
00442CF5 8B45F8
mov eax, dword ptr [ebp-08]
00442CF8 50
push eax
00442CF9 8D55F0
lea edx, dword ptr [ebp-10]
00442CFC 8B83DC020000 mov eax, dword
ptr [ebx+000002DC]
00442D02 E8B905FEFF call 004232C0
--->获取code
00442D07 8B45F0
mov eax, dword ptr [ebp-10]
00442D0A 5A
pop edx
00442D0B E82CFDFFFF call 00442A3C
--->***在此换F8切入。***
00442D10 84C0
test al, al --->若al=0则去死。
00442D12 740F
je 00442D23
此处是call 00442A3C的内容:
015F:00442A3C PUSH EBP
015F:00442A3D MOV EBP,ESP
015F:00442A3F ADD ESP,BYTE -08
015F:00442A42 PUSH EBX
015F:00442A43 PUSH ESI
015F:00442A44 MOV [EBP-08],EDX
015F:00442A47 MOV [EBP-04],EAX
015F:00442A4A MOV EAX,[EBP-04]
015F:00442A4D CALL 00403BE8
015F:00442A52 MOV EAX,[EBP-08]
015F:00442A55 CALL 00403BE8
015F:00442A5A XOR EAX,EAX
015F:00442A5C PUSH EBP
015F:00442A5D PUSH DWORD 00442AE5
015F:00442A62 PUSH DWORD [FS:EAX]
015F:00442A65 MOV [FS:EAX],ESP
015F:00442A68 MOV EAX,[EBP-04]
015F:00442A6B CALL 00403A34
015F:00442A70 CMP EAX,BYTE +05 --->比较name长度是否>5。
015F:00442A73 JNG 00442AC8 --->若不大于则去死。
015F:00442A75 MOV EAX,[EBP-04]
015F:00442A78 CALL 00403A34
015F:00442A7D MOV EBX,EAX
015F:00442A7F MOV EAX,[EBP-04]
015F:00442A82 CALL 00403A34
015F:00442A87 MOV EDX,EAX
015F:00442A89 DEC EDX
015F:00442A8A TEST EDX,EDX
015F:00442A8C JNG 00442AAE
015F:00442A8E MOV EAX,01 --->EAX置1
015F:00442A93 MOV ECX,[EBP-04]
015F:00442A96 MOVZX ECX,BYTE [ECX+EAX-01] --->取name的第一个字母。
015F:00442A9B MOV ESI,[EBP-04]
015F:00442A9E MOVZX ESI,BYTE [ESI+EAX] --->取name的第二个字母。
015F:00442AA2 IMUL ECX,ESI —
015F:00442AA5 IMUL ECX,EAX |
015F:00442AA8 ADD EBX,ECX |
该段通过name换算出一个数num
015F:00442AAA INC EAX
|
015F:00442AAB DEC EDX
|
015F:00442AAC JNZ 00442A93 —
015F:00442AAE MOV EAX,[EBP-08]
015F:00442AB1 CALL 00407670 --->获取code并转为Hex放入EAX。
015F:00442AB6 SUB EBX,EAX
015F:00442AB8 CMP EBX,029A --->比较num与code之差是否为029A(666)
015F:00442ABE JNZ 00442AC4 --->若是,则OK按钮可用,否则去死。
015F:00442AC0 MOV BL,01
015F:00442AC2 JMP SHORT 00442ACA
015F:00442AC4 XOR EBX,EBX
015F:00442AC6 JMP SHORT 00442ACA
015F:00442AC8 XOR EBX,EBX
015F:00442ACA XOR EAX,EAX
015F:00442ACC POP EDX
015F:00442ACD POP ECX
015F:00442ACE POP ECX
015F:00442ACF MOV [FS:EAX],EDX
015F:00442AD2 PUSH DWORD 00442AEC
015F:00442AD7 LEA EAX,[EBP-08]
015F:00442ADA MOV EDX,02
015F:00442ADF CALL 004037DC
015F:00442AE4 RET
至此,破解过程完成。有趣的是在该段call内,有一个call(具体哪个我忘了)是判断输
入的code的第一个字母是数字异或是-、+、$、x、X、0等,若是则会有另一番判断过程。有兴
趣的同志可以自己进去看看。下面是我用TC2写的注册机:
main()
{char a[10];
int i,j,c;unsigned long k,b;
aa: printf("Please input your name:");
gets(a);
i=strlen(a); k=i;
if (i<6||i>10)
{printf("Length of your name must be in 6 and 10:\n");
goto aa;}
for (j=0;j<i-1;j++)
{ b=a[j];
c=a[j+1];
b=b*c*(j+1);
k=k+b; }
printf("Your code is: %ld\n",k-666);}
===============<完>=================