首页
社区
课程
招聘
[原创][原创][分享]逆向破解一个普通难度(3星)的Crackme
发表于: 2020-9-11 23:47 7204

[原创][原创][分享]逆向破解一个普通难度(3星)的Crackme

2020-9-11 23:47
7204

1、打开软件,熟悉界面,功能

发现这个程序点击注册没有反应,单击图片会弹出:

熟悉一番程序功能以及界面之后,查壳。

2、查壳

发现是UPX的壳,可以手动脱壳,也可以使用工具脱壳,这里使用工具脱壳

脱壳完成之后,继续查看一下原程序的信息:

发现是Delphi编写的程序,那么就可以使用Darkde4工具查看信息:

发现正常情况下,应该是有2个Edit的,但是我们打开的时候只有一个;还有很多个响应事件:

    FormCreate创建表单,Timer定时器,ButtonMouseDown鼠标按键按下,FromMouseMove捕捉鼠标移动,单击,双击等,具体的可以百度查一下。

以上清楚了窗体的样式,有可能触发的事件,接下来使用OD分析。

3、使用OD分析

首先看一下能不能搜索到有价值的字符串:

很顺利的搜索到了大概率的关键点,双击进去查看:

发现入口函数的地址是4473E4,是Darkde4工具分析出来的Timer2Timer定时器事件;5个JCC跳转都是直接跳过了“注册了”指令,也就是说,这5个JCC跳转都不能实现跳转才会跳转到成功注册的页面。








3.1  分析第一个JCC跳转  

CMP DWORD PTR DS:[EBX+0x304],0xC34:[EBX+304]必须不能等于0xC34

右键查找所有常量

-->

有两个赋值语句,都进去看一下

发现两个语句都是挨着的,并且只要JE成功跳转了,[ebx+0x304]就不会被赋值为c34。

再次从函数头开始分析:


发现函数的起始位置是446c1c,是Darkde4工具分析出来的FormCreate创建表单事件,该函数的作用就是初始化一堆信息,其他的信息就是一个初始化的过程不用太在意。关键点:308、30C、314、318这三个被初始化,308、318、314比较眼熟,正是Timer2Timer定时器事件的5个JCC跳转其中3个,先做一下备注,记录下来。

00446D49   BA EC6D4400   MOV EDX,CKme002_.00446DEC                ; X:\ajj.126.c0m\j\o\j\o\ok.txt

这一句指令也是直接将一个固定的地址赋值给EDX,也很敏感。这些数据比较敏感,是作者已经定义好的数据、直接写在程序中的常量。

对常量地址在数据窗口中跟踪进去查看:


发现内容非常像一个txt的路径,只是符盘在X盘下。这里需要特别留意,为什么会多一个路径?猜测可能是需要使用到这个路径下的txt,可能是读取,可能是写入。写入与读取两种可能中,感觉读取的可能性更大,很可能是读取指定路径下的内容,然后做比较,比较成功就跳转之类的。

验证猜测:既然是读取再比较,那么肯定需要有作者设定好的内容与路径下的内容来做比较,继续往下查找,看看有没有作者写好的固定路径的赋值操作:

发现果然找到一块内容复制语句,内容是: ajj写的CKme真烂!

但是这里需要注意,字符串的结尾都是以00结尾的,所以,真正的内容是:

经过分析得到:

也就是说,需要创建一个文件:X:\ajj.126.c0m\j\o\j\o\ok.txt,文件内容为16进制的

这样才不会将304赋值为0xC34。

验证一下,我时使用虚拟机进行分析的,我添加了一个盘符为X盘(如果不是虚拟机的话,使用U盘,估计将U盘盘符设置为X也可以),然后创建ajj.126.c0m\j\o\j\o\ok.txt文件。使用010Edit创建16进制文件:

然后在OD中验证后,确实没有将EBX+304赋值为C34,并且运行之后呈现如下画面:

与文章一开始的时候相比,多了一个文本框,与Darkde4工具得到的窗体一致。说明作者设置了一个隐藏文本框,需要完成某些步骤才会显示。此时的文本框却是无法输入的,是一个禁用的文本框,无法选择,也无法输入内容。但是不管怎么说,5个JCC现在已经破解掉1个了。








3.2分析第二个JCC跳转


004473F7   81BB 08030000>CMP DWORD PTR DS:[EBX+0x308],0x230D-->[EBX+308]不能等于230D

0x308这个常量现在已经是第三次见到它了,第一次在文章开头,第二次在第一个JCC跳转的创建表单的时候,初始化为0x28E。

用OD单步跟进去看下当前的[EBX+308]是不是0x28E

可以看到,此时的[EBX+308]的存储的内容是028E,不等于0x230D,第二个JCC跳转就直接过去了









3.3分析第三个JCC跳转


00447403    81BB 10030000>CMP DWORD PTR DS:[EBX+0x310],0xF94-->[EBX+310]必须等于F94

同理,查找所有常量



结合darkde4工具的分析结果,44715A这个地址很有可能是FormMouseMove函数中的一个地址

FormMouseMove是捕捉鼠标移动的事件。

发现这个函数就是FormMouseMove。还发现两条很相似的指令:

MOV ECX,DWORD PTR DS:[EBX+0x2E0]

MOV ECX,DWORD PTR DS:[EBX+0x2DC]

这让我联想到了结构体、对象、堆栈等。EBX很可能是一个结构体或者对象。使用OD断在这里,看一下


看到EBX显示的是"TiD",会不会是一个存储ID的结构体?ID会存储什么ID?联想到darkde4工具分析得到的控件ID:


2E0很可能是Image3的ID,2DC很可能是Image2的ID,而程序中的Image图片是不断动态变化的,而此处是从EBX+偏移中,获取当前程序显示的图片控件对象,然后比较控件的0x47处是否为1

验证一下:在两条获取ID的JNZ跳转指令处下断点,将鼠标移动进入窗口,触发FormMouseMove事件,发现如下:

由此,猜测:图片控件的+0x47的偏移处为1时,说明此时程序正在显示该控件图片,否则的话,程序不是显示该图片

得到:

Image3是2E0,是图片:性相近

Image2是2DC,是图片:性本善

只有当图片是性相近和性本善的时候,触发FormMouseMove事件才可以继续往下走

继续往下走:

得到:FormMouseMove函数的参数1必须大于300,参数2必须大于十进制的226,FormMouseMove函数是捕获鼠标位置的函数,那么参数1和参数2应该就是鼠标的坐标了。

至于哪个是X坐标,哪个是Y坐标,不清楚的话,就可以自己做实验,移动鼠标触发事件之后,查看EAX和EDX的值,得知参数2为X坐标,参数1为Y坐标。


因此,此处的要求是Y坐标必须大于300,X坐标必须大于226,才会将[EBX+0x310]赋值为0x10,

也就是说需要程序在   性相近的时候,将鼠标从程序窗口右下角移入程序窗口。

第二个同理,程序在   性本善的时候,将鼠标从程序窗口左下角移入程序窗口。

继续往下分析:

[EBX+30C]必须等于9

同理,查找所有常量,查找0x9太多了,直接查找0x30C常量


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2022-8-17 11:42 被三一米田编辑 ,原因:
上传的附件:
收藏
免费 8
支持
分享
最新回复 (4)
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
不错 学习
2020-9-14 17:37
0
雪    币: 1084
活跃值: (340)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
3
从置顶出来的贴子都是精华无论质量
2020-9-15 19:56
0
雪    币: 7092
活跃值: (2988)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
可以的, 160个crackme结束就是破解小能手了
2020-9-28 17:56
0
雪    币: 1657
活跃值: (924)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
太强了,学习了
2020-10-11 09:59
0
游客
登录 | 注册 方可回帖
返回
//