这个和Crackme005和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输入操作结果,如果检索失败, 直接退出函数。
如果文件存在,那么从文本中读取字符串,然后比较文本中的字符串是否是作者要求的,这个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坐标。接下来做四次测试
1 |
左上角:edx=0 eax=0x1C |
当从不同的位置移入表单,对应的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,接着搜索所有常量。
挨个点进去进行查找,经过排查发现真正的开启Edit2 控件的是第四个。
这个函数并不长,是Panel1的双击事件,想要让Edit2控件被启用,就必须让eax+0x308这个地址被赋值为0x29D。 Panel是什么东西呢。打开一下DarkDe,中间的这个大按钮就是Panel1,注意不是图片是按钮。所以想要触发这个 事件必须是双击空白处才能让程序断下。
分析第五层防护
0x308
查找常量,第三条,跟进去,这里是注册按钮的鼠标按下事件。
首先比较edx=0x230D,这个是直接能通过的,没有给咱下套,我还以为又套了一层。接着比较cl是1,cl的话必须是 右键单击,还是用猜,鼠标无非就量个参数,坐标和左右按键。eax+0x308的初始值是0x28E,右键单击一次增加 3,所以只要将注册按钮右键单击5次,第五层防护就算过了。
破解第五层防护
右键单击五次注册按钮
破解第四层防护
第五层防护已经过了,那么接下来来到没有解决的第四层。 鼠标右键单击五次注册按钮,然后等图片过了,双击大按钮,响应事件断下
这个时候可以看到eax+0x308的值已经是29D了
Edit2编辑框也能正常使用了。
破解第三层防护
Edit2编辑框的编辑框已经启用了,那么接下来双击编辑框
程序成功断下,接下来分析Edit2的双击事件。我们的目的要让[ebx+0x30C]被赋值为eax,达到破解第二层防护的条件
分析Edit2双击事件
首先获取Edit2的内容,然后获取长度,长度必须等于8,然后比较第二个字符是否是0x5F,0x5F就是下划线。比较第六个字符是否是0x2C,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是纯粹的算法了。 最后这两处结合,是根据显示的数字不同,然后对图片采用不同的点击方案。
点击事件的编写
根据不同的数字导致的在不同图片时左右点击相加=314即可
1 |
void CCM005Dlg::OnOK() |
校验步骤总结
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次
所有的步骤都执行完毕之后,等待计时器执行完成之后
参考链接
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
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论