【免杀】C2免杀技术(九)DLL注入前置篇
一、什么是DLL?
1、DLL 是 Dynamic Link Library(动态链接库)的缩写,是 Windows 系统中的一种可执行文件格式,扩展名为 .dll
。它的本质是一个模块化的程序组件,可以被其他程序调用其中的函数、资源或类库,而不需要把这些代码直接编译进主程序中。
2、DLL 是一组可被多个程序共享调用的函数或资源集合,通常以 .dll
文件形式存在。
3、几乎所有的exe都加载DLL
4、类似linux系统中共享对象文件(Shared Object, .so 文件)
5、DLL分类
类型 | 示例 | 特点 |
---|---|---|
系统级 DLL | kernel32.dll , user32.dll , ntdll.dll | Windows 提供的核心 API,所有软件都依赖它们 |
软件自带 DLL | photoshopcore.dll , steam_api64.dll , msword.dll | 由应用自身开发,只供其自身或插件使用,功能模块化 |
第三方库 DLL | libcrypto.dll , zlib1.dll , opencv_core.dll | 第三方组件打包成 DLL,被多个项目共享调用 |
恶意 DLL | payload.dll , backdoor.dll | 攻击者编写用于注入或劫持的 DLL |
二、DLL编写
1、攻防实战中99%是“自己写DLL”!
2、DLL 可以用 C/C++、Rust、C#、Go 等语言编写,但需注意 ABI 兼容性。
3、实战中,编写用于注入的恶意DLL,最常用C/C++,写法类似于shellcode加载器。
VS创建新项目→动态链接库DLL
默认自带两个cpp文件:dllmain.cpp/pch.cpp
4、DLL文件可以反编译成源码吗?
DLL和EXE本质是一样的,都是PE文件,都是机器码,可以被反编译,能看到汇编代码和部分伪C代码,但很难100%还原成开发者的源码。除非是.NET的DLL,否则只能还原功能逻辑,变量名和结构都变了。
三、DLL代码运行
DLL需要被其他程序(比如你写的EXE、目标软件或注入器)加载后才能运行,不能直接双击!
方法 | 场景 | 能力 |
---|---|---|
写 EXE 调用 | 测试 / 开发阶段 | 最稳最通用 |
插件方式 | Photoshop、游戏插件等 | 根据程序加载机制 |
DLL 注入 | 免杀、内存加载 | 高级场景,需权限和技术 |
rundll32 | 特定格式导出函数 | 限制多,已被安全工具关注 |
四、 DLL注入的意义和价值
DLL注入是指将一个DLL动态链接库植入到目标进程的地址空间中,使其加载并执行你指定的代码。它本质上是一种进程注入技术,是一种攻击手段,用于实现绕过安全软件检测、权限提升、持久化等目的。
意义/价值点 | 具体说明 | 典型应用场景 |
---|---|---|
执行任意代码 | 可以在目标进程中运行攻击者自定义代码,包括shellcode、反射DLL等 | 恶意软件载荷执行 |
持久化驻留 | 通过注入系统关键进程,实现进程重启、系统重启后的持续驻留 | 持久化后门 |
绕过安全防护 | 利用白名单进程或系统进程执行,绕过杀软/EDR行为检测 | 免杀、攻防对抗 |
权限提升 | 注入高权限进程,获得更高的系统权限 | SYSTEM提权、服务提权 |
数据窃取与操控 | 读取或篡改目标进程中的敏感数据、劫持输入输出 | 密码抓取、流量劫持 |
API劫持/功能增强 | Hook目标进程API,实现API劫持、流量转发、功能扩展 | 流量中转、监控、注入马 |
对抗沙箱与分析环境 | 注入特定进程,隐藏自身行为,逃避动态分析与沙箱监测 | 反分析、反溯源 |
便于横向移动与渗透 | 注入远程目标进程,实现横向移动与进一步内网渗透 | 横向渗透、内网突破 |
无需文件落地更隐蔽 | 通过反射DLL注入等技术,仅在内存中运行,避免生成可疑文件 | 文件less攻击、免杀攻击 |
五、DLL如何注入
DLL注入的方式有很多,例如:
1、远程线程注入(最常见)
2、线程劫持
3、反射式注入
https://github.com/monoxgas/sRDI
An Improved Reflective DLL Injection Technique
4、APC注入
5、IAT劫持
6、DLL劫持
......