利用LLVM解释器执行你的代码
字数 1699 2025-08-20 18:18:15
利用LLVM解释器执行代码的技术分析与教学文档
1. 技术概述
LLVM工具链中的lli.exe可以执行中间bitcode文件,通过这一方法在目标环境执行代码,能够绕过Windows Defender检测。这种技术类似于:
- .NET代码转换为CIL在内存中编译执行
- Python代码通过解释器执行
- JAVA代码通过JVM虚拟机执行
- 如今C代码也可以转换为LLVM IR语言解释执行
2. LLVM工具链基础
2.1 LLVM与Clang
LLVM是一套编译器基础设施项目,包含模块化的编译器组件和工具链:
- 以C++编写
- 包含编译器前端和后端
- 编译流程:C/C++代码 → LLVM IR → MachineCode(x86、ARM...)
Clang是基于LLVM的编译器前端工具:
- 解析C/C++代码
- 转换为LLVM中间语言IR
- 通过不同编译器后端生成可执行代码
2.2 工具获取
获取方式:
- 自行编译LLVM源码
- 从LLVM官方发布页下载
- 注意下载包含
lli.exe的版本:clang+llvm-18.1.8-x86_64-pc-windows-msvc.tar.xz
- 注意下载包含
3. 基本使用方法
3.1 常规编译
使用clang-cl(适配MSVC的版本)编译C++文件为可执行文件:
clang-cl helloworld.cpp -o hello.exe
3.2 生成LLVM IR bitcode
生成bitcode文件:
clang -emit-llvm -c helloworld.cpp -o helloworld.bc
生成可读的LLVM IR文件:
clang -emit-llvm -S helloworld.cpp -o helloworld.ll
注意:.ll文件会暴露源码信息,.bc是二进制格式更隐蔽
3.3 执行bitcode
使用lli.exe执行bitcode文件:
lli helloworld.bc
4. 免杀技术实现
4.1 执行弹计算器shellcode
- 生成常规可执行文件:
clang-cl shellcode_calc.cpp -o shellcode_calc.exe
- 会被Windows Defender检测删除
- 生成并执行bitcode版本:
clang -emit-llvm -c shellcode_calc.cpp -o shellcode_calc.bc
lli.exe shellcode_calc.bc
- 可以绕过Windows Defender执行
4.2 执行回连shellcode
同样方法可以执行reverse_tcp等回连shellcode,成功绕过防护。
5. 技术原理分析
5.1 执行流程
lli.exe使用RtlAllocateHeap在自身进程空间分配内存- 通过
memmove将bitcode转换的本机代码移动到分配的内存 - 调用该内存中的代码执行
5.2 内存布局
调试观察到的内存情况:
245B0DA0000:堆内存,有执行权限,包含转换后的汇编代码245B0DB0000:shellcode,只读245B0DC0000:通过VirtualAlloc分配的RWX权限内存,包含shellcode
5.3 API调用特点
- 不直接调用Kernel32中的函数
- 调用KernelBase中的API(如
CreateThread) - 最终通过
ntdll中的函数(如RtlFreeHeap)进行内存管理
6. 高级应用与思考
6.1 隐蔽性优化
问题:
lli.exe文件较大(24MB),在目标环境较明显
解决方案:
- 将文件打包到MSI安装程序中
- 自行修改
lli.exe源码,去除多余功能,编译精简版本
6.2 签名问题
现状:
- LLVM官方发布的版本无数字签名
- VS2019/2022提供的LLVM工具链有微软签名但不包含
lli.exe - MSYS2、Anaconda等工具管理包也不提供带签名的
lli.exe
6.3 其他语言
Rust语言也基于LLVM,理论上可能具备类似特性。
7. 防御建议
检测方法:
- 监控是否存在可疑的
lli工具被执行 - 关注异常的bitcode文件执行行为
8. 完整示例流程
8.1 生成bitcode
clang -emit-llvm -c your_code.cpp -o your_code.bc
8.2 执行bitcode
lli.exe your_code.bc
8.3 打包分发
将lli.exe和.bc文件打包到安装程序或其他载体中。
9. 注意事项
- 确保使用正确版本的LLVM工具链
- 测试目标环境的兼容性
- 考虑文件大小和隐蔽性问题
- 不同Windows版本可能有不同的检测机制
通过这种技术,攻击者可以在目标系统上隐蔽地执行恶意代码,同时绕过传统杀毒软件的检测。防御方需要关注这类非传统代码执行方式,并建立相应的检测机制。