crackme-系列之-crackme5

admin 2022年1月6日01:10:45安全博客评论13 views6191字阅读20分38秒阅读模式

这个和Crackme005和004的作者是同一个,不过增加了更多的防护

image-20210125103220232

查壳

image-20210120195625319

程序是使用Delphi编写的,加了个UPX壳,随随便便就能脱掉。

关于脱壳

这个壳的话,有三种脱的方式,PEiD通用脱壳器 手动脱和专用的脱壳器,这里建议用专用的脱壳器 反汇编代码和对 齐比较准确方便后面的分析,我用脱壳器脱的时候报错了,所以直接从网上找了一个脱好了的。

使用DarkDe分析程序

把脱壳后的程序拖如DarkDe

image-20210120195655282

首先来观察一下窗体,发现这里有一个隐藏的Edit框。

image-20210120195721307

image-20210120200330046

再来观察一下事件按钮,有如下几个响应事件:

  • 表单创建
  • Timer1定时器
  • 按钮的鼠标按下事件
  • 双击事件
  • Edit2的双击事件
  • 表单的鼠标移动事件
  • Image1的鼠标按下事件
  • Image2的鼠标按下事件
  • Image3的鼠标按下事件
  • Image4的鼠标按下事件
  • Timer2定时器
  • 按钮点击事件

image-20210120200406677

接着再来看一下控件的ID,这个会方便以后的分析,注意了,如果你脱壳用的是手动的方法或者是通用脱壳机,这个 控件ID是显示不出来的。所以能用专用脱壳器脱尽量不要手脱。

分析程序

导出符号

首先为了方便我们分析,把程序拖到IDA里,添加Delphi的所有的签名,然后导出map文件,加载到OD中,方便后 续的调试。

image-20210120200444859

找到这个注册成功的字符串,跟进去。

image-20210120200534065

拉到函数头的位置,我们看到右边有个IDA的注释,说明这个是Timer2的响应事件。然后这里有连续的五条跳转指 令,都是跳到函数结束的位置。那么要想注册成功,就必须让这五个条件不成立。

分析第一层防护

右键->查找所有常量->查找0x3C4,找到0xC34被赋值的位置,我们的目的是不让这个地方被赋值。

image-20210125102010466

image-20210125102025835

接着找到函数头的位置,IDA的位置显示这个是表单的创建事件

image-20210125102137688

分析表单创建事件

接着,在函数头的位置下断点,分析整个表单创建事件。分析表单创建事件的目的是为了让ebx+0x304这个位置的值 不被赋值为0xC34。整个事件的代码分析如下:

初始化控件

image-20210125102207313

读取文件内容

image-20210125102235503

接着获取 C:\ajj.126.c0m\j\o\j\o\ok.txt 的文件句柄,读取文件,然后检索IO输入操作结果,如果检索失败, 直接退出函数。

image-20210125102303644

如果文件存在,那么从文本中读取字符串,然后比较文本中的字符串是否是作者要求的,这个123456789是我自己写 入txt文件中测试用的,如果要复制作者要求的那个字符串,必须把从0x20开始到00的所有十六进制复制下来。如果 字符串比较通过,那么就会跳过 [ebx+0x304] 被赋值为 0xC34 的过程,至此整个表单创建函数就完成了。

破解第一层防护

创建文件,路径为: C:\ajj.126.c0m\j\o\j\o\ok.txt ,然后将 20 61 6A 6A D0 B4 B5 C4 43 4B 6D 65 D5 E6 C0 C3 21 FF FF 用十六进制编辑器写入到文本。

image-20210125102357554

成功破解第一层防护之后,隐藏的Edit编辑框就出来了。但是这个编辑框是被禁用的。

分析第二层防护

计时器的五个条件我们已经满足了第一个,接下来回到计时器的入口,从第二个条件入手。

image-20210125102428696

条件二调试默认已经满足了,跳转不会实现。那么我们现在要满足条件三,让 [ebx+0x310] 赋值为 0xF94 。 同样,搜索 0xF94 这个常量,找到赋值的地方。

直接跟进去,拉到函数头部,发现这里是表单的鼠标移动事件。接下来开始分析这个事件的所有的代码。

image-20210125102444370

分析表单的鼠标移动事件

接下来在函数头部下断点,然后从左上角移动到表单,触发断点,分析整个函数。 获取坐标

获取坐标

image-20210125102521585

首先把参数一和参数二给edx和eax,我们必须知道这两个参数是什么。因为这是鼠标点击事件,初步猜测是鼠标的X 和Y坐标。接下来做四次测试

1
2
3
4
左上角:edx=0 eax=0x1C
右上角:edx=0 eax=0x101
左下角:edx=0x13B eax=0x5
右下角:edx=0x13B eax=0x103

当从不同的位置移入表单,对应的eax和edx的值都不相同,所以判断这两个参数是横纵坐标,而且坐标系的原点在 左上角。

校验图片

接着函数取出了一个图片对象,然后判断是否是这个图片对象

image-20210125102613117

可以看到Image3的ID是0x2E0,所以只有当图片为Image3的时候才能满足条件,而Image3根据测试是”性相近”

校验坐标

image-20210125102638850

接着将横坐标和0xE2做比较,将纵坐标和0x12C做比较,小于或等于跳转,那么就是说如果想让他不跳转,横纵坐标 必须大于这两个值。整个表单的原点是左上角,那么我们必须从右下角移入才能满足条件。

再次校验图片和坐标

image-20210125102710719

接着再次校验图片是否是Image2 Image2是性本善,然后校验横坐标和纵坐标,这一次必须从左下角移入才能满足条 件。然后再判断 [ebx+0x30C] 这个地址的值是否是 0x9 ,默认这个值是0x9,所以这里又是一层防护。只有满足了 [ebx+0x30C]这个地址的值是9,才能把ebx+0x310赋值为0xF94,也就是满足我们的第二层防护。

分析第三层防护

接下来还是一样,要让[ebx+0x30C]这个地址的值不为9,查找所有常量。符合要求的只有第一条和第二条。

image-20210125102744480

而第一条跟进去发现这是之前分析过的表单创建的时候就被赋值为30C,所以目标不是这里,是第二条。

第二条跟进去,拉到函数头的位置

image-20210125102842402

发现这里是Edit2的双击事件,而Edit2目前是禁用的,所以双击事件根本断不下来,这又是一层防护。

分析第四层防护

想要破解第二层防护必须先破解第三层防护,想要破解第三层防护,就必须先破解第四层防护,这是在玩俄罗斯套娃 啊。那么我们这一步必须让Edit2控件变成启用状态。怎么做呢?利用刚才看到的控件ID。

image-20210125102911173

Edit2的控件ID是0x2F0,接着搜索所有常量。

image-20210125102928655

挨个点进去进行查找,经过排查发现真正的开启Edit2 控件的是第四个。

image-20210125102945232

这个函数并不长,是Panel1的双击事件,想要让Edit2控件被启用,就必须让eax+0x308这个地址被赋值为0x29D。 Panel是什么东西呢。打开一下DarkDe,中间的这个大按钮就是Panel1,注意不是图片是按钮。所以想要触发这个 事件必须是双击空白处才能让程序断下。

image-20210125102959965

分析第五层防护

0x308

查找常量,第三条,跟进去,这里是注册按钮的鼠标按下事件。

image-20210125103022846

image-20210125103033990

首先比较edx=0x230D,这个是直接能通过的,没有给咱下套,我还以为又套了一层。接着比较cl是1,cl的话必须是 右键单击,还是用猜,鼠标无非就量个参数,坐标和左右按键。eax+0x308的初始值是0x28E,右键单击一次增加 3,所以只要将注册按钮右键单击5次,第五层防护就算过了。

破解第五层防护

右键单击五次注册按钮

破解第四层防护

第五层防护已经过了,那么接下来来到没有解决的第四层。 鼠标右键单击五次注册按钮,然后等图片过了,双击大按钮,响应事件断下

image-20210125103114930

这个时候可以看到eax+0x308的值已经是29D了

image-20210125103132371

Edit2编辑框也能正常使用了。

破解第三层防护

Edit2编辑框的编辑框已经启用了,那么接下来双击编辑框

image-20210125103315446

程序成功断下,接下来分析Edit2的双击事件。我们的目的要让[ebx+0x30C]被赋值为eax,达到破解第二层防护的条件

分析Edit2双击事件

image-20210125103343496

首先获取Edit2的内容,然后获取长度,长度必须等于8,然后比较第二个字符是否是0x5F,0x5F就是下划线。比较第六个字符是否是0x2C,0x2C就是“,”

image-20210125103400603

获取Edit1的内容和长度,然后将长度+3之后除以3

image-20210125103420194

比较余数,余数必须为0。就是说Edit1的长度必须为3的倍数。至此,Ddit2双击事件分析完成。

第一个编辑框长度必须是3的倍数,第二个编辑框第二个字符必须是下划线,第六个字符必须的逗号

破解第二层防护

image-20210125103516698

当破解了第三层防护的时候,第二层防护的比较条件也就满足了。继续往下分析。

image-20210125103540997

接着往下走,程序会获取第一个编辑框的内容然后和ajj做比较,也就是说第一个编辑框必须为ajj。然后会把数字转成 字符串显示到控件。

image-20210125103555696

破解第六层防护

接下来来到总验证的地方。也就是一开始的定时器,看看现在的校验情况如何。

image-20210125103631516

我们已经过掉了前三个验证,接下来要过掉第四个,也就是要让ebx+0x318等于ebx+0x314。那么要搞清楚0x318和 0x314这两个位置是怎么被赋值的

分析0x318

搜索所有常量->0x318

image-20210125103703124

除了第一个设置初始值,剩下的所有对这个地址的变量做加法运算。随便点进去第二个,增加二的位置

image-20210125103717455

这里是图片1的鼠标按下的位置,而且显示的是注册不成功。

image-20210125103733538

首先判断鼠标按下的是左键还是右键,如果是左键+2,右键+0x11。

image-20210125103752150

再次回到所有常量的位置,那么规律也就出来了,这几个加法分别对应四张图片,根据点击的按键不同,加的值也不 同。0x318这个位置搞明白了,接下来去分析0x314。

分析0x314

搜索所有常量->0x314。

image-20210125103826835

0x314被赋值的地方也有很多,分别对应五个值。这个几个地址相差的值比较小,说明是同一个函数,随便点进去一 个。

image-20210125103844902

这里是之前分析过的表单的鼠标移动事件,这个地址的值取决于eax的值,有四种情况第一种情况赋值为0x41,第二 种情况赋值为0x3D,第三种情况赋值为0x34,第三种情况赋值为0xDF。然后根据不同的情况,在界面上会显示一个 数字。

image-20210125103906565

而eax的值来自于0x30C这个位置,又得继续往上找。

破解第七层保护

接下来还是查找所有常量->0x30C

image-20210125104018200

来到给0x30C赋值的位置,这里是编辑框的双击事件,之前已经分析过了,但是我没有分析上面两个call具体是做什 么的。 第一个call是获取磁盘的剩余空间,然后将eax做一系列的处理,交给第二个call,第二个call是纯粹的算法了。 最后这两处结合,是根据显示的数字不同,然后对图片采用不同的点击方案。

点击事件的编写

根据不同的数字导致的在不同图片时左右点击相加=314即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
void CCM005Dlg::OnOK() 
{
// TODO: Add extra validation here

//CDialog::OnOK();

char szKey[1024]={0};
int n = 0;
GetDlgItemText(IDC_EDIT1,szKey,1024);
if(!strlen(szKey))
{

MessageBox("请按照【前期步骤】获取正确数值后再生成方案!","友情提示");
return;
}
n = GetDlgItemInt(IDC_EDIT1);


switch(n){
case 1 :
n=0x3D;
break;
case 2 :
n=0x34;
break;
case 3 :
n=0xDF;
break;

default : // 可选的
n=0x41;
}

//sprintf(szKey,"%d",n);
//SetDlgItemText(IDC_EDIT2,szKey);


struct image
{
char szname[7];
int nNumber ;
int nLef;
int nRight;
};
image aImage[4]={0};

sprintf(aImage[0].szname,"人之初");
aImage[0].nNumber = 1;
aImage[0].nLef = 0x2;
aImage[0].nRight = 0x11;

sprintf(aImage[1].szname,"性本善");
aImage[1].nNumber = 2;
aImage[1].nLef = 0x3;
aImage[1].nRight = 0x13;

sprintf(aImage[2].szname,"性相近");
aImage[2].nNumber = 3;
aImage[2].nLef = 0x5;
aImage[2].nRight = 0x17;

sprintf(aImage[3].szname,"习相远");
aImage[3].nNumber = 4;
aImage[3].nLef = 0x7;
aImage[3].nRight = 0x1B;
/************************************************************************/
/* 设计原则,选择出点击次数最少的方案
/* iR作为大数数组下标,iL作为小数数组下标,j大数商,k小数商,求i+j最小值
/************************************************************************/
int nRes = 112;
int nIL = 0;
int nIR = 0;
int nJ = 0;
int nK =0 ;
for (int iL=0;iL<4;iL++)
{
for (int iR=0;iR < 4;iR++)
{

for (int j=1;j<=14;j++)
{
for (int k =0;k<=112;k++)
{

if ((aImage[iR].nRight*j + aImage[iL].nLef*k == n) && (nRes> j+k))
{
nIL = iL;
nIR = iR;
nJ = j;
nK = k;
nRes = j+k ;
}

}
}
}

}

sprintf(szKey,"在“%s”图片时左键点击图片%d次\r\n\r\n在“%s”图片时右键点击图片%d次\r\n\r\n即可注册成功!",aImage[nIL].szname,nK,aImage[nIR].szname,nJ);
SetDlgItemText(IDC_EDIT2,szKey);
}

校验步骤总结

1.创建文件,路径为: C:\ajj.126.c0m\j\o\j\o\ok.txt ,然后将 20 61 6A 6A D0 B4 B5 C4 43 4B 6D 65 D5 E6 C0 C3 21 FF FF 用十六进制编辑器写入到文本。

\2. 鼠标右键点击五次注册按钮

\3. 鼠标左键双击图片框的空白处

\4. 用户名输入ajj

\5. 密码输入1_345,78(第二位必须的下划线,第六位必须的逗号,长度必须8位,其余随便),然后鼠标左键双击

\6. 在图片是性相近的时候,鼠标从右下角移入软件框内

\7. 在图片是性本善的时候,鼠标从左下角移入软件框内

\8. 根据显示的数字不同,最终的解决方案也不同,具体如下:

数字为0——在“习相远”图片时左键点击图片2次,在“人之初”图片时右键点击图片3次

数字为1——在“习相远”图片时左键点击图片1次,在“习相远”图片时右键点击图片2次

数字为2——在“性本善”图片时左键点击图片2次,在“性相近”图片时右键点击图片2次

数字为3——在“习相远”图片时左键点击图片1次,在“习相远”图片时右键点击图片8次

数字为4——在“习相远”图片时左键点击图片2次,在“人之初”图片时右键点击图片3次

所有的步骤都执行完毕之后,等待计时器执行完成之后

image-20210125104121222

参考链接

https://blog.csdn.net/qq_38474570/article/details/89602599

https://www.52pojie.cn/forum.php?mod=viewthread&page=1&tid=855172

FROM :ol4three.com | Author:ol4three

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月6日01:10:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  crackme-系列之-crackme5 http://cn-sec.com/archives/721258.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: