入门级CrackMe分析
1、CTRL + N 查看程序引入那些函数
2、下函数断点
Bpx GetDlgItemTextA 然后F9运行,中断下来。
3、找到算法入口,分析算法如下
CrackMe满足条件:
1、注册名长度在 3-9之间
2、注册码第一个字符被0x11CF整除余数为0x17
算法如下
1、 生成中间码(很啰嗦)
2、 中间码还原成真码
3、 真码与输入码 4个字符一组比较
4、注册机
int main(int argc, char* argv[])
{
char name[20];
char table[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char mid[20];
int temp;
char lastnum[6];
mid[0]='T';
int i,j;
int sum=0;
printf("长度在3-9之间 name:");
scanf("%s",name);
//生成中间注册码
int len=strlen(name);
for(i=0;i<len;i++)
{
sum=sum+name[i];
}
for(i=0;i<len;i++)
{
j=(i*3+26)%27;
mid[i+1]=(((((((name[i]^table[j])+((sum*(i-1))^0xFFFFFFFF)+0x14D+(len*(i+3)*name[i]))%0x0A+0x30)&0x000000FF)
^0xADAC)*(i+2))%0x0A+0x30)&0x000000FF;
}
mid[len+1]='/0';
strcat(mid,"-");
temp=(len*sum)%0x64+0x30;
ultoa(temp,lastnum,10);
strcat(mid,lastnum);
//还原成真码
int m_len=strlen(mid);
for(i=1;i<m_len;i++)
{
mid[i]=((mid[i]^0x20)%0x0A)+0x30;
}
printf("注册码 serial:%s/n",mid);
return 0;
}
5、学习汇编知识
lea edi, dword ptr [ebp-11F] lea esi, dword ptr [402443] mov ecx, 1B rep movs byte ptr es:[edi], byte ptr [esi] |
Rep 指令a:执行指令a ,ECX次数 一共开辟ECX*4个字节空间
Movsx OPD,OPS OPS内容----àOPD ,左边空缺用OPS符号填充
Movzx OPD,OPS OPS内容----àOPD ,左边空缺以0填充
mov eax, 11CF movzx ecx, byte ptr [ebp-31F] cdq idiv ecx |
Cdq:EAX符号扩展到EDX ---------àEDX:EAX 双字扩展4字
Idiv OPS :带符号除法 被除数EDX:EAX 除数OPS
EDX:EAX /OPS 商--------àEAX
EDX:EAX/OPS 余数-----àEDX
MOV ECX,0A |
数字 0 0x30 EDX%0A+0x30 转换为数字的ASCII码 大写字母 A 0x41 EDX%0A+0x41 转换为大写字母的ASCII码 小写字母 a 0x61 EDX%0A+0x61 转换为小写字母的ASCII码 |
MOV DI ,OFFSET BUFDAT MOV CX ,LENGTH BUFDAT MOV AL ,00 CLD :高地址取 SLD:低地址取 REP STOSB STOSB一次复制一个字节 AL--àDI |
mov ecx, 30h mov eax,0CCCCCCCCh rep stos dword ptr es:[edi] stos是串存储指令,它的功能是将eax中的数据放入edi所指的地址中,同时,edi会增加4(字节数)。rep时指令重复执行ecx中填写的次数。 |
6、函数调用规则:调用者和被调用者函数间传递参数及返回参数的方法
Windows下函数调用方式由
Pascal方式 Pascal调用规则: (1)参数从左到右入栈; (2)被调用参数在返回前自行清理堆栈; (3)不支持可变参数的函数调用。 |
C方式(_cdecl) _cdecl调用规则: (1)参数从右到左进入堆栈; (2)在函数返回后,调用者要负责清除堆栈,所以这个调用常会生成较大的可执行文件。 |
WINAPI方式(_stdcall) _stdcall又称为WINAPI,其调用规则: (1)参数从右到左入栈; (2)被调用的函数在返回前自行清理堆栈,所以生成的代码比cdecl小。 |
内核快速调用方式(_fastcall) |
C++中this call方式(_thiscall) |
注意:在Windows中,不管哪种调用方式都是返回值放在eax中,然后返回。外部从eax中得到返回值。
【No1.rar】CrackMe下载地址:http://e.ys168.com/?awayfrompast