gpt4 book ai didi

c - PE装载机中的搬迁

转载 作者:行者123 更新时间:2023-11-30 14:55:46 27 4
gpt4 key购买 nike

我正在尝试制作一个 PE 加载器来了解有关可移植可执行文件的更多信息。我遇到的问题是 IAT 的处理。我无法理解这段代码的作用。

PIMAGE_THUNK_DATA nameRef = (PIMAGE_THUNK_DATA)((DWORD_PTR)dwMapBase + pImportDesc->Characteristics);
PIMAGE_THUNK_DATA symbolRef = (PIMAGE_THUNK_DATA)((DWORD_PTR)dwMapBase + pImportDesc->FirstThunk);
for (; nameRef->u1.AddressOfData; nameRef++, symbolRef++)
{
if (nameRef->u1.AddressOfData & 0x80000000)
{
symbolRef->u1.AddressOfData = (DWORD)GetProcAddress(hMod, MAKEINTRESOURCE(nameRef->u1.AddressOfData));
}
else
{
pImportName = (PIMAGE_IMPORT_BY_NAME)(dwMapBase + nameRef->u1.AddressOfData);
symbolRef->u1.Function = (DWORD)GetProcAddress(hMod, (LPCSTR)pImportName->Name);
}
}

我知道,尽管特性我们确定了授予页面READ、WRITEEXECUTE权限的部分,但没有发生任何此类情况这里。通过使用一些已经存在的代码,我编写了一个 PE 加载程序,但没有错误,并且可执行文件未加载。只要给出正确方向的提示就足够了。谢谢。

PS代码可以在这里找到https://pastebin.com/0ZEn0i8k

最佳答案

您放置的那段代码仅用于一个目标:解析导入表,因此对外部函数的每次调用都可以使用该导入函数的实际地址进行。您可以查看此页面以获取更多技术信息:https://msdn.microsoft.com/en-us/library/ms809762.aspx

DWORD Characteristics

At one time, this may have been a set of flags. However, Microsoft changed its meaning and never bothered to update WINNT.H. This field is really an offset (an RVA) to an array of pointers. Each of these pointers points to an IMAGE_IMPORT_BY_NAME structure.

因此,您的代码片段接收一个指向导入记录数组的指针作为 nameRef 变量。然后,每次导入都可以是可能的模式之一:

  1. 按函数序号导入:这是“if”发生的地方。序数总是与 0x8000000 组合,因为用户代码永远不会映射到如此高的区域。所以,“八大”只是说“这不是一个地址!”。
  2. 按函数名称导入:这是“else”分支。 “大八”以下的任何非零 AddressOfData 都指向 ASCII-Z 字符串。
  3. 零 - 这是导入结束表,虚拟记录。

在两种非零情况下,GetProcAddress 应该将导入(按序号或按名称)解析为内存中的实际地址。

关于c - PE装载机中的搬迁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45550990/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com