脱壳与加壳-加壳-7-修复重定位表
脱壳与加壳-加壳-7-修复重定位表
脱壳与加壳-加壳-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