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常量
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2022-8-17 11:42
被三一米田编辑
,原因: