记一次IDA分析恶意DLL文件
字数 2853 2025-08-09 13:33:44
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"跳转到指定地址
- 汇编代码分析:
mov eax, off_10019040 add eax, 0Dh push eax call gethostbyname - 字符串分析:
- 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)
- 关键设置指令:
call sub_10003695 mov dword_1008E5C4, eax - sub_10003695函数分析:
- 调用GetVersionExA获取系统信息
- 比较dwPlatformId与2(VER_PLATFORM_WIN32_NT)
- 相同则设置AL为1,否则为0
- 返回值通常为1
- 最终dword_1008E5C4通常被设置为1
0x0A robotwork字段分析
分析0x1000FF58处的robotwork字段:
- 函数包含一系列memcmp调用
- 关键代码:
push "robotwork" call memcmp test eax, eax jz ... - 匹配后执行:
- 调用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调用:
- 关键代码:
mov eax, off_10019020 ; "[This is CTI]30" add eax, 0Dh push eax call ds:atoi imul eax, 3E8h push eax call ds: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
- 相关代码:
mov eax, 564D5868h ; "VMXh" in eax, dx - 功能:通过特定端口指令检测VMware虚拟环境
0x12-0x13 加密字符串分析
0x1001D988处分析:
- 初始显示为不可读字符
- 运行解密脚本后:
- 使用异或解密
- 解密结果:"xdoor is this backdoor"
总结
本教程详细演示了使用IDA Pro分析恶意DLL文件的完整流程,涵盖了从基础操作到高级分析的各个方面。关键学习点包括:
- 正确识别DLL入口点和关键函数
- 使用交叉引用追踪函数调用关系
- 分析API调用和参数传递
- 识别和解析加密字符串
- 理解恶意代码的反虚拟机技术
- 使用IDA的图模式可视化分析代码结构
通过这种系统化的分析方法,可以有效识别恶意代码的功能和行为特征,为后续的威胁分析和防护提供基础。