tuts4you-lena151-Crackme-tutorial14

一、前言

(一)、本次破解的是一个基于时间校验的程序,破解过程需要注入一些代码,也就是所谓的内嵌补丁,并且会使用两种方法进行破解。

(二)、工具:x32dbg

(三)、打开程序,如下图,直接就弹窗,提示注册过期了。


二、破解过程

(一)、方法一

1.载入程序,并对有的API KillTimer()函数进行下断点,如下图。

2.进入程序的注册输入框,任意输入字符串,并且点击注册,程序会自动停在注册区域。


程序并没有暂停在我们刚刚设置的断点上,所以搜索错误提示的字符串。


3.双击进入到这个字符串的区域,可以看到首先会检测有没有用户名的输入,其次再是校验序列号,校验代码应该是下面的一段


在内存的dump窗口中,能可以看到522388地址处的[EAX-0x8]存储的是应该是字符串的长度,接下来马上有个JNL的比较,因此判断这应该有个长度校验,可以在这个地址下硬件断点,看是否有getLength()函数访问它,具体的验证我就不做。


4.重新回到注册的窗口,这次输入长度为8以上的注册字符,预料之中注册失败


但这次提示变了,因此我们继续在所有的KillTimer()函数处下断点


接下来再次点击注册,程序停在了如下位置,从提示的字符串能够看出,这个区域是注册的程序。


5.往上滚动,发现决定跳转的是下面这个区域。

双击往上,到达这个地址,发现能否到达这个地址又被另一个地址的判断所决定


最后经过几次这种套路的跳转,我们到达这个函数的入口附近,第一个决定跳转的位置。

6.在函数的入口点004DBD80处下断点,并且取消所有的TimeKiller()函数调用处的断点,重新执行注册过程,仔细分析。

      程序中断在了注册函数的入口点处,F8步进,进行分析。

我们发现在004DBD9E地址上的mov对eax赋值的语句决定了整个程序的走向。

再向下滚动,最后的eax=0x8能让程序成功注册,这个值我是尝试过几次才得出的。。。。。

7.尝试在此处修改汇编代码,但如果直接使用mov eax,0xb则需要5个字节,但现在只有3个字节的空位,因此只有使用内嵌补丁了

先找一块代码洞,这里可以直接把滚动条,拉到最下面,然后插入代码片。

再在跳转处修改代码

8.执行程序,测试结果,发现不会再有弹窗了

三、总结

1.学习如何插入内嵌补丁

2.如何分析时间限制的程序


猜你喜欢

转载自blog.csdn.net/h123120/article/details/80232539