-
-
[旧帖] [原创]破解ex1402.rar_582 0.00雪花
-
发表于: 2016-2-19 16:42 1510
-
CrackMe提供者:tane
原帖:http://bbs.pediy.com/showthread.php?t=9655
工具:od,vc
平台:winxpsp3
这是一个delphi程序,有简单的壳。脱壳后,运行程序可以看到注册信息和提示,“No keyfile found!”。根据提示可知程序需要授权文件。给函数CreateFile下断点,就可以找到验证处理函数。
00426572 . BA 4C674200 mov edx, 0042674C ; ASCII "ctm_cm02.key"
00426577 . 8D85 A8FEFEFF lea eax, dword ptr [ebp+FFFEFEA8]
0042657D . E8 3FD8FDFF call 00403DC1
00426582 . BA 01000000 mov edx, 1
00426587 . 8D85 A8FEFEFF lea eax, dword ptr [ebp+FFFEFEA8]
0042658D . E8 1EDCFDFF call 004041B0
00426592 . E8 4DC1FDFF call 004026E4
00426597 . 85C0 test eax, eax
00426599 . 0F85 66010000 jnz 00426705
0042659F . 8D85 A8FEFEFF lea eax, dword ptr [ebp+FFFEFEA8]
004265A5 . E8 5AD9FDFF call 00403F04
004265AA . E8 F9C0FDFF call 004026A8
004265AF . 8945 FC mov dword ptr [ebp-4], eax
004265B2 . 837D FC 00 cmp dword ptr [ebp-4], 0
004265B6 . 75 15 jnz short 004265CD
004265B8 . BA 64674200 mov edx, 00426764 ; ASCII "Key file is empty!"
004265BD . 8B83 B0010000 mov eax, dword ptr [ebx+1B0]
004265C3 . E8 CCB6FEFF call 00411C94
004265C8 . E9 28010000 jmp 004266F5
爆破点1:
00426599 . /0F85 66010000 jnz 00426705
该点破掉授权文件不存在验证。
爆破点2:
004266D1 . /EB 22 jmp short 004266F5
该点破掉使用无效文件句柄异常。
爆破之后发现提示信息不完美。应该显示注册信息的地方被大量s字母占据。仔细看了一下验证过程,发现算法非常简洁。
00426600 . 8DB5 FCFFFEFF lea esi, dword ptr [ebp+FFFEFFFC]
00426606 . 8DBD FBFFFEFF lea edi, dword ptr [ebp+FFFEFFFB]
0042660C . 31C0 xor eax, eax
0042660E . 83CA FF or edx, FFFFFFFF
00426611 . 31DB xor ebx, ebx
00426613 . 40 inc eax
00426614 . F7D2 not edx
00426616 > 8A1C16 mov bl, byte ptr [esi+edx]
00426619 . 84DB test bl, bl
0042661B . 74 29 je short 00426646
0042661D . E8 16000000 call 00426638
00426622 . 52 push edx
00426623 . F7E3 mul ebx
00426625 . 5A pop edx
00426626 . 35 326D5463 xor eax, 63546D32
0042662B . FEC2 inc dl
0042662D . 39CA cmp edx, ecx
0042662F . 74 42 je short 00426673
00426631 . 80FA FF cmp dl, 0FF
00426634 . 74 3D je short 00426673
00426636 .^ EB DE jmp short 00426616
00426638 /$ 57 push edi
00426639 |. 8DBD F4FFFEFF lea edi, dword ptr [ebp+FFFEFFF4]
0042663F |. 8B3F mov edi, dword ptr [edi]
00426641 |. 881C17 mov byte ptr [edi+edx], bl
00426644 |. 5F pop edi
00426645 \. C3 retn
00426646 > E8 EDFFFFFF call 00426638
0042664B . 42 inc edx
0042664C . 83C2 04 add edx, 4
0042664F . 39D1 cmp ecx, edx
00426651 . 75 20 jnz short 00426673
00426653 . 83EA 04 sub edx, 4
00426656 . 85C0 test eax, eax
00426658 . 76 02 jbe short 0042665C
0042665A . D1E8 shr eax, 1
0042665C > 3B0416 cmp eax, dword ptr [esi+edx]
于是决定尝试写keygen。刚开始,由于思路错误,加上
00426658 . 76 02 jbe short 0042665C
0042665A . D1E8 shr eax, 1
这两句没真正看懂,我指定了结果为零进行逆运算,结果陷入了误区。在此向elance表示感谢。看了他的分析和keygen,我知道了自己的问题。我没有他那么好的c语言功底,就混杂着汇编写了这个keygen
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
char name[256];
char *pname;
FILE* hfile;
long lkey,len;
printf("请输入注册用户名;");
pname = gets_s(name,256);
_asm
{
mov esi,pname
mov eax,1
xor ecx,ecx
xor ebx,ebx
}
loopsum:
_asm
{
mov bl,[esi+ecx]
test bl,bl
jz writefile
xor edx,edx
mul ebx
xor eax,0x63546d32
inc ecx
cmp ecx,0xff
jb loopsum
}
printf("错误:注册名太长");
return 0;
writefile:
_asm{
shr eax,1
mov [lkey],eax
mov [len],ecx
}
fopen_s(&hfile,"ctm_cm02.key","w");
fwrite(pname,sizeof(char),len+1,hfile);
fwrite(&lkey,sizeof(long),1,hfile);
fclose(hfile);
return 0;
}
原帖:http://bbs.pediy.com/showthread.php?t=9655
工具:od,vc
平台:winxpsp3
这是一个delphi程序,有简单的壳。脱壳后,运行程序可以看到注册信息和提示,“No keyfile found!”。根据提示可知程序需要授权文件。给函数CreateFile下断点,就可以找到验证处理函数。
00426572 . BA 4C674200 mov edx, 0042674C ; ASCII "ctm_cm02.key"
00426577 . 8D85 A8FEFEFF lea eax, dword ptr [ebp+FFFEFEA8]
0042657D . E8 3FD8FDFF call 00403DC1
00426582 . BA 01000000 mov edx, 1
00426587 . 8D85 A8FEFEFF lea eax, dword ptr [ebp+FFFEFEA8]
0042658D . E8 1EDCFDFF call 004041B0
00426592 . E8 4DC1FDFF call 004026E4
00426597 . 85C0 test eax, eax
00426599 . 0F85 66010000 jnz 00426705
0042659F . 8D85 A8FEFEFF lea eax, dword ptr [ebp+FFFEFEA8]
004265A5 . E8 5AD9FDFF call 00403F04
004265AA . E8 F9C0FDFF call 004026A8
004265AF . 8945 FC mov dword ptr [ebp-4], eax
004265B2 . 837D FC 00 cmp dword ptr [ebp-4], 0
004265B6 . 75 15 jnz short 004265CD
004265B8 . BA 64674200 mov edx, 00426764 ; ASCII "Key file is empty!"
004265BD . 8B83 B0010000 mov eax, dword ptr [ebx+1B0]
004265C3 . E8 CCB6FEFF call 00411C94
004265C8 . E9 28010000 jmp 004266F5
爆破点1:
00426599 . /0F85 66010000 jnz 00426705
该点破掉授权文件不存在验证。
爆破点2:
004266D1 . /EB 22 jmp short 004266F5
该点破掉使用无效文件句柄异常。
爆破之后发现提示信息不完美。应该显示注册信息的地方被大量s字母占据。仔细看了一下验证过程,发现算法非常简洁。
00426600 . 8DB5 FCFFFEFF lea esi, dword ptr [ebp+FFFEFFFC]
00426606 . 8DBD FBFFFEFF lea edi, dword ptr [ebp+FFFEFFFB]
0042660C . 31C0 xor eax, eax
0042660E . 83CA FF or edx, FFFFFFFF
00426611 . 31DB xor ebx, ebx
00426613 . 40 inc eax
00426614 . F7D2 not edx
00426616 > 8A1C16 mov bl, byte ptr [esi+edx]
00426619 . 84DB test bl, bl
0042661B . 74 29 je short 00426646
0042661D . E8 16000000 call 00426638
00426622 . 52 push edx
00426623 . F7E3 mul ebx
00426625 . 5A pop edx
00426626 . 35 326D5463 xor eax, 63546D32
0042662B . FEC2 inc dl
0042662D . 39CA cmp edx, ecx
0042662F . 74 42 je short 00426673
00426631 . 80FA FF cmp dl, 0FF
00426634 . 74 3D je short 00426673
00426636 .^ EB DE jmp short 00426616
00426638 /$ 57 push edi
00426639 |. 8DBD F4FFFEFF lea edi, dword ptr [ebp+FFFEFFF4]
0042663F |. 8B3F mov edi, dword ptr [edi]
00426641 |. 881C17 mov byte ptr [edi+edx], bl
00426644 |. 5F pop edi
00426645 \. C3 retn
00426646 > E8 EDFFFFFF call 00426638
0042664B . 42 inc edx
0042664C . 83C2 04 add edx, 4
0042664F . 39D1 cmp ecx, edx
00426651 . 75 20 jnz short 00426673
00426653 . 83EA 04 sub edx, 4
00426656 . 85C0 test eax, eax
00426658 . 76 02 jbe short 0042665C
0042665A . D1E8 shr eax, 1
0042665C > 3B0416 cmp eax, dword ptr [esi+edx]
于是决定尝试写keygen。刚开始,由于思路错误,加上
00426658 . 76 02 jbe short 0042665C
0042665A . D1E8 shr eax, 1
这两句没真正看懂,我指定了结果为零进行逆运算,结果陷入了误区。在此向elance表示感谢。看了他的分析和keygen,我知道了自己的问题。我没有他那么好的c语言功底,就混杂着汇编写了这个keygen
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
char name[256];
char *pname;
FILE* hfile;
long lkey,len;
printf("请输入注册用户名;");
pname = gets_s(name,256);
_asm
{
mov esi,pname
mov eax,1
xor ecx,ecx
xor ebx,ebx
}
loopsum:
_asm
{
mov bl,[esi+ecx]
test bl,bl
jz writefile
xor edx,edx
mul ebx
xor eax,0x63546d32
inc ecx
cmp ecx,0xff
jb loopsum
}
printf("错误:注册名太长");
return 0;
writefile:
_asm{
shr eax,1
mov [lkey],eax
mov [len],ecx
}
fopen_s(&hfile,"ctm_cm02.key","w");
fwrite(pname,sizeof(char),len+1,hfile);
fwrite(&lkey,sizeof(long),1,hfile);
fclose(hfile);
return 0;
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
看原图
赞赏
雪币:
留言: