压缩与脱壳-脱壳高级篇 上
2007-01-12 20:11:51 来源:WEB开发网核心提示: ===首先是一些关于输入表和 RVA/VA 的简介,输入表的相对虚拟地址(RVA)储存在 PE 文件头部的相应目录入口(它的偏移量为[ PE 文件头偏移量+80h ]),压缩与脱壳-脱壳高级篇 上(5),由于是虚拟偏移量,所以它和文件输入表中的偏移量(VA)是不匹配的(除非文件纯粹是刚刚从
===========
首先是一些关于输入表和 RVA/VA 的简介。
输入表的相对虚拟地址(RVA)储存在 PE 文件头部的相应目录入口(它的偏移量为[ PE 文件头偏移量+80h ])。由于是虚拟偏移量,所以它和文件输入表中的偏移量(VA)是不匹配的(除非文件纯粹是刚刚从内存中 Dump 出来的)。于是我们首先要做的事情是,找到 PE 文件的输入表,将 RVA 转换为相应的 VA。为此,我们可以采用不同的办法:你可以自行编制软件来分析块(Sections)目录并计算 VA,但最简单的办法是使用专门为此设计的应用程序接口(API)。这个 API 包括在 IMAGEHLP.DLL(Win9X 和 NT 系统都使用的一个库)中,名为 ImageRvaToVa。下面是对它的描述(完整的内容详见 MSDN 库):
# LPVOID ImageRvaToVa(
# IN PIMAGE_NT_HEADERS NtHeaders,
# IN LPVOID Base,
# IN DWORD Rva,
# IN OUT PIMAGE_SECTION_HEADER *LastRvaSection
#);
#
# 参数:
#
# NtHeaders
#
# 指示一个 IMAGE_NT_HEADERS 结构。通过调用 ImageNtHeader 函数可以获得这个结构。
#
# Base
#
# 指定通过调用 MapViewOfFile 函数映射入内存的一个映象的基址(Base Address)。
#
# Rva
#
# 指定相对虚拟地址的位置。
#
# LastRvaSection
#
# 指向一个指定的最终 RVA 块的 IMAGE_SECTION_HEADER 结构。这是一个可选参数。当被
#指定时,它指向一个变量,该变量包含指定映象的最后块值,以便将 RVA 转换为 VA
。就这么简单。你只需要将 PE 文件映射入内存,然后调用这个函数就能够得到输入表的正确 VA。
注意,下面我会忽略所有的 RVA/VA 注释,但是,当你对重建的 PE 文件进行读出或写入RVAs 操作时,不要忘记它们之间的转换。
更多精彩
赞助商链接