PE文件分析——重定义表
-
有一些变量是直接赋值一个地址,这个地址如果直接拿来给内存就不对了,因为加载到内存后的地址是随机的。所以,PE文件创建了多张表,用来存放写死了数据的地址。
获得重定义表:和导出表导入表相同,得到PE头的数据目录表后访问具体的某个数组元素后,进入IMAGE_DATA_DIRECTORY结构体,然后访问VirtualAddress字段来获取地址,然后强转使用。
重定义表存放数据流程:先将数据地址的第一个拿来用,比如说第一个数据地址是0x40001,那么第一个表的VirtualAddress 就是0x40000,然后第一个块下面存放0x1,最大的块的内存为0x1000,超过了就要换下一个块了。常用的一个公式是:VirtualAddress + 存放的偏移地址 = 需要修复的地址RVA。判断地址是否需要修复:在重定义表结构体下面,都是WORD类型的数据,两个字节两个字节的16位存储,取16位的前四位,如果等于3表示该地址需要修复。
也就是说存放的地址一共16位,前四位是拿来判断该地址是否可以修复,后12位才是来存放地址,真正的地址RVA = 后12位+VirtualAddress
西南地区IT社群(QQ)
- 云南
- 【昆明网页设计交流吧】243627302
- 【昆明nodejs交流吧】 243626749
- 【VUE】838405306
- 【云南程序员总群】343606807
- 【昆明UI设计】104031254
- 【云南软件外包】15547313
- 贵州
- 【PHP/java源码/站长交流群】55692114
- 四川
- 【成都Java/JavaWeb交流】86669225
- 【vaScript+PHP+MySql】116270060
- 【UI设计/设计交流学习群】135794928
- 重庆
- 【诺基亚 JAVA游戏博物馆】 559479780
- 【PHP,Java,Python,C++接单】 442103442
- 西藏