160个CrackMe005

这个Crackme跟004一样是同一个作者,不过变态多了,真的是层层设防啊。

查壳

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

关于脱壳

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

使用DarkDe分析程序

把脱壳后的程序拖如DarkDe

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

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

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

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

分析程序

导出符号

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

从字符串入手

整个程序整体的框架已经了解的差不多,那么接下来就开始分析这个程序。首先从字符串入手。

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

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

分析第一层防护

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

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

分析表单创建事件

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

初始化控件

首先是初始化控件,这个不是重点。

读取文件内容

接着获取C:\ajj.126.c0m\j\o\j\o\ok.txt的文件句柄,读取文件,然后检索IO输入操作结果,如果检索失败,直接退出函数。我这个脱壳后的文件是从网上下载的,原来是X盘,好像是被人改成C盘。

如果文件存在,那么从文本中读取字符串,然后比较文本中的字符串是否是作者要求的,这个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用十六进制编辑器写入到文本。

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

分析第二层防护

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

条件二是默认已经满足了,跳转不会实现。那么我们现在要满足条件三,让[ebx+0x310]赋值为0xF94

同样,搜索0xF94这个常量,找到赋值的地方。

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

分析表单的鼠标移动事件

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

获取坐标

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

左上角:edx=0         eax=0x14
右上角:edx=0         eax=0xE8
左下角:edx=0x13B     eax=0x3
右下角:edx=0x13B     eax=0xFD

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

校验图片

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

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

校验坐标

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

再次校验图片和坐标

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

分析第三层防护

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

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

第二条跟进去,应该就是这里了。

接下来,拉到函数头的位置,

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

分析第四层防护

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

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

总共有这么多和0x2F0相关的,我们必须一个一个去看才能找到禁用Edit2的那一个。经过排查发现真正的开启Edit2控件的是第四个。

这个函数并不长,是Panel1的双击事件,想要让Edit2控件被启用,就必须让eax+0x308这个地址被赋值为0x29D。

Panel是什么东西呢。打开一下DarkDe,中间的这个大按钮就是Panel1,注意不是图片是按钮。所以想要触发这个事件必须是双击空白处才能让程序断下。

分析第五层防护

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

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

破解第五层防护

右键单击五次注册按钮

破解第四层防护

第五层防护已经过了,那么接下来来到没有解决的第四层。

鼠标右键单击五次注册按钮,然后等图片过了,双击大按钮,响应事件断下,

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

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

破解第三层防护

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

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

分析Ddit2双击事件

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

接着获取Edit2的内容,比较第六个字符是否是0x2C,然后获取Edit1的内容和长度,然后将长度+3之后除以3,

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

破解第三层防护:第一个编辑框长度必须是3的倍数,第二个编辑框第二个字符必须是下划线,第六个字符必须的逗号

破解第二层防护

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

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

成功了之后,这里会出现一个数字。

破解第六层防护

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

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

分析0x318

搜索所有常量->0x318,

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

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

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

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

分析0x314

搜索所有常量->0x314。

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

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

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

破解第七层防护

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

来到给0x30C赋值的位置,这里是编辑框的双击事件,之前已经分析过了,但是我没有分析上面两个call具体是做什么的。

第一个call是获取磁盘的剩余空间,然后将eax做一系列的处理,交给第二个call,第二个call是纯粹的算法了。

最后这两处结合,是根据显示的数字不同,然后对图片采用不同的点击方案。

校验步骤总结

  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次

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

注册按钮会变成注册了,鼠标移上去会显示厉害厉害真厉害。

需要相关文件的可以到我的Github下载:https://github.com/TonyChen56/160-Crackme

猜你喜欢

转载自www.cnblogs.com/guishou/p/10469894.html