因此,为了解析PE进程内存中的IAT表并获取导入函数的名称,我们必须对每个模块的函数进行迭代,对于每个模块,使用thunkData->u1.AddressOfData +2来开始函数名字符串的开头(我不想开始解释这些指针是什么,因为我假设任何知道这个问题答案的人都知道这一点。u1是一个预定义的结构,它有并且总是有AddressOfData )
基本上,对于IAT中的每个函数,我们必须使用u1.AddressOfData +2来获得字符串开头的地址,但是我不知道它的开头2字节是什么?Microsoft文档没有解释这一点:
https://learn.microsoft.com/en-us/windows/win32/debug/pe-format
(查找“延迟导入名称表”)
我试着调试它并查看它们开头的值,它们是像0x8600和0xe 700这样的东西,所以通常是1字节的数据和1字节的00。
那这是什么?
发布于 2019-09-02 13:45:01
在IMAGE_THUNK_DATA结构中,如果函数地址尚未解析,且函数没有按序号- AddressOfData快速执行,则指向PIMAGE_IMPORT_BY_NAME (如果在winnt.h和/或ntimage.h中查看,这是可见的)。
typedef struct _IMAGE_IMPORT_BY_NAME {
USHORT Hint;
CHAR Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;名称之前的前两个字节--这是AddressOfNames导出的名称表中的提示索引(查找IMAGE_EXPORT_DIRECTORY )。此表的名称按字母顺序排列,用于快速二进制搜索函数。提示用于快速检查,然后进入二进制搜索。如何使用它,我们可以在wrk src代码中查看。
//
// Lookup Name in NameTable
//
NameTableBase = (PULONG)((PCHAR)DllBase + (ULONG)ExportDirectory->AddressOfNames);
NameOrdinalTableBase = (PUSHORT)((PCHAR)DllBase + (ULONG)ExportDirectory->AddressOfNameOrdinals);
//
// Before dropping into binary search, see if
// the hint index results in a successful
// match. If the hint index is zero, then
// drop into binary search.
//
HintIndex = ((PIMAGE_IMPORT_BY_NAME)NameThunk->u1.AddressOfData)->Hint;
if ((ULONG)HintIndex < ExportDirectory->NumberOfNames &&
!strcmp((PSZ)((PIMAGE_IMPORT_BY_NAME)NameThunk->u1.AddressOfData)->Name,
(PSZ)((PCHAR)DllBase + NameTableBase[HintIndex]))) {
OrdinalNumber = NameOrdinalTableBase[HintIndex];
}
else {
//
// Lookup the import name in the name table using a binary search.
//然而,该索引通常只能在系统映像中有效。如果我们自己构建映像--在最好的情况下,此提示只能对一个windows版本有效(我们从lib文件中获得提示)--当创建新版本窗口时--通常添加了新的导出api,因为表是按字母顺序排序的--索引可以更改。
https://stackoverflow.com/questions/57757473
复制相似问题