12、字符串与API分析:查找关键字符串、分析API调用
好,咱们今天聊点实战的。字符串和API分析,说白了就是逆向工程的“指纹识别”。你拿到一个样本,第一件事不是反汇编从头读到尾——那太傻了。我个人的习惯是:先找字符串,再看API调用,最后定位关键代码。这三步走完,程序的大致逻辑基本就浮出水面了。
12.1 字符串分析——程序的“自白书”
你想想看,一个程序再怎么加密、混淆,它总得跟用户交互吧?总得读写文件吧?这些行为都会留下字符串痕迹。我当年分析一个勒索软件时,就是靠一个“encrypt_key.txt”字符串找到了它的加密逻辑入口。
12.1.1 静态字符串提取
用IDA Pro或x64dbg打开样本后,我建议你先看字符串窗口。IDA里快捷键是Shift+F12,x64dbg里是“符号”标签页。你会看到类似这样的内容:
// 常见的恶意字符串模式
"\\\\.\\PhysicalDrive0" // 直接读写物理磁盘
"CreateFileA failed" // 错误信息暴露API调用
"http://malware.xyz/check" // C2地址
"VirtualAlloc failed" // 内存分配失败提示
"MessageBoxW" // 弹窗函数名(有时被硬编码)
关键点:字符串往往暴露程序意图。看到“Decrypt”就别傻乎乎当正常软件分析了。
12.1.2 动态字符串解密
有些程序会把字符串加密存储,运行时才解密。这时候静态提取就抓瞎了。我曾经遇到过一个样本,所有字符串都是XOR加密的,密钥藏在代码里。我的做法是:
- 在解密函数下断点
- 运行到断点后,查看内存中的解密结果
- 用脚本批量dump出所有解密后的字符串
小技巧:如果字符串是逐字节XOR的,可以用OllyDbg的“二进制复制”功能,配合Python脚本快速还原。我写过一个小工具,专门干这个活。
12.2 API调用分析——看穿程序的“手脚”
API调用是程序跟操作系统打交道的唯一途径。你盯着API看,就能知道它在干什么。比如看到CreateFile,它可能在读写文件;看到VirtualAlloc,它可能在申请内存执行代码;看到MessageBox,它可能想弹窗骗你点“确定”。
12.2.1 关键API速查表
| API名称 | 典型用途 | 分析要点 |
|---|---|---|
| MessageBoxA/W | 弹窗提示 | 检查文本内容,可能是钓鱼或警告 |
| CreateFileA/W | 创建/打开文件 | 看文件名参数,判断读写目标 |
| VirtualAlloc | 申请内存 | 检查大小和权限,常与shellcode相关 |
| WriteProcessMemory | 写入远程进程内存 | 注入行为的标志 |
| CreateRemoteThread | 远程线程创建 | 几乎100%是恶意行为 |
12.2.2 实战:分析MessageBox调用
咱们看个具体例子。假设你在IDA里看到这样的反汇编:
push 0 ; uType = MB_OK
push offset Caption ; "警告"
push offset Text ; "系统发现病毒,请点击确定清除"
push 0 ; hWnd = NULL
call MessageBoxA
嗯,这里要注意。这个MessageBox的文本是“系统发现病毒”,但程序本身可能就是病毒。它弹这个窗,是想让你放松警惕。我见过一个样本,弹窗说“扫描完成,未发现威胁”,实际上后台正在加密你的文件。
避坑指南:我曾经被一个样本骗过——它弹了个“系统错误”的MessageBox,我以为是正常程序崩溃了,结果它后台在偷数据。所以看到MessageBox,别光看文本,要结合上下文分析。
12.3 定位关键代码——从API回溯到逻辑
找到API调用后,怎么定位到关键代码?我的方法是:从API往回追溯,找到调用它的函数。说白了就是“顺藤摸瓜”。
12.3.1 交叉引用分析
在IDA里,选中一个API调用,按X键查看交叉引用。你会看到所有调用这个API的地方。然后逐个分析:
- 如果
CreateFile被调用了10次,但只有1次参数是“\\.\PhysicalDrive0”,那这1次就是关键 - 如果
VirtualAlloc后面紧跟着memcpy和call eax,那基本就是shellcode执行
12.3.2 代码定位流程图
下面这张图是我自己总结的定位流程,你照着走一遍,基本不会漏掉关键代码:
12.3.3 实战:从VirtualAlloc到shellcode
咱们再来看个真实场景。假设你发现程序调用了VirtualAlloc,参数是dwSize=0x1000、flProtect=PAGE_EXECUTE_READWRITE。这明显是在申请可执行内存。接下来:
- 在
VirtualAlloc返回后下断点 - 查看EAX寄存器(返回的内存地址)
- 继续运行,看谁往这个地址写数据
- 如果看到
call eax或jmp eax,那这里就是shellcode执行点
核心思路:API调用就像程序的“指纹”。你不需要读懂每一行汇编,只要抓住几个关键API,就能推断出程序的大致行为。我分析过上千个样本,90%的情况下,光靠API分析就能判断出样本是勒索软件、远控木马还是下载器。
12.4 综合案例分析
最后,咱们把字符串和API分析结合起来,看一个完整的例子。假设你拿到一个PE文件,用IDA打开后:
- 字符串窗口看到:“C:\Users\Public\Documents\”、“encrypted.”、“key.bin”
- API导入表看到:
CreateFileA、WriteFile、VirtualAlloc、CryptEncrypt
嗯,到这里基本可以断定:这是一个文件加密器(勒索软件)。字符串暴露了目标路径和文件后缀,API暴露了加密行为。接下来定位关键代码就简单了——直接找CryptEncrypt的调用位置,那里就是加密核心。
个人经验:我分析勒索软件时,最喜欢先找CryptEncrypt或BCryptEncrypt。找到后,在它前面下断点,运行到断点时查看缓冲区内容——加密前的原始数据一目了然。有时候还能直接dump出解密密钥。
好了,字符串和API分析就讲到这里。记住:先看字符串,再看API,最后定位代码。这三板斧抡好了,大部分样本都逃不过你的眼睛。