一丶简介翻译
根据上面所讲PE知识.咱们已经能够实现咱们的一点手段了.好比PE的入口点位置.改成咱们的入口位置.而且填写咱们的代码.这个就是空白区添加代码.blog
咱们也能够利用这个知识.实现PEDLL注入. 原理就是 修改入口. 跳转到咱们空白区执行咱们的代码.咱们空白区进行重定位.调用Loadlibary. 而且load的是咱们的DLL内存
实现功能就是 咱们只要给PE注入了代码.那么这个PE程序一旦启动就会加载咱们的DLL博客
关于PEDLL注入,后面会有博客分类中会讲解.此时首先讲解怎么在咱们的空白区添加咱们的代码.原理
二丶空白区添加代码的注意事项.扩展
在空白区添加代码.首先就要熟悉汇编知识.由于咱们添加的代码都是机器码.而机器码是被翻译成汇编指令.本质仍是机器码.程序
还须要注意的是重定位技术. 好比 E9 对应汇编是JMP. 那么后面跟着的是一个偏移. 偏移的计算公式 (目的地址 - 源地址 - JMP指令长度(5)) == 偏移.im
这两点熟悉了那么下面就好办了.技术
空白区添加代码的步骤:数据
1.寻找OEP所对应的文件偏移位置.
2在文件中修改OEP的指向.
3.指向咱们的空白区
4.空白区添加咱们的代码.
三丶实战空白区添加代码
1.寻找OEP所在的文件偏移位置
首先随便找一个文件,查看扩展头中OEP RVA 以及 ImageBase, 而且换算出属于哪一个节.而且转换为文件偏移.
例以下图:
得出OEP RVA == 0x01104b 得出 ImageBase为 0x00400000 那么内存中OEP开始位置就是 RVA +Imagebase == 0x1104b + 0x00400000 == 0x0041104b
查看RVA属于哪一个节.
首先线观看两个节,第一个节 Textbss 在内存中的位置是0x1000开始,由于要判断RVA >= 节.虚拟地址 && RVA <= 节.虚拟地址 + 节.节数据对齐后的大小 才能够.可是第一个节并无节对齐后的大小.因此不能判定.
因此看第二个节,第二个节 text节. 内存中展开的虚拟地址是 0x011000 而且 节对齐后的大小是 0x00004E00 . 判断RVA就是属于这个节.因此算出差值偏移.,而且求出FOA位置
RVA - 节.RVA == 差值偏移 0x1104b - 0x11000 == 0x4b 差值偏移为0x4b
差值偏移 + 文件偏移 == FOA 0x4b + 0x400 == 0x44b
那么0x44b位置就是OEP的入口代码执行处.
内存中查看代码是否跟咱们文件偏移代码出同样
能够看到OEP在内存中的地址位 0x0041104b.而且对应的代码为 E9 400F0000 E9后面是一个偏移. 是目的地址 - OEP地址 - JMP指令长度(5) 得出的一个偏移.
2.修改OEP指向
上面咱们获得了OEP的位置.而且得出对应机器码了. 那么咱们彻底能够修改OEP的指向.指向咱们的空白区位置.
好比指向PE文件中0x2开始的位置. 也就是 MZ成员后面的字节. DOS就两个重要成员.其他的位置咱们能够随便使用.
由于E9后面是偏移. 因此咱们要跳转到PE中0x2的位置. 但由于PE在内存中展开的时候.是以Imagebase成员为基址进行展开的.因此咱们要跳转的位置是 0x00400002的位置.
计算一下偏移公式.
目的地址 - 源地址 - 5 = 0x00400002 - 0x0041104b ==0xFFFEEFB2 得出偏移了.那么咱们在文件中OEP位置就能够进行修改了.
修改后. 注意是小端模式修改.
内存中查看修改后
能够看到OEP跳转的位置为0x00400002位置.此时咱们在0x400002位置.添加咱们的代码便可.
3.空白区填写咱们的代码
之前咱们OEP跳转的位置为 0x411f90 也就是这个位置是咱们代码开始执行位置. 此时咱们OEP跳转到了 0x00400002位置. 因此咱们在0x400002位置添加咱们的代码
咱们能够在空白区位置添加一个代码,例如 C3 (ret)
内存中查看.是否跳转的位置代码执行是c3
已经更改成C3了. 那么此时咱们也能够本身进行重定位.继续让代码跳转到咱们之前没修改OEP指向的时候的位置.
之前的位置为 0x411f90 如今位置 0x400002
进行重定位
目的地址 -源地址 - JMP指令长度(5) ==0x11F89
因此咱们在C3的位置改为E9 后面的偏移按照小端模式填写到文件中便可.
运行咱们的程序.看看代码是否成功修改
确实代码成功修改也能跳转到咱们原OEP代码执行位置.
可是当x32dbg执行的时候.会出现C05内存访问异常.缘由是咱们这个地方的内存属性.并非可执行的.因此会出现内存访问同样.咱们须要修改内存属性才能够.
不过上面所说已经完成了一个空白区添加代码了.具体能够本身尝试.去找空白区便可.