记一次IDA分析恶意DLL文件
字数 2853 2025-08-09 13:33:44

IDA Pro恶意DLL文件分析实战教程

0x00 前言

本教程通过使用IDA Pro对一个恶意DLL样本进行静态分析,旨在帮助初学者熟悉IDA工具的基本操作,并了解恶意样本的底层逻辑。教程包含从基础操作到高级分析的完整流程,涵盖了DLL入口点定位、函数交叉引用分析、字符串分析、API调用追踪等关键技能。

0x01 Dllmain地址定位

关键步骤:

  1. 加载文件时应选择"Portable"模式而非"Binary file"模式
  2. 实际入口点位于1000D02E
  3. 从DllEntryPoint到Dllmain之间的代码通常由编译器生成,无需过多分析

注意事项:

  • 恶意代码可能包含shellcode、加密参数或其他附加数据
  • 这些附加数据在Windows加载时不会被载入内存
  • 初始分析应专注于实际执行的汇编指令部分

0x02 导入函数定位

gethostbyname函数定位:

  1. 使用IDA的"Imports"窗口
  2. 找到gethostbyname函数
  3. 定位到该函数在idata区段的地址:100163CC

0x03 函数调用分析

分析gethostbyname调用情况:

  1. 右键函数名选择"Jump to xref to operand"
  2. 查看交叉引用信息:
    • "Type"中的"r"表示读取操作
    • "Type"中的"p"表示调用引用
  3. 结果显示:5个函数共调用了9次gethostbyname

0x04 DNS请求分析

分析0x10001757处的DNS请求:

  1. 使用"G"跳转到指定地址
  2. 汇编代码分析:
    mov eax, off_10019040
    add eax, 0Dh
    push eax
    call gethostbyname
    
  3. 字符串分析:
    • off_10019040指向字符串"[This is RDO]pics.praticalmalwareanalysis.com"
    • 偏移0Dh(13)后指向"pics.praticalmalwareanalysis.com"
  4. 触发的DNS请求为:pics.praticalmalwareanalysis.com

0x05-0x06 局部变量与参数分析

0x10001656处的子过程分析:

  1. 局部变量数量:24个
  2. 参数数量:1个(LPVOID类型的lpThreadParameter)

0x07 字符串定位

定位"cmd.exe /c"字符串:

  1. 使用字符串窗口(Shift+F12)
  2. 找到字符串"\cmd.exe /c"
  3. 定位地址:xdoors_d:10095834

0x08 字符串引用分析

分析引用"cmd.exe /c"的代码区域:

  1. 右键字符串选择"Jump to xref"
  2. 上下文分析:
    • 发现相关字符串:"Hi... Welcome...", "Machine Uptime...", "Machine IdleTime..."
    • 功能推测:获取系统信息的远程shell会话
  3. 其他相关字符串:
    • language
    • robotwork
    • mbase
    • mhost

0x09 全局变量设置分析

分析dword_1008E5C4设置方式:

  1. 跳转到相关地址
  2. 查看交叉引用(Ctrl+X)
  3. 关键设置指令:
    call sub_10003695
    mov dword_1008E5C4, eax
    
  4. sub_10003695函数分析:
    • 调用GetVersionExA获取系统信息
    • 比较dwPlatformId与2(VER_PLATFORM_WIN32_NT)
    • 相同则设置AL为1,否则为0
    • 返回值通常为1
  5. 最终dword_1008E5C4通常被设置为1

0x0A robotwork字段分析

分析0x1000FF58处的robotwork字段:

  1. 函数包含一系列memcmp调用
  2. 关键代码:
    push "robotwork"
    call memcmp
    test eax, eax
    jz ...
    
  3. 匹配后执行:
    • 调用sub_100052A2进行socket通信
    • 查询注册表键值:
      • SOFTWARE\Microsoft\Windows\CurrentVersion\WorkTime
      • SOFTWARE\Microsoft\Windows\CurrentVersion\WorkTimes

0x0B PSLIST导出函数分析

PSLIST函数功能分析:

  1. 查看导出表
  2. 两条执行路径,由sub_100036C3决定
  3. sub_100036C3功能:
    • 调用GetVersionExA
    • 检查dwPlatformId是否为2
    • 检查dwMajorVersion是否≥5
  4. 符合条件时:
    • 调用CreateToolhelp32Snapshot获取进程列表
    • 通过socket发送进程列表

0x0C 交叉引用图分析

绘制sub_10004E79的交叉引用图:

  1. 跳转到sub_10004E79
  2. 使用图模式显示交叉引用
  3. 调用关系:
    • GetSystemDefaultLangID
    • sprintf
    • sub_100038EE
    • strlen
  4. sub_100038EE调用:
    • send
    • malloc
    • free
    • __imp_strlen
  5. 功能推测:发送系统默认语言ID

0x0D API调用深度分析

DllMain的API调用分析:

  1. 直接调用(深度1):
    • strncpy
    • _strnicmp
    • CreateThread
    • strlen
  2. 深度2调用:大量其他API调用

0x0E Sleep参数分析

分析0x10001358处Sleep调用:

  1. 关键代码:
    mov eax, off_10019020 ; "[This is CTI]30"
    add eax, 0Dh
    push eax
    call ds:atoi
    imul eax, 3E8h
    push eax
    call ds:Sleep
    
  2. 参数计算:
    • 字符串"[This is CTI]30"偏移0Dh得到"30"
    • atoi转换为30
    • 乘以3E8h(1000)得到30000
  3. Sleep参数:30000毫秒(30秒)

0x0F socket调用参数分析

分析0x10001701处socket调用:

  1. 调用前push顺序:6,1,2
  2. 参数对应:
    • 2 → AF_INET(IPv4)
    • 1 → SOCK_STREAM(TCP)
    • 6 → IPPROTO_TCP
  3. 功能:创建基于IPv4的TCP连接

0x10 符号常量应用

使用符号常量增强可读性:

  1. 右键数值选择"符号变量"
  2. 显示IDA识别的对应常量
  3. 修改后参数更易理解:
    • AF_INET
    • SOCK_STREAM
    • IPPROTO_TCP

0x11 VMware检测分析

in指令检测VMware:

  1. 搜索in指令(Search→Text或Sequence of Bytes)
  2. 关键位置:0x100061C7
  3. 相关代码:
    mov eax, 564D5868h ; "VMXh"
    in eax, dx
    
  4. 功能:通过特定端口指令检测VMware虚拟环境

0x12-0x13 加密字符串分析

0x1001D988处分析:

  1. 初始显示为不可读字符
  2. 运行解密脚本后:
    • 使用异或解密
    • 解密结果:"xdoor is this backdoor"

总结

本教程详细演示了使用IDA Pro分析恶意DLL文件的完整流程,涵盖了从基础操作到高级分析的各个方面。关键学习点包括:

  1. 正确识别DLL入口点和关键函数
  2. 使用交叉引用追踪函数调用关系
  3. 分析API调用和参数传递
  4. 识别和解析加密字符串
  5. 理解恶意代码的反虚拟机技术
  6. 使用IDA的图模式可视化分析代码结构

通过这种系统化的分析方法,可以有效识别恶意代码的功能和行为特征,为后续的威胁分析和防护提供基础。

IDA Pro恶意DLL文件分析实战教程 0x00 前言 本教程通过使用IDA Pro对一个恶意DLL样本进行静态分析,旨在帮助初学者熟悉IDA工具的基本操作,并了解恶意样本的底层逻辑。教程包含从基础操作到高级分析的完整流程,涵盖了DLL入口点定位、函数交叉引用分析、字符串分析、API调用追踪等关键技能。 0x01 Dllmain地址定位 关键步骤: 加载文件时应选择"Portable"模式而非"Binary file"模式 实际入口点位于 1000D02E 处 从DllEntryPoint到Dllmain之间的代码通常由编译器生成,无需过多分析 注意事项: 恶意代码可能包含shellcode、加密参数或其他附加数据 这些附加数据在Windows加载时不会被载入内存 初始分析应专注于实际执行的汇编指令部分 0x02 导入函数定位 gethostbyname函数定位: 使用IDA的"Imports"窗口 找到gethostbyname函数 定位到该函数在idata区段的地址: 100163CC 0x03 函数调用分析 分析gethostbyname调用情况: 右键函数名选择"Jump to xref to operand" 查看交叉引用信息: "Type"中的"r"表示读取操作 "Type"中的"p"表示调用引用 结果显示:5个函数共调用了9次gethostbyname 0x04 DNS请求分析 分析0x10001757处的DNS请求: 使用"G"跳转到指定地址 汇编代码分析: 字符串分析: off_ 10019040指向字符串"[ This is RDO ]pics.praticalmalwareanalysis.com" 偏移0Dh(13)后指向"pics.praticalmalwareanalysis.com" 触发的DNS请求为:pics.praticalmalwareanalysis.com 0x05-0x06 局部变量与参数分析 0x10001656处的子过程分析: 局部变量数量:24个 参数数量:1个(LPVOID类型的lpThreadParameter) 0x07 字符串定位 定位"cmd.exe /c"字符串: 使用字符串窗口(Shift+F12) 找到字符串"\cmd.exe /c" 定位地址:xdoors_ d:10095834 0x08 字符串引用分析 分析引用"cmd.exe /c"的代码区域: 右键字符串选择"Jump to xref" 上下文分析: 发现相关字符串:"Hi... Welcome...", "Machine Uptime...", "Machine IdleTime..." 功能推测:获取系统信息的远程shell会话 其他相关字符串: language robotwork mbase mhost 0x09 全局变量设置分析 分析dword_ 1008E5C4设置方式: 跳转到相关地址 查看交叉引用(Ctrl+X) 关键设置指令: sub_ 10003695函数分析: 调用GetVersionExA获取系统信息 比较dwPlatformId与2(VER_ PLATFORM_ WIN32_ NT) 相同则设置AL为1,否则为0 返回值通常为1 最终dword_ 1008E5C4通常被设置为1 0x0A robotwork字段分析 分析0x1000FF58处的robotwork字段: 函数包含一系列memcmp调用 关键代码: 匹配后执行: 调用sub_ 100052A2进行socket通信 查询注册表键值: SOFTWARE\Microsoft\Windows\CurrentVersion\WorkTime SOFTWARE\Microsoft\Windows\CurrentVersion\WorkTimes 0x0B PSLIST导出函数分析 PSLIST函数功能分析: 查看导出表 两条执行路径,由sub_ 100036C3决定 sub_ 100036C3功能: 调用GetVersionExA 检查dwPlatformId是否为2 检查dwMajorVersion是否≥5 符合条件时: 调用CreateToolhelp32Snapshot获取进程列表 通过socket发送进程列表 0x0C 交叉引用图分析 绘制sub_ 10004E79的交叉引用图: 跳转到sub_ 10004E79 使用图模式显示交叉引用 调用关系: GetSystemDefaultLangID sprintf sub_ 100038EE strlen sub_ 100038EE调用: send malloc free __ imp_ strlen 功能推测:发送系统默认语言ID 0x0D API调用深度分析 DllMain的API调用分析: 直接调用(深度1): strncpy _ strnicmp CreateThread strlen 深度2调用:大量其他API调用 0x0E Sleep参数分析 分析0x10001358处Sleep调用: 关键代码: 参数计算: 字符串"[ This is CTI ]30"偏移0Dh得到"30" atoi转换为30 乘以3E8h(1000)得到30000 Sleep参数:30000毫秒(30秒) 0x0F socket调用参数分析 分析0x10001701处socket调用: 调用前push顺序:6,1,2 参数对应: 2 → AF_ INET(IPv4) 1 → SOCK_ STREAM(TCP) 6 → IPPROTO_ TCP 功能:创建基于IPv4的TCP连接 0x10 符号常量应用 使用符号常量增强可读性: 右键数值选择"符号变量" 显示IDA识别的对应常量 修改后参数更易理解: AF_ INET SOCK_ STREAM IPPROTO_ TCP 0x11 VMware检测分析 in指令检测VMware: 搜索in指令(Search→Text或Sequence of Bytes) 关键位置:0x100061C7 相关代码: 功能:通过特定端口指令检测VMware虚拟环境 0x12-0x13 加密字符串分析 0x1001D988处分析: 初始显示为不可读字符 运行解密脚本后: 使用异或解密 解密结果:"xdoor is this backdoor" 总结 本教程详细演示了使用IDA Pro分析恶意DLL文件的完整流程,涵盖了从基础操作到高级分析的各个方面。关键学习点包括: 正确识别DLL入口点和关键函数 使用交叉引用追踪函数调用关系 分析API调用和参数传递 识别和解析加密字符串 理解恶意代码的反虚拟机技术 使用IDA的图模式可视化分析代码结构 通过这种系统化的分析方法,可以有效识别恶意代码的功能和行为特征,为后续的威胁分析和防护提供基础。