DLL延迟加载

admin 2026-01-04 01:37:20 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档解析DLL延迟加载技术,阐述其在恶意代码开发中利用修改PE结构隐藏IAT表以规避静态分析和沙箱检测的原理。文章提供了VS配置与#pragma指令的代码实现示例,并介绍通过dumpbin解析PE头识别该技术的方法,适用于免杀与红队对抗研究。 综合评分: 87 文章分类: 免杀,红队,二进制安全,恶意软件


cover_image

DLL延迟加载

原创

R0x7e

剑外思归客

2026年1月3日 13:55 江苏

DLL延迟加载(Delay Load)是Windows程序开发中的一种技术,它允许程序在运行时而不是启动时加载所需的DLL(动态链接库)。这种技术通过修改PE(可执行文件)结构中的延迟加载表来实现。

技术原理

  1. 延迟加载机制:编译器(如MSVC)提供/DELAYLOAD选项,在链接时生成特殊的延迟加载表
  2. 运行时行为:当代码首次调用延迟加载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&nbsp;<iostream>

extern&nbsp;"C"&nbsp;__declspec(dllimport)&nbsp;void&nbsp;Runcalc();

int&nbsp;main()
{
&nbsp; &nbsp; Runcalc(); &nbsp;// 调用DLL函数
&nbsp; &nbsp;&nbsp;std::cout&nbsp;<<&nbsp;"Hello World!\n";
}

然后编译即可,在运行时,需确保该exe程序和DLL文件在同一目录中

通过代码实现

在代码中添加链接器指令

#pragma&nbsp;comment(linker,&nbsp;"/DELAYLOAD:Dll1.dll")
#pragma&nbsp;comment(lib,&nbsp;"Dll1.lib")

声名延迟加载的函数

extern&nbsp;"C"&nbsp;__declspec(dllimport)&nbsp;void&nbsp;Runcalc();

完整代码如下

#include&nbsp;<iostream>
/*
&nbsp;* 链接器指令:指定要延迟加载的DLL
&nbsp;*
&nbsp;* /DELAYLOAD:Dll1.dll 表示Dll1.dll将采用延迟加载方式
&nbsp;* 这个DLL不会在程序启动时加载,而是在首次调用其函数时加载
&nbsp;*/
#pragma&nbsp;comment(linker,&nbsp;"/DELAYLOAD:Dll1.dll")
&nbsp;/*
&nbsp; * 链接器指令:链接延迟加载支持库
&nbsp; *
&nbsp; * delayimp.lib 提供了延迟加载的运行时支持
&nbsp; * 包含__delayLoadHelper2等实现延迟加载机制的辅助函数
&nbsp; */
#pragma&nbsp;comment(lib,&nbsp;"Dll1.lib")

// 正确声明延迟加载的函数
/*
&nbsp;* 声明要从DLL中延迟加载的函数
&nbsp;*
&nbsp;* extern "C" - 使用C语言链接约定,防止C++的名称修饰(name mangling)
&nbsp;* __declspec(dllimport) - 告诉编译器这个函数将从DLL中导入
&nbsp;* void Runcalc() - 函数原型,必须与DLL中的定义完全一致
&nbsp;*/
extern&nbsp;"C"&nbsp;__declspec(dllimport)&nbsp;void&nbsp;Runcalc();

int&nbsp;main()
{
&nbsp; &nbsp; Runcalc(); &nbsp;// 调用DLL函数
&nbsp; &nbsp;&nbsp;std::cout&nbsp;<<&nbsp;"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延迟加载》

DLL延迟加载 网络安全文章

DLL延迟加载

文章总结: 文档解析DLL延迟加载技术,阐述其在恶意代码开发中利用修改PE结构隐藏IAT表以规避静态分析和沙箱检测的原理。文章提供了VS配置与#pragma指令
评论:0   参与:  0