逆向分析160个练习crackme之ajj.2
作者特意写了一个文档,告诉我们这个程序有着层层防御,这让我很好奇,也很欣喜。刚学的逆向,就想要这种一个程序里有多个坎,可以让我把学到的东西都用上。,破这个程序让我还真是费了不少劲,但是弄完之后,知识掌握的更熟练,确实是个练习的好程序。废话不多说,来讲讲我心酸的逆向过程吧。打开程序,查看是如何使用及是否有相关信息可以利用。
看到程序虽然有注册按钮,但是按下的时候没有反应,中间的图片框是滚动的,当点击滚动框时,就会有注册未成功的提示信息。
将程序导入PEiD(查壳工具)看到程序有一个UPX壳,那么我们需要先进行脱壳,可以利用ESP定律。
将程序导入OD,F8运行一行后,对ESP的值进行数据窗口中跟随,然后选择数据窗口中dword长度的字节进行设置内存访问断点后F9运行,发现状态是运行状态,OD并没有中断下来,说明程序对内存访问断点有检测。
重新将程序导入OD,我们就在相同位置设置硬件断点。F9运行,就会到了跳转的位置,F8运行就会来到OEP的位置了。
我们需要把程序转存下来,可以利用插件OllyDump,也可以用工具PETools等,当然手动转存也是可以的,就是比较复杂。这里我们只要转存代码,修复IAT的事情我们自己来做,所以就取消勾选重建输入表。点击脱壳后保存文件即可。
这时候转存出来的程序是不能打开的,因为还没有修复IAT,我们需要对其进行修复。
在CPU窗口(注意要是系统领空的位置)右键查找所有模块间的调用。
对API函数调用表中随便找一个进行跟随,在数据窗口中进行内存地址的数据窗口跟随(将数值显示方式改为长型地址),就可以找到IAT表了。
打开REC工具,选择调试中的程序后,在IAT Infos needed框中填入相关的OEP(原始起始位置),RVA(IAT表的起始位置),Size信息(IAT表的大小,IAT表的结尾是00000000位置而不是最后一个API函数的位置)。这里要注意的是,填写的内容是偏移量,需要去掉基址,大部分程序的基址都是400000。
获取完IAT表后点击Fix Dump对转存的程序进行IAT修复。这次再打开会发现没有错误提示信息,但是程序依然打不开。我们将其导入到OD查看。
发现OEP位置的代码发生了错误,那么我们就将正确的代码二进制复制过来进行粘贴。
我们修改代码后进行保存到文件替换修复IAT后的程序,这时候程序就可以正常打开了,同时也去掉了UPX壳。
将修改后的程序导入OD,通过智能搜索查看是否有相关可用的信息。
找到一个类似注册成功的提示信息,我们双击跟过去查看一下。
发现有一个跳转跳过了注册成功的提示,信息,那么我们就顺着这个跳转往上看。
这里有五个比较,每个比较后都有一个关键跳,直接将跳转NOP就可以暴力PJ了。注册成功后,点击画板框就会有提示信息“厉害厉害真厉害!佩服佩服真佩服!!”,同时右下角的注册按钮会变成“注册了”。
但我们需要知道的是注册码如何生成,由于OD对于调试Delphi的无力感,我们将程序导入到DarkDe中进行查看。
这次的窗体没有直接明显的验证事件,那么我们将程序导入OD中,对每个事件的段首设置一个cc断点。同时我们对关键跳前的五个比较设置断点,这样我们就可以针对性的分析那个事件对应哪个比较。
断点设置完后,F9运行程序,可以看到先是执行FormCreate事件,之后就是进行Timer1事件,接着就到了Timer2事件中第一个比较的位置。Timer1是设置定时检测的作用,那么涉及到第一个比较参数的赋值就应该在FormCreate事件中了。
对代码进行分析,可以看到一个字符串X:\ajj.126.c0m\j\o\j\o\ok.txt,继续往下分析知道是在要指定的路径检测ok.txt文档是否存在,若是不存在就会跳转,将第一个比较处的值赋为0c34.
因为我们没有X盘,那么就直接加字符串修改为D:\ajj.126.c0m\j\o\j\o\ok.txt,在D盘中创建相关的文件夹及ok.txt文件。可以看到在之后还会提取ok文档中的内容与ajj写的CKme真烂!进行比较,那么我们就把ok文档中的内容写为ajj写的CKme真烂!(需要注意到首字节是空格)
F9运行到第一比较处的位置,就会看到这里不会跳转,说明我们已经破了程序的第一道防御,F9运行起程序,会意外的发现窗体多了一个输入框,但是这个窗体还不能输入。
我们进行下一步的分析。解决第二个比较的问题。但是通过对事件及比较处设置断点的方式,我们都无法定位到相关的事件位置,那么我们就只能通过对内存地址设置硬件断点来进行定位。禁用所有断点后,先在第一处比较的位置设置断点,F9运行起来程序中断在该处后,对第二处比较的内存地址进行数据窗口中跟随,在数据处选择dword长处并设置硬件断点(不设置内存访问断点是为了重载的时候不会消失)。
设置好之后将程序运行起来,对注册窗体进行点击等操作,发现是点击注册按钮后,会修改该内存地址的值,那么我们就在OD中进行代码的分析。
分析代码可以发现,该内存地址起始值为028e鼠标左键点击注册按钮,cl就会置为0,从而会导致第二处比较后的跳转是一直成立的。我们只要对注册按钮进行右击,该内存地址的数值每次就会+3,并且不会与230d相等,第二道防御就解除了。
注意到代码处对该内存地址的调用还有一个地方,就是在panel1事件中。
通过DarkDe软件,查看到Panel会调用OnDblClick(点击事件)。那么我们在Panel事件段首启用断点后将程序运行起来,经过测试发现只有在画板空白处双击OD才会断下来。
当该内存地址的数值为29D的时候,就会设置显现的输入框为可输入状态。该内存地址起始数值为28e,鼠标右击一次数值加3,。那么也就是说,右击注册按钮(29D-28E)/3=5次(PS:在注册窗体出现后不能在注册按钮上鼠标左击且右击只能五次)后再在画板空白处双击,这时显现的输入框状态才会变为可输入。
可以看到在Edit2事件中也有一个点击事件,那么我们在Edit2段首处设置断点后,到Edit2输入框点击看如何触发。
输入相关注册信息后,双击Edit2输入框就会发现程序中断下来。进行代码的跟踪分析。
要求注册用户名长度要是3的倍数,注册码的长度必须是8,注册码的第二个字节必须是_,第六个字节必须是,才可以。
这个事件分析完成后会发现并没有对第三处比较的内存地址有所改动,那么我们就需要对第三处比较的内存地址进行设置断点来跟踪。
设置好断点后,F9运行程序,就能看到对第三处比较的内存地址进行修改的事件是在FormMouseMove中。我们在该事件的段首设置断点来逐步分析。
判断image3(性相近)是否出现,若image3出现了,鼠标是否有在右下角移动。(PS:因为是处于FormMouseMove事件中,eax跟edx所表示的就是鼠标移动的坐标,我们在比较处设置条件断点eax>=0ex2 && edx>=12c就可以找到具体的位置了)
之后判断image2(性本善)是否出现,若是image2出现了,鼠标是否有在左下角移动。
操作完成后,就会在注册按钮的左边显现出一个数字。这时候,第三处的防御我们就解除了。
第四处比较会需要到两个内存地址和,我们在分析第三处比较的时候,会有看到内存地址的赋值。
对内存地址的赋值有四个值且是固定的,那么我们需要跟踪内存地址的变化,看是如何计算从而与内存地址的值进行比较的。
内存地址的值是在对图片的点击事件中触发的。这里以image1为例来分析代码。右键单击一次,内存地址的值就加上11(注意这里是十六进制数),左键单击一次,内存地址的值就加上2.那么我们只要根据提示的数字,对应的点击图片就可以解开第四道防御了。
第五处比较的内存地址的值是在Button1Click事件中触发的,也很简单,就是鼠标左键双击注册按钮就可以了,这样第五道防御也就解除了。至此整个逆向过程也就结束了。
最后总结下注册的整个流程:
1. 新建文件X:\ajj.126.c0m\j\o\j\o\ok.txt,文件内容为“ ajj写的CKme真烂!“(若是没有X盘,我们可以进行修改为D盘等其他盘。Txt文件中的内容最前面有一个空格,感叹号是英文字符)。本操作的作用是显示输入框Edit2,但这时候还是处于被禁用的状态,无法输入。
2. 打开程序,在“注册”按钮上用鼠标右键点击5次。本操作之前或之间都不能用鼠标左键点击按钮,并且本操作之后不能用鼠标右键点击按钮。
3. 在图片框中双击没有图片显示的空白位置。本操作与操作2相结合,是为了启用已显示的输入框让其可以进行输入。
4. 输入注册名和注册码,然后双击输入框Edit2。注册名必须为”ajj”,注册码长度为8且第2个字符为’_’且第6个字符为’,’。 (注册名和注册码的内容也可以自己进行修改)
5. 当图片3“性相近”出现时,鼠标在界面右下角移动一下;然后当图片2“性本善”出现时,鼠标在界面左下角移动一下。本操作的作用是在图片框下方显示一个粗体数字。
6. 根据上一操作显示的粗体数字点击图片框中的图片。(如何点击图片可以参考每张图片所对应加的值来操作)
7. 用鼠标左键双击“注册”按钮。
PS:这篇文章写了我好长时间,主要是这个程序破的很头疼,尤其是对Delphi不熟悉的时候,完全不知道怎么入手。希望大家看完之后能给个评分。@Shark恒 看在我写的这么辛苦的份上,是不是可以给个精华,我觉得这个是最繁琐的了,虽然爆破起来很简单。
你这认真劲儿,很快就追上你的师哥师姐们了。加油~ Shark恒 发表于 2017-11-20 21:12
你这认真劲儿,很快就追上你的师哥师姐们了。加油~
{:5_121:}有师姐吗,我怎么看好像都是师兄啊 {:5_121:}写的很好很强大啊,真厉害 经典中的经典的精华,很好! 有没有CM的链接啊。。。 小红最棒棒 发表于 2017-11-22 13:45
有没有CM的链接啊。。。
cm的链接啊,我下一篇文章的时候一起发吧 好难啊 任重而道远 虽然只能看懂一点点,但会继续坚持 今天正在逆向这个程序,遇到很多问题,学习了。
页:
[1]
2