使用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 完整处理流程
- 初始化阶段:加载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恶意软件分析提供了实用的自动化解决方案。