一次恶意挖矿样本分析到捕获矿池地址
字数 1395 2025-08-29 22:41:10

恶意挖矿样本分析与矿池地址捕获技术详解

样本基础信息

样本指纹

  • SHA256: 938c187c0c566d3ecd0ca594d027cff745688b409d6ab18e7d836d9ef1bd30de
  • MD5: 8bb9f094a5c3e8358d931200092e3412
  • SHA1: fced1103ababf08ea6435f43f597240ac6c357e8

静态分析

导入表分析

使用IDA查看导入表发现以下关键API:

  • 敏感API:CreateMutex, GetLastError, Sleep, fopen, fseek, malloc, ftell, fwrite, fputs, CreateProcess
  • 网络连接相关API:ws2_32.dll中的网络功能函数

执行流程分析

主函数关键逻辑

  1. 互斥体检查

    CreateMutex(NULL, FALSE, "MutexName");
    if (GetLastError() == ERROR_ALREADY_EXISTS) {
        Sleep(1000);
        return;
    }
    
    • 通过创建互斥体防止程序重复执行
    • 如果互斥体已存在则休眠后退出
  2. 文件操作

    FILE* file = fopen("自身路径", "rb");
    fseek(file, 0, SEEK_END);
    long fileSize = ftell(file);
    void* buffer = malloc(fileSize);
    fseek(file, 0, SEEK_SET);
    fread(buffer, 1, fileSize, file);
    fclose(file);
    
    • 读取样本自身文件内容到内存
    • 推测可能包含第二阶段恶意代码
  3. 文件内容解析

    • 从文件末尾倒数第8字节读取DWORD值
    • 从文件末尾倒数第4字节读取DWORD值
    • 使用R13(文件大小)和R14(内存起始地址)进行操作
  4. 文件写入

    fwrite(buffer, 1, fileSize - 256 - 8, newFile);
    
    • 写入大小为文件总大小减去256再减去8字节的数据
  5. 自我复制

    char randomName[MAX_PATH];
    GenerateRandomName(randomName);
    fputs(randomName, file);
    CreateProcess(randomName, ...);
    
    • 生成随机文件名
    • 将自身复制到新文件并执行
    • 循环复制到C:\Windows\System\目录

动态分析技巧

绕过循环复制

  1. 调试方法

    • 在复制代码区域外设置断点
    • 运行到断点位置跳过循环
  2. 寄存器修改

    • 循环通过js指令判断次数
    • 结果存储在SF寄存器
    • 双击SF寄存器设置为1可跳过循环

矿池程序识别

  • 发现xmrig相关代码:知名开源矿工程序
  • 微软Defender识别为挖矿木马
  • 实际功能为隐蔽挖矿而非CS木马

矿池地址捕获技术

方法一:字符串分析

  1. 在IDA中搜索字符串

  2. 发现关键配置信息:

    {
        "algo": "cn/r",
        "url": "3.120.209.58:8080",
        "pools": [...]
    }
    
    • cn/r:CryptoNightR算法,常用于门罗币挖矿
    • url字段即为矿池地址
  3. 威胁情报验证:

    • 微步显示安全
    • VirusTotal有标记为"Miner"

方法二:动态调试捕获

  1. 断点设置

    • ws2_32.dll中的网络API设置断点
    • 重点关注GetAddrInfoW等函数
  2. API分析

    int GetAddrInfoW(
        PCWSTR pNodeName,    // 主机名/IP地址
        PCWSTR pServiceName, // 端口/服务名
        const ADDRINFOW* pHints,
        PADDRINFOW* ppResult
    );
    
    • x64调用约定:第一个参数在RCX寄存器
    • 动态调试时查看RCX值即为矿池地址
  3. 调试过程

    • 断在GetAddrInfoW时查看寄存器
    • 确认3.120.209.58:8080为矿池地址

总结与防护建议

技术要点总结

  1. 样本使用自我复制和互斥体确保持久化
  2. 采用多阶段加载方式隐藏真实功能
  3. 使用开源xmrig进行加密货币挖矿
  4. 矿池地址可通过静态字符串和动态调试捕获

防护建议

  1. 检测

    • 监控CreateMutex和自复制行为
    • 检测ws2_32.dll的异常网络连接
    • 关注C:\Windows\System\目录的可疑文件
  2. 防御

    • 更新防病毒软件规则
    • 限制不明程序的网络访问
    • 监控系统资源异常消耗
  3. 分析

    • 结合静态和动态分析方法
    • 重点关注文件操作和网络行为
    • 利用威胁情报验证可疑地址

通过以上详细分析流程,安全研究人员可以有效地识别和分析此类挖矿恶意软件,并采取相应的防护措施。

恶意挖矿样本分析与矿池地址捕获技术详解 样本基础信息 样本指纹 : SHA256: 938c187c0c566d3ecd0ca594d027cff745688b409d6ab18e7d836d9ef1bd30de MD5: 8bb9f094a5c3e8358d931200092e3412 SHA1: fced1103ababf08ea6435f43f597240ac6c357e8 静态分析 导入表分析 使用IDA查看导入表发现以下关键API: 敏感API: CreateMutex , GetLastError , Sleep , fopen , fseek , malloc , ftell , fwrite , fputs , CreateProcess 网络连接相关API: ws2_32.dll 中的网络功能函数 执行流程分析 主函数关键逻辑 : 互斥体检查 : 通过创建互斥体防止程序重复执行 如果互斥体已存在则休眠后退出 文件操作 : 读取样本自身文件内容到内存 推测可能包含第二阶段恶意代码 文件内容解析 : 从文件末尾倒数第8字节读取DWORD值 从文件末尾倒数第4字节读取DWORD值 使用 R13 (文件大小)和 R14 (内存起始地址)进行操作 文件写入 : 写入大小为文件总大小减去256再减去8字节的数据 自我复制 : 生成随机文件名 将自身复制到新文件并执行 循环复制到 C:\Windows\System\ 目录 动态分析技巧 绕过循环复制 调试方法 : 在复制代码区域外设置断点 运行到断点位置跳过循环 寄存器修改 : 循环通过 js 指令判断次数 结果存储在 SF 寄存器 双击 SF 寄存器设置为1可跳过循环 矿池程序识别 发现 xmrig 相关代码:知名开源矿工程序 微软Defender识别为挖矿木马 实际功能为隐蔽挖矿而非CS木马 矿池地址捕获技术 方法一:字符串分析 在IDA中搜索字符串 发现关键配置信息: cn/r :CryptoNightR算法,常用于门罗币挖矿 url 字段即为矿池地址 威胁情报验证: 微步显示安全 VirusTotal有标记为"Miner" 方法二:动态调试捕获 断点设置 : 在 ws2_32.dll 中的网络API设置断点 重点关注 GetAddrInfoW 等函数 API分析 : x64调用约定:第一个参数在 RCX 寄存器 动态调试时查看 RCX 值即为矿池地址 调试过程 : 断在 GetAddrInfoW 时查看寄存器 确认 3.120.209.58:8080 为矿池地址 总结与防护建议 技术要点总结 样本使用自我复制和互斥体确保持久化 采用多阶段加载方式隐藏真实功能 使用开源xmrig进行加密货币挖矿 矿池地址可通过静态字符串和动态调试捕获 防护建议 检测 : 监控 CreateMutex 和自复制行为 检测 ws2_32.dll 的异常网络连接 关注 C:\Windows\System\ 目录的可疑文件 防御 : 更新防病毒软件规则 限制不明程序的网络访问 监控系统资源异常消耗 分析 : 结合静态和动态分析方法 重点关注文件操作和网络行为 利用威胁情报验证可疑地址 通过以上详细分析流程,安全研究人员可以有效地识别和分析此类挖矿恶意软件,并采取相应的防护措施。