使用dnlib自动化提取AgentTesla字符串
字数 1893 2025-11-21 12:51:12

使用dnlib自动化提取AgentTesla字符串 - 完整教学文档

1. AgentTesla背景介绍

1.1 AgentTesla概述

AgentTesla是一种典型的Windows间谍木马/信息窃取器,具有以下特征:

  • 类型:远程访问木马(RAT)、间谍木马、信息窃取木马
  • 平台:主要针对Windows系统
  • 开发语言:基于.NET框架(C#/VB.NET)
  • 活跃时间:自2014年开始持续活跃并不断更新
  • 商业模式:以"恶意软件即服务"(MaaS)形式在地下市场销售

1.2 样本信息

  • 样本哈希:4c321c77e5a9381005c96bc7fc887b962bcd8c82fcabf579f3301d583055f59d
  • 保护机制:使用Obfuscar保护器进行代码混淆

2. 静态分析基础

2.1 字符串加密特征分析

在分析过程中发现关键特征:

  • 存在大型字节数组用于存储加密字符串
  • 字符串解密算法:str[i] ^ i ^ 170
  • 字符串存储方式:连续存储,无分隔符
  • 访问方式:通过索引、偏移量和长度参数提取子字符串

2.2 Obfuscar字符串隐藏机制

通过分析Obfuscar源代码发现:

  • 字符串隐藏通过HideStrings()函数实现
  • 核心逻辑在ProcessStrings()函数中
  • 使用(index, start, count)三元组管理字符串访问

3. dnlib技术基础

3.1 dnlib简介

dnlib是一个用于读取和操作.NET程序集的C#库,主要功能包括:

  • 解析.NET程序集的元数据(类型、方法、字段、属性等)
  • 分析IL代码指令
  • 提取资源文件和清单信息
  • 类似于IDA在原生代码分析中的作用

3.2 关键概念说明

Metadata Token结构

  • Token = (表号 << 24) | 行号(RID)
  • 示例:Token: 0x0400017F RID: 383
    • 0x04:表号=4(FieldDef表)
    • 0x00017F:行号=383

4. 自动化提取技术实现

4.1 环境配置要求

# 必需组件
- Python环境
- pythonnet包pip install pythonnet
- dnlib.dll正确版本
- pefile包用于PE文件分析

4.2 核心实现步骤

步骤1:加载PE文件模块

import clr
import dnlib
from dnlib.DotNet import *

# 加载dnlib
clr.AddReference('dnlib.dll')

# 加载目标样本
mw_module = dnlib.DotNet.ModuleDefMD.Load("sample_path")

步骤2:遍历类型和方法结构

for per_type in mw_module.GetTypes():
    if not per_type.HasMethods:
        continue
    
    for per_method in per_type.Methods:
        if not per_method.HasBody or not per_method.Body.HasInstructions:
            continue

步骤3:定位加密数组

关键识别特征:RuntimeHelpers::InitializeArray调用

for index in range(per_method.Body.Instructions.Count):
    if "RuntimeHelpers::InitializeArray" in per_method.Body.Instructions[index].ToString():
        # 前一条指令包含数组信息
        array_instruction = per_method.Body.Instructions[index - 1]

步骤4:提取数组数据

if isinstance(array_instruction.Operand, dnlib.DotNet.FieldDef) and array_instruction.Operand.HasFieldRVA:
    array_data = array_instruction.Operand.InitialValue
    array_size = len(array_data)

步骤5:识别解密密钥

通过分析XOR操作模式识别密钥:

# 特征指令序列:xor → ldc.i4 → xor
if (instructions[idx].OpCode == OpCodes.Xor and
    instructions[idx + 1].OpCode == OpCodes.Ldc_I4 and
    instructions[idx + 2].OpCode == OpCodes.Xor):
    key = get_param_value(instructions[idx + 1])

步骤6:参数提取函数

def get_ldc_real_value(instr):
    op_name = instr.OpCode.Name
    if op_name == 'ldc.i4':
        return instr.Operand
    elif op_name == 'ldc.i4.s':
        return instr.Operand
    elif op_name == 'ldc.i4.0':
        return 0
    # 处理其他ldc.i4变体...

4.3 字符串解密算法

def decrypt_bytes(input_bytes, keyword=170):
    result = ""
    for index, byte in enumerate(input_bytes):
        result += chr(byte ^ index ^ keyword)
    return result

4.4 字符串切片处理

识别字符串提取函数的参数模式:

ldc.i4 789        # 索引参数
ldc.i4 10934      # 偏移量参数  
ldc.i4.s 17       # 长度参数
call string method # 字符串提取函数调用

5. 工程化实现方案

5.1 模块化设计架构

候选密钥收集

def collect_candidate_keys(mw_module):
    candidate_keys = []
    for per_type in mw_module.GetTypes():
        for per_method in per_type.Methods:
            # 重点检查构造函数和静态构造函数
            if per_method.IsConstructor or per_method.Name == ".cctor":
                instructions = per_method.Body.Instructions
                # 识别XOR密钥模式...
    return candidate_keys

ASCII有效性验证

def pct_ascii(data):
    """计算字符串的ASCII字符比例"""
    if not data:
        return 0.0
    valid_chars = len([c for c in data if (0 <= ord(c) < 128) or ord(c) == 0])
    return valid_chars / len(data)

目标参数收集

def collect_target_params(mw_module):
    str_params = []
    for per_type in mw_module.GetTypes():
        for per_method in per_type.Methods:
            # 筛选公开方法且返回值为String
            if per_method.IsPublic and str(per_method.ReturnType) == "System.String":
                # 提取偏移量和长度参数...
    return str_params

5.2 完整处理流程

  1. 初始化阶段:加载PE文件,建立dnlib模块对象
  2. 密钥识别阶段:遍历IL指令,识别XOR解密密钥
  3. 数组定位阶段:找到加密字符串数组
  4. 参数提取阶段:收集所有字符串访问参数(offset, size)
  5. 解密执行阶段:应用解密算法,输出可读字符串

5.3 异常处理机制

  • 数组越界检查
  • 指令解析错误处理
  • 解密结果验证机制
  • 编码异常处理

6. 技术难点与解决方案

6.1 关键挑战

  1. 多态性指令处理:ldc.i4指令有多种变体格式
  2. 代码混淆对抗:Obfuscar保护器的反分析技术
  3. 动态加载检测:样本可能包含反调试和动态分析检测

6.2 解决方案

  1. 指令模式识别:基于操作码名称而非数值进行匹配
  2. 启发式分析:通过ASCII比例验证解密正确性
  3. 静态分析优先:避免触发样本的反分析机制

7. 实际应用效果

通过该自动化方案能够:

  • 成功提取AgentTesla的所有加密字符串
  • 准确识别Obfuscar的保护机制
  • 实现批量样本的自动化分析
  • 输出结构化的解密结果

8. 参考资源

  1. dnlib官方仓库:https://github.com/0xd4d/dnlib
  2. Obfuscar源代码:https://github.com/obfuscar/obfuscar
  3. dnlib使用示例:https://github.com/extremecoders-re/dnlib-demo
  4. .NET元数据处理:https://github.com/bartblaze/DotNet-MetaData

9. 总结

本教学文档详细介绍了使用dnlib自动化提取AgentTesla字符串的完整技术方案,涵盖了从基础理论到工程实践的各个方面。通过系统化的分析方法和技术实现,能够有效对抗Obfuscar等保护器的混淆技术,为.NET恶意软件分析提供了实用的自动化解决方案。

使用dnlib自动化提取AgentTesla字符串 - 完整教学文档 1. AgentTesla背景介绍 1.1 AgentTesla概述 AgentTesla是一种典型的Windows间谍木马/信息窃取器,具有以下特征: 类型 :远程访问木马(RAT)、间谍木马、信息窃取木马 平台 :主要针对Windows系统 开发语言 :基于.NET框架(C#/VB.NET) 活跃时间 :自2014年开始持续活跃并不断更新 商业模式 :以"恶意软件即服务"(MaaS)形式在地下市场销售 1.2 样本信息 样本哈希 :4c321c77e5a9381005c96bc7fc887b962bcd8c82fcabf579f3301d583055f59d 保护机制 :使用Obfuscar保护器进行代码混淆 2. 静态分析基础 2.1 字符串加密特征分析 在分析过程中发现关键特征: 存在大型字节数组用于存储加密字符串 字符串解密算法: str[i] ^ i ^ 170 字符串存储方式:连续存储,无分隔符 访问方式:通过索引、偏移量和长度参数提取子字符串 2.2 Obfuscar字符串隐藏机制 通过分析Obfuscar源代码发现: 字符串隐藏通过 HideStrings() 函数实现 核心逻辑在 ProcessStrings() 函数中 使用(index, start, count)三元组管理字符串访问 3. dnlib技术基础 3.1 dnlib简介 dnlib是一个用于读取和操作.NET程序集的C#库,主要功能包括: 解析.NET程序集的元数据(类型、方法、字段、属性等) 分析IL代码指令 提取资源文件和清单信息 类似于IDA在原生代码分析中的作用 3.2 关键概念说明 Metadata Token结构 : Token = (表号 < < 24) | 行号(RID) 示例:Token: 0x0400017F RID: 383 0x04:表号=4(FieldDef表) 0x00017F:行号=383 4. 自动化提取技术实现 4.1 环境配置要求 4.2 核心实现步骤 步骤1:加载PE文件模块 步骤2:遍历类型和方法结构 步骤3:定位加密数组 关键识别特征: RuntimeHelpers::InitializeArray 调用 步骤4:提取数组数据 步骤5:识别解密密钥 通过分析XOR操作模式识别密钥: 步骤6:参数提取函数 4.3 字符串解密算法 4.4 字符串切片处理 识别字符串提取函数的参数模式: 5. 工程化实现方案 5.1 模块化设计架构 候选密钥收集 ASCII有效性验证 目标参数收集 5.2 完整处理流程 初始化阶段 :加载PE文件,建立dnlib模块对象 密钥识别阶段 :遍历IL指令,识别XOR解密密钥 数组定位阶段 :找到加密字符串数组 参数提取阶段 :收集所有字符串访问参数(offset, size) 解密执行阶段 :应用解密算法,输出可读字符串 5.3 异常处理机制 数组越界检查 指令解析错误处理 解密结果验证机制 编码异常处理 6. 技术难点与解决方案 6.1 关键挑战 多态性指令处理 :ldc.i4指令有多种变体格式 代码混淆对抗 :Obfuscar保护器的反分析技术 动态加载检测 :样本可能包含反调试和动态分析检测 6.2 解决方案 指令模式识别 :基于操作码名称而非数值进行匹配 启发式分析 :通过ASCII比例验证解密正确性 静态分析优先 :避免触发样本的反分析机制 7. 实际应用效果 通过该自动化方案能够: 成功提取AgentTesla的所有加密字符串 准确识别Obfuscar的保护机制 实现批量样本的自动化分析 输出结构化的解密结果 8. 参考资源 dnlib官方仓库:https://github.com/0xd4d/dnlib Obfuscar源代码:https://github.com/obfuscar/obfuscar dnlib使用示例:https://github.com/extremecoders-re/dnlib-demo .NET元数据处理:https://github.com/bartblaze/DotNet-MetaData 9. 总结 本教学文档详细介绍了使用dnlib自动化提取AgentTesla字符串的完整技术方案,涵盖了从基础理论到工程实践的各个方面。通过系统化的分析方法和技术实现,能够有效对抗Obfuscar等保护器的混淆技术,为.NET恶意软件分析提供了实用的自动化解决方案。