《逆向工程核心原理》学习笔记8 内嵌补丁练习

《逆向工程核心原理》学习笔记8

内嵌补丁练习

忙于各种网课和作业,为Java和高数疲于奔命,我终于有时间来更一次了orz
《逆向工程核心原理》学习笔记8 内嵌补丁练习_第1张图片
这次更新的是关于如何在PE文件的空白部分加入补丁代码,并且让它们得到执行
链接: https://pan.baidu.com/s/1sFpjp-ngvnZ-4acrn1XrBA
提取码:sl08
这里提供了示例所用的程序,也就是书中所用的程序
下载完以后,准备好工具:x32dbg,PEviewer
让我们走上学习打补丁技术的奇妙之旅吧
《逆向工程核心原理》学习笔记8 内嵌补丁练习_第2张图片
首先双击这个文件,发现显示这样的窗口
《逆向工程核心原理》学习笔记8 内嵌补丁练习_第3张图片
《逆向工程核心原理》学习笔记8 内嵌补丁练习_第4张图片
首先在PEviewer中打开文件,找到EP的值
通常情况下EP=ImageBase+AddressOfEntryPoint
算出来是401000H,所以我们在x32dbg中直接转到401000H
《逆向工程核心原理》学习笔记8 内嵌补丁练习_第5张图片
按F4直接运行到EP处,之后按F7逐步运行
于是运行到这个位置
《逆向工程核心原理》学习笔记8 内嵌补丁练习_第6张图片
此时eax的值是4010F5,我们看到在mov ebx,eax指令之后有一个循环,这个循环对从4010F5H到401248H的所有内存单元都做了XOR 44的处理
我们先不管这段XOR到底有什么意义,接着往下看到代码对401007H到401085H的数据做了XOR 7的操作,所以我们在dump窗口查看401007的内容,并同时执行这段循环
我们看到那段内存中的乱七八糟的数据变成了有序的人能看懂的字符串

所以我们怀疑之前的那一段循环XOR也是在解密,只不过目前没看到效果
于是我们继续运行,发现程序又对4010F5那段内存做XOR运算,这次我们在dump窗口查看4010F5那段内存并同时运行代码(最好像我这样在循环后面的代码设上断点,这样挂断点跑程序更快hhhh)
运行前长这样
《逆向工程核心原理》学习笔记8 内嵌补丁练习_第7张图片
运行后长这样
《逆向工程核心原理》学习笔记8 内嵌补丁练习_第8张图片
所以说,这段字符串经过了二重加密,两段指向4010F5的代码都是在解密
接着往下运行有一个校验的过程,我们不要管它,打补丁的时候用不上
于是走到这,已经接近这个程序的尾声
《逆向工程核心原理》学习笔记8 内嵌补丁练习_第9张图片
这个jmp转移到OEP,就会连续显示两个窗口,窗口当中的内容就是解密的内容

而我们打补丁的目的就是要改变这个窗口当中的内容
然鹅,直接去修改内存显得很捞,由于原来的内容经过了加密,所以每次修改的时候还得加密字符串放进去,显得很麻烦
所以我们采取书上说的内嵌补丁的方式去修改字符串
我们在程序内部嵌入补丁代码
并让程序能够将这些代码进行执行,就能在不用考虑加密解密的情况下改变字符串了
我们发现文件加载到内存中后,401280后面有大量的空白,我们用HxD打开这个文件,找到680H位置(老公式了,不明白的自己算算,或者看看前面的博客)
《逆向工程核心原理》学习笔记8 内嵌补丁练习_第10张图片
我们在这段嵌入补丁代码
这里的任意一段都可以辣,只要空间足够

于是我们嵌入这样一段代码,用处是修改两处的字符串(以从401280开始的代码为例)

mov ecx,0C
mov esi,4012A8
mov edi,401123
rep movsb     //将esi指向的内存内容传到edi指向的内存空间
mov ecx,9
mov esi,4012B4
mov edi,40110A
rep movsb
jmp 40121E    //最后转移回到OEP

同时修改4012A8和4012B4处的内存为指定的内容,我修改为的是ReverseCore和Unpacked(跟着书来orz)如图

这样就把补丁代码写好了,右击代码窗口,点击补丁,或者直接Ctrl+P,就可以完成补丁书写

虽然写好了补丁代码,但是依然不能执行,因为原代码并没有转移到补丁代码的汇编指令,于是,我们将准备将原代码中的jmp 40121E修改成转移到jmp 401280

然鹅,我们查看一下jmp 40121E指令所在的内存单元,发现是401083,是处于401007~401085之间的,也就是说,这段代码是被解密过的,如果直接修改,是不能达到目的的
于是我们在HxD中去改一下这段代码,找到483H位置
我们知道,jmp 401280 的机器码是 E9 F8 01
而XOR加密的解密就是再XOR一次,因此
E9 XOR 7 = EE
F8 XOR 7 = FF
1 XOR 7 = 06
于是我们在HxD当中将这段数据改掉
就变成这个亚子
《逆向工程核心原理》学习笔记8 内嵌补丁练习_第11张图片
保存后执行
《逆向工程核心原理》学习笔记8 内嵌补丁练习_第12张图片
《逆向工程核心原理》学习笔记8 内嵌补丁练习_第13张图片
我们就成功将内嵌的补丁执行了

(终于把这个第二部分学完了,也写了8篇博客了,每一篇博客都是我在照着书学习时实践的过程以及出现的疑问和解答,在这之后可能会在这一系列学习笔记中间加入一些做的crackme小程序的wp,毕竟还是要多做题来实践自己的所学嘛:))

你可能感兴趣的:(《逆向工程核心原理》学习笔记8 内嵌补丁练习)