- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在 PE 格式中,我们有导入表目录(通过 IMAGE_DIRECTORY_ENTRY_IMPORT
访问)和 IAT 目录(通过 IMAGE_DIRECTORY_ENTRY_IAT
访问)两者都是可选 header 数据目录的一部分。
加载器使用导入表动态加载和解析必要的库和函数。这是通过迭代导入地址表 RVA(Thunk 表)来完成的,它是导入表的一部分。
那么,如果我们使用导入目录来进行导入解析,我们需要 IAT 目录做什么?
我一直在阅读 Microsoft PE specification但找不到答案。此外,SO 中也有一些问题,但大多数问题使用 IAT 来引用 Thunk 表而不是 IAT 目录。
谢谢
编辑
我认为在导入表目录中的导入地址表和称为 IAT 目录的导入地址表之间存在混淆。我的问题是关于 IAT 目录。
再次感谢
最佳答案
它在您链接的 PE 规范第 5.4.4 章中有很好的描述。它们是相同的表:
The structure and content of the import address table are identical to those of the import lookup table, until the file is bound. During binding, the entries in the import address table are overwritten with the 32-bit (for PE32) or 64-bit (for PE32+) addresses of the symbols that are being imported. These addresses are the actual memory addresses of the symbols, although technically they are still called “virtual addresses.” The loader typically processes the binding
也许解释为什么这样做很重要。 PE 文件通过将其直接映射到内存来加载到进程中。底层操作系统原语是内存映射文件。这提供了几个重要的优化:
可执行文件使用的内存不必由分页文件支持。如果操作系统需要 RAM 用于另一个进程,则可以简单地丢弃映射到可执行文件的页面。当进程产生页面错误时从 PE 文件重新加载。
进程用于其可执行代码的 RAM 可以由进程的任何实例共享。换句话说,当您多次启动 Notepad.exe 时,RAM 中只有 一个 代码副本。每个进程共享相同的页面。这对于 DLL 尤其重要,尤其是在每个进程中使用的操作系统 DLL,例如 ntdll.dll、kernel32.dll 和 user32.dll(等等)。
当加载程序用导入函数的实际地址填充 IAT 时,操作系统会为 IAT 重新映射页面,并由页面文件支持它们。所以每个进程都可以有自己的一组导入地址。包含代码和导入表的其余页面仍然共享。
关于windows - PE格式,IAT目录有什么用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20663542/
我需要验证给定的二进制文件是否是 PE 文件(例如,如果我将 JS/HTML 或 .class 文件重命名为 .exe 或 .dll),它不会仍然是 PE 文件。解析 PE 文件会给我关于这个问题的信
我想将一些二进制数据附加到我的可执行文件的末尾。这只是为了使我的程序成为一个文件。我尝试使用 UpdateResource 但我用我的特定数据在其中遇到了一些错误,所以我必须使用其他解决方案。所以我需
我知道还有其他一些类似的问题,无论是否是 StackOverflow。我为此研究了很多,但仍然没有找到单一的解决方案。 我正在做一个操作系统作为一个副项目。我一直在做汇编,但现在我想加入 C 代码。
Is the pointer to the PE-header at offset 0x3c in the PE-file always set to 0x80? 我想知道为什么这个指针会改变。我猜
我是操作系统编程的新手,我正在阅读一本书,其中给出了一个简单的内核示例,如下所示: main() { char *video_memory = 0xb8000; *video_memory
我正在用 C# 编写程序,在其中读取 PE 的字节。但是为了获得 RVA,我需要使用部分标题。我想知道节标题的最大数量是多少? 我试过谷歌,我看过这里,但我没有找到任何可以指向正确方向的东西 谢谢。
一个awesome article关于PE格式说明如下: Name. Each section header has a name field up to eight characters long,
我对他们为什么在这里使用 - 1 感到困惑。有人可以解释这条线在非常非常非常低级别的详细信息中所做的事情......不是它的减法 1 结构......我需要了解更多......关于低级别......谢
我可以成功地在内存中加载并运行x32 pe,但是当我调整变量使其与x64可执行文件一起使用时,该程序将无休止地启动其自身的数千个副本,直到您杀死该程序或耗尽内存,而不是从内存启动pe。 我已经进行了尽
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
我正在研究 PE 解析器,遇到了一些非常不寻常的事情。 PE 格式中目录的名称和顺序似乎因您查看的位置而异: 来自 PEReader (perdr) : #define IMAGE_DIRECTORY
我试图在IDA中找出一种方法,哪些导出是数据导出,哪些是实函数导出。 例如,让我们看一下Microsoft的msftedit.dll的导出条目: 虽然CreateTextServices是真正的导出函
有很多Windows PE 资源查看器程序。但它们是如何工作的?他们是否解码对 winapi 的函数调用,或者 PE 是否有一些 GUI 信息部分?就像 Android 有 XML GUI 定义一样?
我正在对 PE 文件进行一些批量分析,在解析 PE 文件的导入表时,我发现许多 PE 文件为给定的 DLL 导入了重复的条目...这是为什么?这在功能上提供了什么? 例如,example.exe 导入
我正在使用“PE 编辑器”检查 Windows 可执行文件,它显示入口点为 0x15B8,我们如何确定该入口点的地址为虚拟地址? 最佳答案 入口点是相对于模块的加载地址存储的。 模块可以通过设置 IM
根据这篇文章http://msdn.microsoft.com/en-us/library/ms809762.aspx?ppud=4 我们可以用自定义名称命名 PE 部分。 所以在一个 PE 文件中,
PE 加载器是否完全 加载了任何部分?或者是否加载了节标题中指定的每个节?在 ELF 程序中,应该加载的节头(称为程序头或段)是那些用 PT_LOAD 标记的。 PE项目中有类似的东西吗? 附言。我找
我查看了特定 DLL 的导出表,我在表中看到了一些奇怪的条目,所以我试图在 pecoff 规范中找到这个问题的答案,但没有找到任何答案,我希望有人可能有。 我在某个 DLL (Qt5Core.dll)
我已经问过类似的问题,"PE Header requirements" ,但我对它的答案并不满意。 我正在用 Java SE 1.6 构建一个汇编器/链接器。我已经阅读了大约 5 个关于 PE/COF
我正在“C/C++ - Win32API”环境中编写一个 dll。 我有一些常量变量(都是 DWORD 值和 LPWSTR/LPSTR 字符串),我必须启用用户修改。 我正在寻找的是(希望)一种工具,
我是一名优秀的程序员,十分优秀!