首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PE文件映射的IAT内存中,u1.AddressOfData开头的2字节是多少?

在PE文件映射的IAT内存中,u1.AddressOfData开头的2字节是多少?
EN

Stack Overflow用户
提问于 2019-09-02 13:05:56
回答 1查看 308关注 0票数 1

因此,为了解析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。

那这是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-02 13:45:01

IMAGE_THUNK_DATA结构中,如果函数地址尚未解析,且函数没有按序号- AddressOfData快速执行,则指向PIMAGE_IMPORT_BY_NAME (如果在winnt.h和/或ntimage.h中查看,这是可见的)。

代码语言:javascript
复制
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代码中查看。

代码语言:javascript
复制
    //
    // 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,因为表是按字母顺序排序的--索引可以更改。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57757473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档