利用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 工具获取

获取方式:

  1. 自行编译LLVM源码
  2. 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

  1. 生成常规可执行文件:
clang-cl shellcode_calc.cpp -o shellcode_calc.exe
  • 会被Windows Defender检测删除
  1. 生成并执行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 执行流程

  1. lli.exe使用RtlAllocateHeap在自身进程空间分配内存
  2. 通过memmove将bitcode转换的本机代码移动到分配的内存
  3. 调用该内存中的代码执行

5.2 内存布局

调试观察到的内存情况:

  • 245B0DA0000:堆内存,有执行权限,包含转换后的汇编代码
  • 245B0DB0000:shellcode,只读
  • 245B0DC0000:通过VirtualAlloc分配的RWX权限内存,包含shellcode

5.3 API调用特点

  • 不直接调用Kernel32中的函数
  • 调用KernelBase中的API(如CreateThread
  • 最终通过ntdll中的函数(如RtlFreeHeap)进行内存管理

6. 高级应用与思考

6.1 隐蔽性优化

问题:

  • lli.exe文件较大(24MB),在目标环境较明显

解决方案:

  1. 将文件打包到MSI安装程序中
  2. 自行修改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. 注意事项

  1. 确保使用正确版本的LLVM工具链
  2. 测试目标环境的兼容性
  3. 考虑文件大小和隐蔽性问题
  4. 不同Windows版本可能有不同的检测机制

通过这种技术,攻击者可以在目标系统上隐蔽地执行恶意代码,同时绕过传统杀毒软件的检测。防御方需要关注这类非传统代码执行方式,并建立相应的检测机制。

利用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++文件为可执行文件: 3.2 生成LLVM IR bitcode 生成bitcode文件: 生成可读的LLVM IR文件: 注意: .ll 文件会暴露源码信息, .bc 是二进制格式更隐蔽 3.3 执行bitcode 使用 lli.exe 执行bitcode文件: 4. 免杀技术实现 4.1 执行弹计算器shellcode 生成常规可执行文件: 会被Windows Defender检测删除 生成并执行bitcode版本: 可以绕过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 8.2 执行bitcode 8.3 打包分发 将 lli.exe 和 .bc 文件打包到安装程序或其他载体中。 9. 注意事项 确保使用正确版本的LLVM工具链 测试目标环境的兼容性 考虑文件大小和隐蔽性问题 不同Windows版本可能有不同的检测机制 通过这种技术,攻击者可以在目标系统上隐蔽地执行恶意代码,同时绕过传统杀毒软件的检测。防御方需要关注这类非传统代码执行方式,并建立相应的检测机制。