No.1 入门级CrackMe分析

来源:互联网 发布:淘宝怎么开手机维修店 编辑:程序博客网 时间:2024/05/16 09:21

入门级CrackMe分析

1CTRL + 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
CDQ
IDIV ECX
ADD EDX,30           

数字       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

原创粉丝点击