逆向工程核心原理-第十七章-从可执行文件中删除.reloc节区
17.1 .reloc节区
在EXE中, .reloc(基址重定位表)几乎没什么用, 所以删除了也没事. 我们使用HexEditor删除
17.2 reloc.exe
准确删除.reloc节区的步骤:
- 整理.relocc节区头
- 删除.reloc节区
- 修改IMAGE_FILE_HEADER(文件头)
- 修改IMAGE_OPTIONAL_HEADER(可选头)
下面我们分步实现这些步骤
17.2.1 删除.reloc节区头
之前都没下PEview直接看的书, 还是下一个自己看看会好一些.
可以看到是从文件偏移270开始的, 大小是0x28, 最后一个开头是0x294, 大小是四个字节(这个要根据实际判断)
我们用00来填充, 使用工具栏Edit → fill
17.2.2 删除.reloc节区
由PEview(图在上面)可以找到.reloc节区的起始位置为C000, 在HexEditor中找到地址C000
因为.reloc节位于文件的末尾, 所以要删除的话直接删除到底就行了.
但是我们还要修改文件头, 避免其中记录了错误的信息: 比如里面的信息显示.reloc存在, 可在我们删除了.reloc后这就成为了错误的信息.
17.2.3 修改IMAGE_FILE_HEADER(文件头)
我们首先在PEview中找到文件头.
- 第一个小红框我们知道了文件头和需要修改的成员的位置, 方便我们去HED中去修改
- 第二个小红框就是我们要修改的数据: 这个成员负责记录节区数, 因为我们已经删除了一个节区, 所以我们要在原值的基础上减一, 5 → 4
下面我们在EHD中修改
修改为4
17.2.4 修改IMAGE_OPTIONAL_HEADER(可选头)
删除掉了.reloc节区后, 整个映像也减小了相应的大小. 映像大小存储在可选头中, 我们去修改.
首先使用PEview查看
知道了文件偏移在128, 大小为11000.
修改之前我们还需要知道我们减少的大小是多少个字节
我们在PEview中重新看回.reloc的节区头
知道了减去的大小为E40, 但是我们还要考虑节区的粒度大小, 也就是可选头的成员, 节区映射后所占实际虚拟空间为可容纳节区的粒度最小整数倍, 我们使用PEview查看
粒度为1000, 节区大小为E40, 所以我们要在SizeOfImage减去1000, 也就是10000
下面再HED中修改
排列为小端排序, 修改后
这次我们完成了修改, 程序修改后仍然能正常运行