首页
论坛
课程
招聘
[原创][分享]逆向破解一个普通难度(3星)的Crackme
2020-9-11 23:47 4185

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

2020-9-11 23:47
4185

本人师从于15PB,近期由于疫情原因,实地课程尚未开课,所以闲余时间较充分,有空就写写贴子。感谢15PB带领我进入信息安全领域。

160个Crackme中的第5个,废话不多说,直接开始。


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常量

446FF8是Edit2DblClick事件的入口点,看函数名可以猜出,是双击Edit2产生的事件,darkde4已经分析出Edit2就是隐藏的Edit,但是尝试双击该控件,并不会触发Edit2DblClick事件。很有可能是因为Edit2当前处于禁用状态。那么现在又需要找到Edit2的突破口,解除禁用,思来想去,除了darkde4工具分析出的Edit2的ID,没有什么地方有相关的信息,尝试查找Edit的ID,右键查找所有常量0x2F0

发现程序一共获取了7次Edit2的控件ID。一个一个排查:

第一个:地址在446C8B,猜测在FormCreate初始化的函数范围内,排除掉

第二个:地址在446C98,猜测在FormCreate初始化的函数范围内,排除掉

第三个:地址在446DAB,猜测在FormCreate初始化的函数范围内,排除掉

第四个:地址在446FEA,猜测在Panel1DbClick函数范围内,待验证




第五个:447016,猜测在FormMouseMove函数范围内,待验证

第六个:447035,猜测在FormMouseMove函数范围内,待验证

第七个:44704C,猜测在FormMouseMove函数范围内,待验证

验证之后,发现第5、6、7个获取控件的指令是在Edit2DblClick中的,由此排除5、6、7,剩下第4个,继续进去查看:

发现一个MOV指令,目标寄存器是DL,一般情况下,很少会对AL,DL,CL这种寄存器赋值,正常是使用EAX,EDX,ECX等,AL,DL,CL作为标志的时候使用的几率比较大,猜测DL就是判断当前状态是否处于禁用状态下的标志。

这里有两个点:

①要解除禁用,就要触发446FD9,darkde4工具中已经发现了446FDC是Panel1DblClick事件的入口点:

②[EAX+308]的值必须是29D




446FA4处下个断点,单击Button1,看看当前的[EAX+308]值是多少:

EDX为28E,但是鼠标左键按下时,CL不等于0x1,鼠标右键按下时CL才等于1。并且一旦点击了左键,[EAX+308]就会被赋值为290D,那么以后再点击不管是左键还是右键都不能跳转到[AEX+308]+0x3的指令了。所以这里不能出错,否则就要从新运行程序了。

0x29D-0x28E=F=十进制15

15/3=5,也就是说需要右键单击5次Edit1才可以完成将0x29D赋值给[EAX+308],然后双击Panel1控件。

验证:

发现此时的Edit2已经解除禁用了,继续回到上面分析

[ebx+0X300]必须被赋值不为0x9


446FF8是Edit2DblClick事件的入口点,看函数名可以猜出,是双击Edit2产生的事件,darkde4已经分析出Edit2就是隐藏的Edit,但是尝试双击该控件,并不会触发Edit2DblClick事件。很有可能是因为Edit2当前处于禁用状态。

现在已经可以双击Edit2控件了。


分析Edit2DbClick


到这里,这么多的努力就是为了下面这一句指令的执行,目前已经完成了[EBX+310]的赋值,

继续往下看:

也就是说,输入的账号信息必须是"ajj"

验证一下之前的操作:

①创建指定文件:X:\ajj.126.c0m\j\o\j\o\ok.txt(注意16进制数据一致)

②右键单击5次Edit1才可以完成将0x29D赋值给[EAX+308],然后双击Panel1控件。

③输入密码8_888,88

④输入账号ajj

⑤双击Edit2

⑤当图片为   性相近   的时候,将鼠标从窗口窗口右下角移入程序窗口。

⑥当图片为   性本善   的时候,将鼠标从程序窗口左下角移入程序窗口。特别注意,⑤和⑥的顺序不能错,否则不能成功

最终得到:










第4个JCC跳转


[EBX+314]必须等于[RBX+318]



同理查找所有常量318,看看[EBX+318]是怎么赋值来的:

一个一个查看:


第一个:Image1MouseDown的入口点

318的值:左键+17,右键+2

第二个:Image2MouseDown的入口点

318的值:左键+19,右键+3


第三个:Image3MouseDown的入口点

318的值:左键+23,右键+5


第四个:Image4MouseDown的入口点

318的值:左键+27,右键+7


查看[EBX+314]是如何赋值的

发现有4中情况

①0x41

②0x3D

③0x34

④0xDF


继续看EAX怎么来的:查找所有常量0x30C

发现EBX+30C就是之前我们分析过的,它的值无非就4种:0,1,2,3,(Switch Case)是通过一系列算法,磁盘空间、随机数等得到的,我的机器中值为1。


得到的“1”就是之前你分析的数字:

也就是说,当前是需要使用Case 1的算法:使用左键按下和右键按下配合起来,组成最终的值为0x3D即可

  


测试一下:

①创建指定文件:X:\ajj.126.c0m\j\o\j\o\ok.txt(注意16进制数据一致)

②右键单击5次Edit1才可以完成将0x29D赋值给[EAX+308],然后双击Panel1控件。

③输入密码8_888,88

④输入账号ajj

⑤双击Edit2

⑤当图片为   性相近   的时候,将鼠标从窗口窗口右下角移入程序窗口。

⑥当图片为   性本善   的时候,将鼠标从程序窗口左下角移入程序窗口。特别注意,⑤和⑥的顺序不能错,否则不能成功

⑦查看得到的数字,本机的当前数字为1,则单击4张图片,组合之后数值应为0x3D;其他机器若数字为0的话,则是0x41,以此类推

⑧计算得出,总数为0x3D需要:61=27+27+7,也就是说左键点击Image4MouseDown1次,右键点击Image4MouseDown2次,经过测试得知“习相远图片"就是Image4MouseDown,所以,左键点击习相远1次,右键点击习相远2次即可

大功告成!!!!!!!!~~~~~~~~~

注册机就不写了,算法很简单就是根据当前机器的数字,得到一个数字(314的值),然后配合左键、右键点击图片,计算出的和必须与该数字相等即可

 


看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

最后于 2020-11-29 12:49 被三一米田编辑 ,原因:
上传的附件:
收藏
点赞2
打赏
分享
最新回复 (4)
雪    币: 74
活跃值: 活跃值 (571)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
killpy 活跃值 2 2020-9-14 17:37
2
0
不错 学习
雪    币: 1084
活跃值: 活跃值 (340)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
东京不热 活跃值 2020-9-15 19:56
3
0
从置顶出来的贴子都是精华无论质量
雪    币: 4162
活跃值: 活跃值 (493)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
shuyangzjg 活跃值 2020-9-28 17:56
4
0
可以的, 160个crackme结束就是破解小能手了
雪    币: 2469
活跃值: 活跃值 (576)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
夜航星 活跃值 2020-10-11 09:59
5
0
太强了,学习了
游客
登录 | 注册 方可回帖
返回