跳转至

PE 导入表和延迟加载表

inspect_pe_imports / inspect-pe-imports 回答以下问题:所选本地 PE32/PE32+ 映像是否声明了 IMAGE_DIRECTORY_ENTRY_IMPORT 表、该表列出了哪些 DLL 和函数、存在哪些延迟加载描述符,以及标准导入表的 pefile 兼容导入哈希。它读取文件但不执行该文件,并且不需要 Windows SDK 或反汇编器。

rea inspect-pe-imports /absolute/path/to/application.exe --json

该 CLI 相对于调用者的工作目录解析相对路径。MCP 和公布的输入模式要求绝对文件系统路径,并保留该精确选择:

{
  "name": "inspect_pe_imports",
  "arguments": { "path": "/artifacts/application.exe" }
}

观察结果

内联证据结果包含工件路径、SHA-256 和字节长度。import_directory 和 delay_import_directory 报告数据目录 RVA 和大小;当目录不存在或为零时,报告 null。它们的 locations 是实际读取的描述符数组及其终止符所对应的文件跨度。当连续描述符映射到不连续的文件字节时(例如跨越节边界),每个跨度分别报告,并各自成为独立的证据文件偏移范围。

如果无法检查第一个描述符,则目录声明仍然存在,但没有已消耗的 locations,并且覆盖率是部分的。描述符、thunk 和以 NUL 结尾的名称都保持在 PE 的 32 位 RVA 空间内(包括 PE32+ 映像);较早的有效行在描述符遍历溢出时仍然保留。

machine 保留原始无符号 COFF 值。architecture 解码已知的机器类型,包括在声明了 CLI 目录时的 ReadyToRun OS 覆盖;该声明并不代表具有有效的 CLR 元数据或运行时兼容性。无法识别的机器保留 pe-machine-<decimal>,同时其导入表仍可检查。已识别机器的宽度若与可选头相矛盾,则属于畸形。

每个 imports[] 条目报告 DLL 名称、描述符 RVA,以及带有 ILT/IAT RVA 的命名函数或序号函数。delay_imports[] 单独报告基于 RVA 的延迟加载描述符。imphash 是 pefile 仅针对标准导入表调用 get_imphash() 的结果;延迟加载行不参与。序号导入使用 pefile 的序号名称表,否则使用其 ord<decimal> 回退。

当该值不是 pefile 对这张映像的哈希时,imphash.md5 为 null 并带有一个 reason:标准导入表不完整,或者 pefile 会读取不同的行序列(它视为无效或截断的名称、序号 0、没有函数的描述符,或其边界和导入符号上限截断的表)。延迟加载问题不会导致该哈希被扣留。

导入目录缺失表示观察到该表不存在。这并不能证明该映像从未通过其他表或附加数据导入 API。

限制与失败

默认情况下,所选文件限制为 64 MiB(最大 512 MiB)。默认最多检查 256 个导入和延迟加载描述符(最大 4096),并且每个表中的函数总数最多为 8192(最大 262144)。PE 头畸形以及 DLL 或函数预算耗尽都会失败,而不会产生部分成功结果。解码后的 DLL 和函数名称被限制为固定的 16 MiB 保留文本,且没有运行时覆盖;max_file_bytes、max_dlls 和 max_functions 不会提高该限制。资源类失败会以 limit(dlls、functions 或 retained_text)报告已耗尽的配额,并提供相应的恢复信息。

无法读取的 DLL 名称、提示/名称条目或 thunk 会以 issues 形式报告为部分覆盖。所需表 RVA 为零的描述符(标准 FirstThunk,或延迟加载导入地址表/名称表)会被报告为 malformed_entry,且不包含任何函数,而绝不会报告为完整的空清单。存储虚拟地址而非 RVA 的延迟加载描述符被记录为 unsupported_form,并且不会被解码。

此工作流不会解析绑定导入、已加载的 IAT 内容或另一 DLL 中的导出转发名称。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 rea2/rea