首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么体育需要原始的第一堂(OFT)?

为什么体育需要原始的第一堂(OFT)?
EN

Stack Overflow用户
提问于 2017-02-23 11:04:35
回答 3查看 4.6K关注 0票数 8

有"First“(FT),加载程序在执行后用正确的地址覆盖它。

但是当PE使用OFT的时候?

体育需要它吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-23 13:22:45

如果导入是绑定的,但是导入的.DLL不匹配,则需要原始的第一个thunk。

在新的未修补版本的Windows上,基本.DLLs (ntdll、kernel32、user32等)中所有函数的所有地址都是已知的。以shell32为例,它链接到kernel32!CreateProcessCreateProcess的真实地址可以直接存储在shell32中。这称为进口装订,并允许加载程序跳过查找导入函数的所有地址的步骤。

如果导入的.DLL未加载到其首选地址,或者.DLL已更改(安全、更新等),则此操作不起作用。如果发生这种情况,则加载程序必须查找“正常方式”的函数,并且必须使用原始的第一个thunk数组,因为这是存储函数名称的RVA的唯一位置。

如果未使用导入绑定,则原始的第一个thunk数组是可选的,可能不存在。

ASLR可能已经使这个优化变得无关紧要了。

票数 13
EN

Stack Overflow用户

发布于 2018-06-05 09:17:40

让我在这里为你总结很多事情。例如,当您加载一个库,然后尝试从类似于Milad.dll的库调用一个函数时,windows操作系统的动态加载程序必须解析MPrint函数的地址,然后调用它。操作系统如何解析该函数的地址?

窗户经过一些非常复杂的东西,我想用简单的舌头告诉你这些步骤。windows OS中解析DLL中函数地址的动态加载程序必须检查Import (INT)、(IOT)和Import (IAT)表。这些表由AddressOfNames、AddressOfNamesOrdinal和AddressOfFunction成员在导出目录中指向PE结构.

操作系统在目标进程的地址空间中加载Milad.dll后,利用LoadLibrary在进程的目标地址空间中填充INT、IOT和IAT表,并进行计算。

流程结构中有一个包含OriginalFirstThunk、TimeDateStamp、ForwarderChain、Name、FirstThunk的important数组,这些成员指向一些重要的地址。

  1. name in Import (Image_Import_Data)指向进程试图调用的DLL的名称,在本例中,此DLL为Milad.dll。
  2. OriginalFirstThunk指向Import表,它包含由Milad.Dll导出的函数的名称。这个表中的函数有一个唯一的索引,加载器获取该索引,然后转到下一步,并引用带有该索引的,并将存在的值输入到的索引中,它是另一个整数值。
  3. FirstThunk是另一个指向IAT的重要成员。在前面的步骤中,动态加载器通过IOT获取一个整数值。此值是一个索引号,动态加载程序使用该值引用IAT。在本表中,动态加载器从IOT获取的索引值中有一个地址。在这些步骤之后,当动态加载器找到函数的正确地址时,它将该地址放到MPrint函数的Import表中。因此进程可以用其地址调用该函数。

这是一个简单的解释,复杂的东西,装载机所做的解决地址在DLL中通过名称,OFT(INT)和FT成员在Image_Import_Data。

票数 4
EN

Stack Overflow用户

发布于 2018-08-02 06:44:38

我们需要知道,当PE文件加载到内存中时,PE加载程序将查看IMAGE_THUNK_DATAs和IMAGE_IMPORT_BY_NAMEs并确定导入函数的地址。然后将FirstThunk指向的数组中的FirstThunk替换为函数的实际地址。因此,当PE文件准备运行时。OriginalFirstThunk指向的RVA数组保持不变,以便如果需要查找导入函数的名称,PE加载程序仍然可以找到它们。

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

https://stackoverflow.com/questions/42413937

复制
相关文章

相似问题

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