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加密的,密钥藏在代码里。我的做法是:

  1. 在解密函数下断点
  2. 运行到断点后,查看内存中的解密结果
  3. 用脚本批量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后面紧跟着memcpycall eax,那基本就是shellcode执行

12.3.2 代码定位流程图

下面这张图是我自己总结的定位流程,你照着走一遍,基本不会漏掉关键代码:

关键代码定位流程图 1. 字符串分析 提取所有可见字符串 2. API调用扫描 标记关键API(CreateFile等) 3. 交叉引用分析 按X键查看调用链 4. 参数分析 检查API参数(文件名、内存大小、权限等) 5. 回溯定位关键代码 从API向上追溯,找到调用函数 定位成功!分析关键代码

12.3.3 实战:从VirtualAlloc到shellcode

咱们再来看个真实场景。假设你发现程序调用了VirtualAlloc,参数是dwSize=0x1000flProtect=PAGE_EXECUTE_READWRITE。这明显是在申请可执行内存。接下来:

  1. VirtualAlloc返回后下断点
  2. 查看EAX寄存器(返回的内存地址)
  3. 继续运行,看谁往这个地址写数据
  4. 如果看到call eaxjmp eax,那这里就是shellcode执行点

核心思路:API调用就像程序的“指纹”。你不需要读懂每一行汇编,只要抓住几个关键API,就能推断出程序的大致行为。我分析过上千个样本,90%的情况下,光靠API分析就能判断出样本是勒索软件、远控木马还是下载器。

12.4 综合案例分析

最后,咱们把字符串和API分析结合起来,看一个完整的例子。假设你拿到一个PE文件,用IDA打开后:

  • 字符串窗口看到:“C:\Users\Public\Documents\”、“encrypted.”、“key.bin”
  • API导入表看到:CreateFileAWriteFileVirtualAllocCryptEncrypt

嗯,到这里基本可以断定:这是一个文件加密器(勒索软件)。字符串暴露了目标路径和文件后缀,API暴露了加密行为。接下来定位关键代码就简单了——直接找CryptEncrypt的调用位置,那里就是加密核心。

个人经验:我分析勒索软件时,最喜欢先找CryptEncryptBCryptEncrypt。找到后,在它前面下断点,运行到断点时查看缓冲区内容——加密前的原始数据一目了然。有时候还能直接dump出解密密钥。

好了,字符串和API分析就讲到这里。记住:先看字符串,再看API,最后定位代码。这三板斧抡好了,大部分样本都逃不过你的眼睛。


公众号:蓝海资料掘金营,微信deep3321