危险漫步博客
有时候,正是那些意想不到之人,成就了无人能成之事。
文章1443 浏览13839125

文件补丁及内存补丁

用OD修改CRACKME是比较容易的,如果脱离OD该如何修改呢?其实在OD中修改了反汇编的指令以后,对应的在文件中修改的是机器码,只要在文件中能定位到指令对应的机器码的位置,那么直接修改机器码就可以了,JNZ对应的机器码指令为0X75,JZ对应的机器码指令为0X74,也就是说,只要在文件中找到这个要修改的位置,用十六进制编辑器把0X75修改为0X74即可,如何能把这个内存中的地址定位到文件地址呢?这就是前面介绍的PE文件结构中把VA转换FILEOFFSET的知识了。

具体的手动步骤大家自己尝试,我们直接通过写代码进行修改吧,为了简单起见,这里使用控制台来编写,而且直接对文件进行操作,中间的步骤就省略了,想必有了思路以后对于大家来说已经不是难事了。

看一下关于文件补丁的代码。

代码给出了详细的注释,只要吧CrackME文件拖放到文件补丁上即可,如图4-61即可。

通常在做文件补丁以前一定要对打算进行修改的位置进行比较,以免产生错误的修改。程序使用的方法是将要修改的部分读出来,看是否与用OD调试时的值相同,如果相同则打补丁,由于这里只是介绍编程知识,针对的是一个CRACKME,如何对某个软件进行了破解,自己做了一个文件补丁发布出去给别人使用,不进行相应的判断就直接进行修改,很有可能导致软件不能使用的情况,因为对外发布以后你不能确定别人所使用的软件的版本等因素,因此,在进行文件补丁时最好判断一下,或者是用COPYFILE()对文件进行备份,

内存补丁

相对于文件补丁来说,还有一种补丁是内存补丁,这种补丁是把程序加载到内存中以后对其进行修改,也就是说本身是不对文件进行修改的,要将CRACKME载入内存中,载入内存可以调用CREATEPROCESS()这个API函数来完成,这个函数参数众多,功能强大,使用CREATEPEOCESS()创建一个子进程,并且在创建的过程中将该子进程暂停,那么就可以安全的使用WRITEPROCESSMEMORY()函数来对CRACKME进行修改了,整个过程也比较简单,下面直接来阅读代码。

代码中固定注释比较详细,代码的关键是要进行比较,否则会造成程序的运行崩溃,在进行内存补丁前,需要将线程暂停,这样做的好处是有些情况下可能没有机会进行补丁就已经执行完需要打补丁的地方了,当打完补丁以后,在恢复线程继续运行就可以了.

文件补丁与内存补丁就已经介绍完了,对于这两种补丁来说,都是通过前面学道的知识来完成的,可见前面的基础知识的用处还是非常广泛的,用了这么多的篇幅来介绍使用OD破解CRACKME,也介绍了文件补丁和内存补丁,那么,接下来就要开始学习调试API了,掌握了调试api以后,完全可以打造一个类似于OD这样的应用程序调试器,让我们一步一步学习吧!