脱壳与加壳-加壳-7-修复重定位表

 

 

前面采用的方案是:给被加壳的程序添加一个新的区段,然后使用link命令把壳代码的数据段和代码段全部合并在一起合并到.text段里面,然后把壳.dll文件加载到程序的内存,然后把壳的代码段copy到被加壳的程序的壳代码段里面,然后读取壳.dll文件中的.reloc重定位表然后修复壳代码里面的重定位表,然后修改OEP使得先进入壳代码,然后再回到真正的OEP

这里需要的是实现dll的重定位表,因为dll文件肯定是需要随机基址的,有可能一个程序有好几个dll文件,不可能给某一个dll固定地址,所以这里由于dll基址改变所以需要重新修复重定位表

重定位标结构

 

 

首先:拿到对应的重定位表中的小方块的值,然后小方块的值+VirtualAddress= RVA

RVA+imageBase = va

va = xxxxxx

//这里的xxxx才是重定位表中需要修复的地址,因为va对应的就是xxxx也是一个地址

这里唯一需要注意的就是imagebase,因为需要处理的是从dll到exe的imagebase的改变 之后来修复,如果程序没有开随机基址,就可以用0x4000000来对EXE处理,但是如果开了,就不能这样处理,就需要用对应的PE文件来找到ImageBase后处理

如何动态修复壳代码的重定位表?

将被加壳程序的重定位表地址指向壳代码的重定位表地址,让操作系统来修复

.reloc重定位表

.idata导入表

这两个区段不能通过linker命令去合并

所以只有把.reloc继续也移动到区段里面

步骤

1 取消合并区段,将壳.dll所有区段移动到被加壳程序的新区段中

2 修复壳代码的重定位表指向的地址,因为原来的是壳.dll的imagebase,现在是被加壳程序的imagebase

3 修改重定位表:virtualAddress需要修复,因为这里已经是被加壳程序的rva了

4 修改dataDirctory[5].virtualAddress的值和....size的值:也就是修改重定位表指向的地址的值和重定位表的大小,这里操作系统会判断,如果有问题就不会加载

5 壳代码修复被加壳程序的重定位表:也可以解密后用操作系统来修复,当然也可以自己写壳代码来修复

代码实现

  嘿嘿,摸鱼了,不想写了