模块 52 - IAT 隐藏与混淆 - 简介
恶意软件开发课程 - IAT 隐藏与混淆 - 简介
模块 52 - IAT 隐藏与混淆 - 简介#
[!IMPORTANT] 本知识库声明
本知识库由本人整理自互联网 MalDev Academy 泄露资源,并由本人手动翻译为中文,过程中增加了大量关键技术提示与实践心得。
- 内容完整性:并未修改任何核心代码与技术逻辑,仅做汉化与注释加强。
- 版权归属:原始知识产权归原作者/官方所有。
- 支持正版:本仓库仅供内部学习交流,如果您有经济能力,请务必支持正版课程。
- 权利申诉:如相关内容侵犯了您的权益,请联系我,我将立即核实并删除。
IAT 隐藏与混淆 - 简介#
简介#
导入地址表 (Import Address Table, IAT) 包含了关于 PE 文件的关键信息,例如它使用了哪些函数以及哪些 DLL 导出了这些函数。这类信息通常被安全软件用作“指纹”来识别和检测二进制文件。
例如,下图显示了 Process Injection - Shellcode 模块中生成的二进制文件的 IAT。该 PE 文件导入了大量被认为高度可疑的函数。安全解决方案可以利用这些信息轻松标记该程序。

💡 初学者提示:杀软的“剧本检测”
杀毒软件看到你的 IAT 里同时出现了
OpenProcess,VirtualAllocEx,WriteProcessMemory和CreateRemoteThread,就像警察在街上看到一个人同时带着面罩、撬棍、赃物袋和手钻一样。虽然你还没开始作案,但这些工具的组合已经暴露了你的目的。
请注意,图中剩下的大多数函数是由编译器自动添加的,我们将在后续模块中讨论如何处理它们。
IAT 隐藏与混淆 - 方法 1:常规动态调用#
要从 IAT 中隐藏函数,可以使用 GetProcAddress、GetModuleHandle 或 LoadLibrary 在运行时动态加载这些函数。下面的代码片段将动态加载 VirtualAllocEx,因此在使用 PE 工具检查时,它不会出现在 IAT 中。
// 定义函数原型
typedef LPVOID (WINAPI* fnVirtualAllocEx)(HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);
// ...
// 动态搜索地址
fnVirtualAllocEx pVirtualAllocEx = (fnVirtualAllocEx)GetProcAddress(GetModuleHandleA("KERNEL32.DLL"), "VirtualAllocEx");
// 使用函数指针进行调用
pVirtualAllocEx(...);c虽然这看起来是一个优雅的解决方案,但它其实并不够完美,原因如下:
- 字符串特征:
"VirtualAllocEx"字符串仍然以明文形式存在于二进制文件中,可以被静态扫描检测到。 - API 指纹:
GetProcAddress和GetModuleHandleA本身会出现在 IAT 中,这本身也是一个可疑的特征。
IAT Hiding & Obfuscation - 方法 2:自定义 API 实现#
一个更优雅的解决方案是编写 自定义函数,其功能与 GetProcAddress 和 GetModuleHandle 这两个 WinAPI 完全相同。
通过这种方式,我们可以手动解析内存中的 PE 表项(如导出表),从而在不依赖系统提供的动态查找 API 的情况下定位函数地址。这样,GetProcAddress 等敏感 API 也就不会出现在 IAT 中了。
接下来的模块将深入探讨这种解决方案的具体实现。
🎯 总结#
在本模块中,我们学习了:
- IAT 的风险:了解了 IAT 如何向防御系统泄露程序的意图。
- 基础混淆:掌握了使用系统原生的动态调用方法。
- 高级思路:明确了通过重写系统底层 API 来实现更高级别隐匿的方向。
📚 下一步学习
下一个模块将介绍 IAT Hiding & Obfuscation - Custom GetProcAddress。我们将应用在模块 50 和 51 中学到的 PE 解析和哈希技术,手写出一个完全独立于系统的 API 地址查找器!