[恶意软件分析] Gacrux:基于C语言的可自定义PE加载恶意软件
字数 1278 2025-08-15 21:32:24

Gacrux恶意软件分析技术文档

1. 概述

Gacrux是一款基于C语言开发的可自定义PE加载恶意软件,使用Visual Studio 2017编译,从2020年8月开始在某些论坛上出售。该恶意软件受到Smoke Loader的启发,具有多种反分析技术和自定义PE加载功能。

2. 反分析技术

2.1 代码混淆技术

  1. 指令流混淆

    • 使用跳转指令干扰IDA的代码解析
    • 解决方法:使用nop操作码修复
  2. 函数分析干扰

    • 伪造返回值破坏IDA的函数分析
    • 解决方法:同样使用nop操作码修复
  3. 动态加密函数

    • 磁盘上的函数在调用前解密,调用后重新加密
    • 加密机制:
      • 识别函数中表示加密区域开始和结束的模式
      • 使用传递给函数的密钥进行异或操作

2.2 反调试技术

  1. 调试器检测

    • 检查PEB中的BeingDebugged成员
    • 检测到调试器时,malloc函数返回请求缓冲区大小而非实际分配
  2. 黑名单模块检测

    • 检查系统加载的黑名单模块
    • 存在黑名单模块则退出执行
  3. NtGlobalFlag检查

    • 注入的ShellCode/PE加载器检查PEB的NtGlobalFlag成员

2.3 反虚拟机技术

  1. 资源检测
    • 检查目标磁盘可用空间和RAM大小
    • 检测到资源不足(虚拟化常见表现)时增加Explorer进程PID
    • 触发NtOpenProcess崩溃阻止进一步执行

3. 字符串加密

  • 字符串存储在专用函数中
  • 根据传入的ID动态解密字符串
  • 外部模块字符串列表可通过特定链接获取

4. 系统调用(Syscall)实现

  • Syscall模块主要从开源加密程序复制
  • 修改点:
    • 哈希算法改为djb2
    • 输出使用常量值进行异或计算

5. 持久化机制

  • 通过Windows进程实现
  • 在explorer.exe上下文中持续调用
  • 检测安装文件并在启动项菜单中创建.lnk文件

6. 代码注入技术

6.1 注入原语

  • 32位环境

    • 使用NtCreateSection/NtMapViewOfSection作为写原语
  • 64位环境

    • 使用NtAllocateVirtualMemory/NtWriteVirtualMemory
  • 两种方法都通过直接系统调用完成

6.2 执行原语

  • 使用SetPropA实现代码注入
  • 基于"PROPagate"技术(Adam文章中描述)
  • 从开源实现复制,通过函数指针设置

7. 自定义PE加载器

7.1 加载器特点

  • 注入到Explorer中的不是普通PE文件
  • 包含自定义PE Header和加载器

7.2 加载流程

  1. 反调试检测

    • 执行初始反调试检查
  2. API解析

    • 解析三个关键API
    • 用于处理导入表和修复重定位

7.3 自定义PE格式

  • 使用非标准PE格式
  • 可通过Kaitai描述符恢复原始PE文件

8. 网络通信

  • 使用WinInet库实现
  • 在Explorer上下文环境中执行

9. 总结分析

  1. 代码来源

    • 大量借鉴公共代码
    • 经过少量修改后投入使用
  2. 安全缺陷

    • 存在多个漏洞
    • 整体实现并不特别复杂或独特
  3. 技术特点

    • 结合了多种已知技术
    • 自定义PE加载器是其最显著特点
Gacrux恶意软件分析技术文档 1. 概述 Gacrux是一款基于C语言开发的可自定义PE加载恶意软件,使用Visual Studio 2017编译,从2020年8月开始在某些论坛上出售。该恶意软件受到Smoke Loader的启发,具有多种反分析技术和自定义PE加载功能。 2. 反分析技术 2.1 代码混淆技术 指令流混淆 : 使用跳转指令干扰IDA的代码解析 解决方法:使用nop操作码修复 函数分析干扰 : 伪造返回值破坏IDA的函数分析 解决方法:同样使用nop操作码修复 动态加密函数 : 磁盘上的函数在调用前解密,调用后重新加密 加密机制: 识别函数中表示加密区域开始和结束的模式 使用传递给函数的密钥进行异或操作 2.2 反调试技术 调试器检测 : 检查PEB中的BeingDebugged成员 检测到调试器时,malloc函数返回请求缓冲区大小而非实际分配 黑名单模块检测 : 检查系统加载的黑名单模块 存在黑名单模块则退出执行 NtGlobalFlag检查 : 注入的ShellCode/PE加载器检查PEB的NtGlobalFlag成员 2.3 反虚拟机技术 资源检测 : 检查目标磁盘可用空间和RAM大小 检测到资源不足(虚拟化常见表现)时增加Explorer进程PID 触发NtOpenProcess崩溃阻止进一步执行 3. 字符串加密 字符串存储在专用函数中 根据传入的ID动态解密字符串 外部模块字符串列表可通过特定链接获取 4. 系统调用(Syscall)实现 Syscall模块主要从开源加密程序复制 修改点: 哈希算法改为djb2 输出使用常量值进行异或计算 5. 持久化机制 通过Windows进程实现 在explorer.exe上下文中持续调用 检测安装文件并在启动项菜单中创建.lnk文件 6. 代码注入技术 6.1 注入原语 32位环境 : 使用NtCreateSection/NtMapViewOfSection作为写原语 64位环境 : 使用NtAllocateVirtualMemory/NtWriteVirtualMemory 两种方法都通过直接系统调用完成 6.2 执行原语 使用SetPropA实现代码注入 基于"PROPagate"技术(Adam文章中描述) 从开源实现复制,通过函数指针设置 7. 自定义PE加载器 7.1 加载器特点 注入到Explorer中的不是普通PE文件 包含自定义PE Header和加载器 7.2 加载流程 反调试检测 : 执行初始反调试检查 API解析 : 解析三个关键API 用于处理导入表和修复重定位 7.3 自定义PE格式 使用非标准PE格式 可通过Kaitai描述符恢复原始PE文件 8. 网络通信 使用WinInet库实现 在Explorer上下文环境中执行 9. 总结分析 代码来源 : 大量借鉴公共代码 经过少量修改后投入使用 安全缺陷 : 存在多个漏洞 整体实现并不特别复杂或独特 技术特点 : 结合了多种已知技术 自定义PE加载器是其最显著特点