一、为什么要移动重定位表

数据目录中的表是分散在各个节里的,如果对节进行加密,操作系统找不到表,就无法加载程序。因此加密前要先把表移动到新的节里。

二、怎么移动

计算重定位表的大小,首先要遍历重定位表,累加 SizeOfBlock,然后新增一个节,大小是表的大小文件对齐。最后把表复制到新增节的开头,然后更新数据目录的VirtualAddress指向新的重定位表。

三、代码

// 移动重定位表到新增节,返回新缓冲区的大小
DWORD MoveRelocationTableToNewSection(LPVOID pFileBuffer, LPVOID *pNewFileBuffer, DWORD dwFileBufferSize)
{PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;PIMAGE_FILE_HEADER pPEHeader = (PIMAGE_FILE_HEADER)(pDosHeader->e_lfanew + (DWORD)pDosHeader + 4);PIMAGE_OPTIONAL_HEADER32 pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader + sizeof(IMAGE_FILE_HEADER));PIMAGE_SECTION_HEADER pSectionHeader = \(PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader + pPEHeader->SizeOfOptionalHeader);PIMAGE_BASE_RELOCATION pRelocationTable = (PIMAGE_BASE_RELOCATION)((DWORD)pFileBuffer + \RvaToFoa(pFileBuffer, pOptionHeader->DataDirectory[5].VirtualAddress));size_t i = 0;DWORD dwRelocationTableSize = 0;while (pRelocationTable->VirtualAddress || pRelocationTable->SizeOfBlock){dwRelocationTableSize += pRelocationTable->SizeOfBlock;//printf("%x\n", (pRelocationTable->SizeOfBlock - 8) / 2 );pRelocationTable = (PIMAGE_BASE_RELOCATION)((DWORD)pRelocationTable + pRelocationTable->SizeOfBlock);}DWORD dwNewBufferSize = AddSection(pFileBuffer, pNewFileBuffer, dwFileBufferSize, \Align(dwRelocationTableSize, pOptionHeader->FileAlignment));pDosHeader = (PIMAGE_DOS_HEADER)*pNewFileBuffer;pPEHeader = (PIMAGE_FILE_HEADER)(pDosHeader->e_lfanew + (DWORD)pDosHeader + 4);pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader + sizeof(IMAGE_FILE_HEADER));pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader + pPEHeader->SizeOfOptionalHeader);// 修改新增节属性为可读、含已初始化数据pSectionHeader[pPEHeader->NumberOfSections - 1].Characteristics = 0x40000040;// 指针指向重定位表pRelocationTable = (PIMAGE_BASE_RELOCATION)((DWORD)*pNewFileBuffer + \RvaToFoa(*pNewFileBuffer, pOptionHeader->DataDirectory[5].VirtualAddress));// 定义插入点为新增节的起始地址LPVOID pInsert = (LPVOID)((DWORD)*pNewFileBuffer + pSectionHeader[pPEHeader->NumberOfSections - 1].PointerToRawData);// 拷贝重定位表memcpy(pInsert, (LPVOID)pRelocationTable, dwRelocationTableSize);// 更新目录项,指向新的重定位表pOptionHeader->DataDirectory[5].VirtualAddress = FoaToRva(*pNewFileBuffer, \(DWORD)pInsert - (DWORD)*pNewFileBuffer);return dwNewBufferSize;
}

四、运行结果

修改前和修改后对比

五、完整代码

https://blog.csdn.net/Kwansy/article/details/106234264

移动重定位表到新增节相关推荐

  1. PE格式第七讲,重定位表

    PE格式第七讲,重定位表 作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶何为重定位(注意,不是重定位表格) 首 ...

  2. 写一个PE的壳_Part 2:ASLR+修复输入表(IAT)+重定位表支持(.reloc)

    系列汇总 写一个PE的壳_Part 1:加载PE文件到内存 写一个PE的壳_Part 2:ASLR+修复输入表(IAT)+重定位表支持(.reloc) 写一个PE的壳_Part 3:Section里实 ...

  3. exe文件解析_PE文件格式之重定位表

    一.重定向表的作用: 这个在网上有很多种解释,那我也说一下自己对这个表的解释,程序运行的时候一般有两种方式来调用函数就是OD的那个CALL,一个是基址+偏移,另一种就是写死的函数地址比如 CALL 0 ...

  4. Windows PE第6章 栈与重定位表

    第六章 栈与重定位表 本章主要介绍栈和代码重定位.站和重定位表两者并没有必然的联系,但都和代码有关.栈描述的是代码运行过程中,操作系统为调度程序之间相互调用关系,或临时存放操作数而设置的一种数据结构. ...

  5. 操作系统是如何使用重定位表的

    一.重定位表的结构 重定位表是数据目录中第6项,它的结构如图示: 重定位表由多个块(block)组成,每个块内部由三部分组成--VirtualAddress.SizeOfBlock 和若干个2字节偏移 ...

  6. PE结构基址重定位表

    PE体系 PE结构&整体叙述 PE结构&导入表 PE结构&导出表 PE结构&基址重定位表 PE结构&绑定导入实现 PE结构&延迟加载导入表 重定位表定位 ...

  7. PE学习(六)第六章 栈与重定位表 实例栈溢出、模拟加载器加载DLL、遍历重定位表

    第六章 栈与重定位表 16bit OS 存在长调用 lcall push cs,ip    相应的iret pop ip, cs  而call/ret only focus ip register 3 ...

  8. 了解动态链接(六)—— 重定位表

    柳条青青,南风熏熏,幻化奇峰瑶岛,一天的黄云白云,那边麦浪中间,有农妇笑语殷殷.问后园豌豆肥否,问杨梅可有鸟来偷:好几天不下雨了,玫瑰花还未曾红透:梅夫人今天进城去,且看她有新闻无有.-- 徐志摩·夏 ...

  9. elf文件中代码段有绝对地址但重定位表中无.text.rel

    阅读<程序员的自我修改>第三章 中关于ELF 文件结构描述 关于重定位表 P79时候产生的问题. 文章中说只要有绝对地址的段,就会有重定位.但是readelf -S helloWorld. ...

最新文章

  1. 几种开源软件名字的读音
  2. Windows Mobile与OPhone开发对比
  3. linux c/c++
  4. Kafka生产者详解
  5. SpringBoot入门教程(十五)集成Druid
  6. python设置一个初始为0的计数器_python中统计计数的几种方法
  7. 红帽启动oracle,Redhat6.5 + oracle 11gR2 设置数据库开机自启动
  8. Nerd的套现ATM机
  9. 支付设计白皮书:支付系统的概念与中国互联网支付清算体系
  10. 【OpenCV】 300行写出全能扫描王
  11. 解决win10笔记本电脑Wifi频繁自动断开
  12. 深入理解GAN对抗生成网络
  13. python打印26个英文字母和数字
  14. 登链钱包(一款功能强大的以太坊钱包)完全开源
  15. 【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯
  16. Miscellaneous Warning EPERM: EPERM: operation not permitted
  17. Python实现文件简单加解密
  18. win7系统怎么调亮度_win7系统怎么打开vsd文件 win7系统打开vsd文件步骤【图文】...
  19. 【Codeforces 1083A】The Fair Nut and the Best Path
  20. 每次都戳到我的笑点,那个不同寻常的自黑达人,雷军

热门文章

  1. 计算机设置从光盘启动怎么办,设置BIOS从光盘启动教程
  2. 成功解决TypeError: ‘str‘ object is not callable
  3. Python之多线程:python多线程设计之同时执行多个函数命令详细攻略
  4. ML之分类预测:基于sklearn库的七八种机器学习算法利用糖尿病(diabetes)数据集(8→1)实现二分类预测
  5. Go Iris 中间件
  6. MySQL慢查询日志ES索引模板
  7. 仿京东首页上侧导航左侧地址栏布局(1)
  8. Winform ComboBox控件高亮显示
  9. JS模块化写法(转)
  10. FCKeditor 2.6.4.1 初始化值不能显示中文问题