天天看点

CrackMe 之 006

在吾爱上边找到的资源,160个Crack me,第六个,网上有很多大佬也有写文章来讲解,当然在破解的时候也有参考,姑且记录下来,当作自己的学习资料:

拿到程序之后,查壳:

die查壳:

CrackMe 之 006

可以看到是Delphi的程序,直接上手Darkde进行反编译,这都是后话,在查完壳之后,获取到程序的一些基本信息。下一步先运行一下程序,对于程序有一个大致的了解:

CrackMe 之 006

在程序之初,只有帮助按钮可以弹出对于我们来说有用的信息,这次破解的方法不采用关键字符串搜索的方法,这次换另外一种方法:采用Delphi反编译工具,获取关键控件的信息,从而破解程序。

第一步:Darkde反编译程序:

CrackMe 之 006

点击CrackMe模块,进入:

CrackMe 之 006

第二部:获取到控件的关键信息之后,我们可以获取到在程序中使用的控件的ID,在这次的破解中我们使用控件ID来下断点的方式进行破解,查看控件的ID:

CrackMe 之 006

我们在调试破解过程中用到的两个关键的 控件ID是Cancle键和OK键,(这个程序的主要目的就是在运行之后将这两个按键隐藏掉,可以从帮助信息里边看到)

第三步:OD附加进程

第四步找到关键的控件的ID:

鼠标右键—>查找—>所有常量—>输入2D0(Cancle按键的控件ID)

CrackMe 之 006

第五步:可以看到一共有4个地方涉及到该控件的使用,

我们可以跳过去分别去看一下这四个地方的大概作用,来找到哪个是我们要用的(我们的目的是找到隐藏Cancle键的逻辑和算法):

CrackMe 之 006
CrackMe 之 006
CrackMe 之 006
CrackMe 之 006

找到隐藏Cancle的代码段之后,进行调试,输入Nome:134567 Code: 564897(这两个值可以随便输入),在这块代码段的开头部分下断点进行调试:(输入数据之后,点击Cancle按钮)

CrackMe 之 006
CrackMe 之 006

F7跟随关键的算法部分:算法的核心部分分析如下:

CrackMe 之 006

算法的核心部分分析之后,其实就可以逆向的写出相应的代码,来得到满足条件的数据:

用C写了一个 :

#include<stdio.h>
int main()
{
	int i=0;
	int j=0;
	int s=0;
	int arr[10]={0};
	printf("请输入你的Nome个数(友情提示位数必须大于5)\n");
	scanf("%d",&s);
	printf("请输入你的Nome:");
	for(i=0;i<s;i++)
	{
		scanf("%d",&arr[i]);
	}
	int x=(arr[4]+0x30)%7+2;
	int q=1;
	int y;
	//阶乘
	for(i=x;i>0;i--)
	{
		q=q*i;
	}
	for(i=0;i<6;i++)
	{
		j=j+(arr[i]+0x30);
	}
	q=q*j;
	y=q-0x7A69;
	printf("您应该输入的Code应该是:");
	printf("%d",y);
	}
           

之后将得到的数据填入Code再点击Cancle发现Cancle键消失了:

CrackMe 之 006

下一步,将Cancle按键隐藏之后,就该隐藏OK键了(这两个没有顺序而言,全凭开心),和Cancle同样的方法,我们还是根据控件来对OK键定位:

CrackMe 之 006
CrackMe 之 006

核心算法的分析:

CrackMe 之 006

根据核心算法的分析结果,也可以顺着得到我们最后的注册码:(这里没有用代码实现,因为过程比较麻烦,但是不难就是太搬砖了)

CrackMe 之 006

到此这个分析过程也已经结束了,根据这次分析结果也学到了很多东西;

1、在逆向分析的时候有一个好的工具是非常重要的,要多换着使用工具,找到对的工具事半功倍

2、关键字符串搜索的方法,有一定的局限性,从其他角度多方面进行解析

3、在思考问题的时候不能钻牛角尖,否则容易在一个点卡死,而且在分析的时候,不能先入为主,否则会产生思维定势,也不容易走出来(关键是我太菜)。

继续阅读