有"First“(FT),加载程序在执行后用正确的地址覆盖它。
但是当PE使用OFT的时候?
体育需要它吗?
发布于 2017-02-23 13:22:45
如果导入是绑定的,但是导入的.DLL不匹配,则需要原始的第一个thunk。
在新的未修补版本的Windows上,基本.DLLs (ntdll、kernel32、user32等)中所有函数的所有地址都是已知的。以shell32为例,它链接到kernel32!CreateProcess,CreateProcess的真实地址可以直接存储在shell32中。这称为进口装订,并允许加载程序跳过查找导入函数的所有地址的步骤。
如果导入的.DLL未加载到其首选地址,或者.DLL已更改(安全、更新等),则此操作不起作用。如果发生这种情况,则加载程序必须查找“正常方式”的函数,并且必须使用原始的第一个thunk数组,因为这是存储函数名称的RVA的唯一位置。
如果未使用导入绑定,则原始的第一个thunk数组是可选的,可能不存在。
ASLR可能已经使这个优化变得无关紧要了。
发布于 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数组,这些成员指向一些重要的地址。
这是一个简单的解释,复杂的东西,装载机所做的解决地址在DLL中通过名称,OFT(INT)和FT成员在Image_Import_Data。
发布于 2018-08-02 06:44:38
我们需要知道,当PE文件加载到内存中时,PE加载程序将查看IMAGE_THUNK_DATAs和IMAGE_IMPORT_BY_NAMEs并确定导入函数的地址。然后将FirstThunk指向的数组中的FirstThunk替换为函数的实际地址。因此,当PE文件准备运行时。OriginalFirstThunk指向的RVA数组保持不变,以便如果需要查找导入函数的名称,PE加载程序仍然可以找到它们。
https://stackoverflow.com/questions/42413937
复制相似问题