文章总结: 文档解析DLL延迟加载技术,阐述其在恶意代码开发中利用修改PE结构隐藏IAT表以规避静态分析和沙箱检测的原理。文章提供了VS配置与#pragma指令的代码实现示例,并介绍通过dumpbin解析PE头识别该技术的方法,适用于免杀与红队对抗研究。 综合评分: 87 文章分类: 免杀,红队,二进制安全,恶意软件
DLL延迟加载
原创
R0x7e
剑外思归客
2026年1月3日 13:55 江苏
DLL延迟加载(Delay Load)是Windows程序开发中的一种技术,它允许程序在运行时而不是启动时加载所需的DLL(动态链接库)。这种技术通过修改PE(可执行文件)结构中的延迟加载表来实现。
技术原理
- 延迟加载机制:编译器(如MSVC)提供
/DELAYLOAD选项,在链接时生成特殊的延迟加载表 - 运行时行为:当代码首次调用延迟加载DLL中的函数时,系统才会加载该DLL并解析函数地址
恶意代码开发中的意义和作用
1. 规避静态分析
- 隐藏依赖关系:延迟加载的DLL不会出现在静态导入表(IAT)中,增加了分析难度
- 规避杀毒软件检测:许多杀毒软件会检查导入表,延迟加载可以绕过这种检查
2. 动态行为控制
- 条件加载:恶意代码可以根据环境条件决定是否加载某些功能模块
- 减少内存痕迹:只在需要时才加载恶意模块,减少内存中同时存在的可疑内容
3. 规避沙箱检测
- 延迟触发恶意行为:在沙箱超时后才加载恶意DLL,规避自动化分析
- 环境感知:先加载无害DLL检测环境,确认安全后再加载恶意模块
4. 模块化恶意代码
- 插件式架构:核心模块保持简洁,通过延迟加载实现功能扩展
- 动态更新:可以从C2服务器下载并延迟加载新模块,实现功能更新
具体实现过程
通过vs 编译器实现
在vs中项目属性 → 链接器 → 输入 → 延迟加载的DLL->添加对于的DLL名称``在"附加依赖项"中添加你的DLL对应的.lib文件
在代码中添加函数声名,该函数为dll中的函数
extern "C" __declspec(dllimport) void Runcalc();
完整代码为:
#include <iostream>
extern "C" __declspec(dllimport) void Runcalc();
int main()
{
Runcalc(); // 调用DLL函数
std::cout << "Hello World!\n";
}
然后编译即可,在运行时,需确保该exe程序和DLL文件在同一目录中
通过代码实现
在代码中添加链接器指令
#pragma comment(linker, "/DELAYLOAD:Dll1.dll")
#pragma comment(lib, "Dll1.lib")
声名延迟加载的函数
extern "C" __declspec(dllimport) void Runcalc();
完整代码如下
#include <iostream>
/*
* 链接器指令:指定要延迟加载的DLL
*
* /DELAYLOAD:Dll1.dll 表示Dll1.dll将采用延迟加载方式
* 这个DLL不会在程序启动时加载,而是在首次调用其函数时加载
*/
#pragma comment(linker, "/DELAYLOAD:Dll1.dll")
/*
* 链接器指令:链接延迟加载支持库
*
* delayimp.lib 提供了延迟加载的运行时支持
* 包含__delayLoadHelper2等实现延迟加载机制的辅助函数
*/
#pragma comment(lib, "Dll1.lib")
// 正确声明延迟加载的函数
/*
* 声明要从DLL中延迟加载的函数
*
* extern "C" - 使用C语言链接约定,防止C++的名称修饰(name mangling)
* __declspec(dllimport) - 告诉编译器这个函数将从DLL中导入
* void Runcalc() - 函数原型,必须与DLL中的定义完全一致
*/
extern "C" __declspec(dllimport) void Runcalc();
int main()
{
Runcalc(); // 调用DLL函数
std::cout << "Hello World!\n";
}
PS
DLL延迟加载虽然能够隐藏IAT导入表,但是延迟加载的DLL信息存储会在 IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT(数据目录项的第13项,索引值为13)中,其结构为 ImgDelayDescr(延迟导入描述符)。 通过vs提供的工具dumpbin可以查看pe的文件结构 直接查看所有导入的 DLL 和函数
dumpbin /IMPORTS your.exe
查看pe头
dumpbin /HEADERS your.exe
通过命令dumpbin /IMPORTS DelayLoadDll.exe,查看得到Dll1.dll是延迟加载的
By:R0x7e,《剑外思归客》公众号
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:剑外思归客 R0x7e《DLL延迟加载》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论