一、为什么需要基址重定位
每个模块都会默认加载到PE头的Image Base的虚拟地址处,如果多个模块的默认基址相同,那么会发生冲突。
假设一个模块内部的汇编指令引用了一个“绝对地址”(虚拟地址VA),这条汇编指令正确引用数据当且仅当这个模块按照Image Base加载进内存。但是由于冲突的存在,我们需要修改这条指令所引用的数据的虚拟地址,这就是基址重定位。
二、如何重定位
模块会有一个重定位表,表中记录了模块中使用的“绝对地址”的存放位置(相对虚拟地址)。根据这个相对虚拟地址找到这些“绝对地址”,将这些“绝对地址”减去模块默认的Image Base得到“相对地址”,再加上实际上加载到的Image Base,得到正确的修正后的“绝对地址”。
三、删除.reloc节区
写恶意代码的时候会用得上,删除节区后修改PE头被影响的地方即可。