第三讲:静态分析入门——字符串、导入表、资源与IDA Pro实战

各位同学,欢迎来到第三讲。今天咱们要聊的,是逆向分析里最基础、也最实用的一步——静态分析。

静态分析是什么?说白了,就是不运行程序,光靠看它的“尸体”来推断它的行为。你想想看,一个恶意软件要是真跑起来,可能就加密你的文件、连上C2服务器了。所以,安全分析的第一步,永远是先静态看看。

我个人习惯,拿到一个样本,先做三件事:看字符串、看导入表、看资源。这三板斧下去,80%的样本基本就现原形了。今天我就带你把这套流程走一遍,最后再用IDA Pro来一次实战。

3.1 字符串分析:恶意软件的“自白书”

字符串,就是程序里硬编码的文本。恶意软件再狡猾,也免不了要写一些字符串——比如URL、IP地址、注册表路径、文件名、错误提示等等。这些就是它的“自白书”。

怎么提取?工具很多。我最早用strings命令行工具,后来用PEiD、CFF Explorer,现在习惯直接在IDA里看。

举个例子,你运行:

strings malware.exe > strings.txt

然后打开strings.txt,你会看到一堆乱七八糟的东西。别慌,重点找这些:

  • URL和IP:比如http://evil.com/upload、192.168.1.100
  • 文件路径:比如C:\Windows\System32\drivers\
  • 注册表键:比如SOFTWARE\Microsoft\Windows\CurrentVersion\Run
  • API函数名:比如CreateRemoteThread、VirtualAllocEx
  • 加密密钥或标志:比如xor_key_0xAB、encrypted_flag
我的经验:有一次分析一个勒索软件,我在字符串里直接看到了比特币地址和邮箱。顺着这个线索,我找到了它的C2服务器。所以说,字符串分析往往能给你最直接的线索。

不过要注意,恶意软件作者也会反制。他们会把字符串加密、压缩或者动态生成。这时候,光靠strings就看不到了。嗯,这里要注意,如果字符串全是乱码,那大概率是被处理过了,你需要动态分析或者写脚本解密。

3.2 导入表/导出表分析:看它“请了哪些外援”

程序自己不会所有功能都自己写,它要调用操作系统的API。这些API的调用信息,就记录在导入表(Import Table)里。而导出表(Export Table),则是这个程序提供给其他程序用的函数列表——DLL文件里最常见。

为什么看导入表?因为API调用直接暴露了程序的行为意图。比如:

  • 看到CreateFile、WriteFile → 可能在做文件操作
  • 看到RegSetValueEx → 可能在写注册表
  • 看到socket、connect、send → 肯定有网络通信
  • 看到CreateRemoteThread、WriteProcessMemory → 极可能是注入或木马

我建议你用PEview或CFF Explorer打开PE文件,直接看导入表。它会列出所有调用的DLL和函数名。

举个例子,一个简单的键盘记录器,它的导入表可能长这样:

DLL 导入函数
user32.dll GetAsyncKeyState, SetWindowsHookEx, CallNextHookEx
kernel32.dll CreateFile, WriteFile, GetModuleFileName
ws2_32.dll socket, connect, send

看到没?GetAsyncKeyState是检测按键的,SetWindowsHookEx是设置钩子的,再加上网络函数——基本可以断定这是个键盘记录器加后门。

避坑指南:我曾经遇到一个样本,导入表里全是正常的函数,比如MessageBox、Sleep。但实际运行时它却做了恶意行为。后来发现,它用了动态加载——通过LoadLibrary和GetProcAddress在运行时才获取恶意API。所以,导入表干净不代表程序干净,还要结合动态分析。

3.3 资源分析:藏在PE文件里的“私货”

PE文件的资源段(.rsrc)里,可以存放各种数据:图标、对话框、字符串表、甚至可执行文件本身。恶意软件经常把DLL、配置文件、加密数据藏在资源里。

怎么提取?用Resource Hacker或者IDA Pro的资源视图。你打开一个样本,看看资源里有没有奇怪的东西:

  • 一个看起来像PE文件的二进制块(通常以MZ开头)
  • 一个很大的自定义资源(比如RT_RCDATA)
  • 一个加密的配置文件(比如config.bin)

我记得有一次分析一个下载器,它的资源里藏了一个加密的DLL。我提取出来后,用IDA打开,发现那才是真正的恶意载荷——一个远控木马。所以说,资源分析是发现“隐藏武器”的关键一步。

3.4 使用IDA Pro进行静态分析实战

好了,理论说完了,咱们来点实战。IDA Pro是静态分析的瑞士军刀,我几乎每天都在用。下面我带你走一遍基本流程。

3.4.1 打开样本

把样本拖进IDA,它会问你文件类型。一般选Portable executable for 80386 (PE)。然后IDA会自动分析,这个过程可能需要几秒到几分钟,取决于样本大小。

3.4.2 看入口点

分析完成后,IDA会停在程序的入口点(Entry Point)。别急着往下翻,先看看入口点附近的代码。很多恶意软件会在入口点做反调试、反虚拟机检查。

比如,你可能会看到这样的代码:

push    offset aIsDebuggerPresent ; "IsDebuggerPresent"
call    ds:GetModuleHandleA
test    eax, eax
jnz     short loc_401000

这就是在检查是否有调试器。嗯,这里要注意,如果看到类似cpuid指令或者rdtsc指令,那是在检测虚拟机或计时器。

3.4.3 查看导入表

在IDA里,按Ctrl+E或者去View → Open subviews → Imports,就能看到导入表。IDA会把函数按DLL分组,非常清晰。你可以快速浏览,标记出可疑的API。

3.4.4 查看字符串

按Shift+F12打开字符串窗口。IDA会把所有字符串列出来,你可以双击跳转到引用位置。我习惯先看有没有http://、https://、\.exe、\.dll这些关键词。

3.4.5 交叉引用分析

这是IDA最强大的功能之一。你选中一个函数或字符串,按Ctrl+X,就能看到所有引用它的地方。比如,你发现一个可疑的URL字符串,按交叉引用,就能找到是哪个函数在用这个URL——那很可能就是网络通信函数。

实战技巧:我一般会先找CreateFile、WriteFile、socket这些关键API,然后看它们的交叉引用。顺着调用链往上找,就能定位到恶意行为的主逻辑。这比从头到尾读代码快得多。

3.4.6 重命名和注释

IDA默认的函数名都是sub_401000这种,很难记。我建议你分析到关键函数时,按N键重命名,比如改成decrypt_config、connect_c2。同时按:键添加注释。这样,你的IDA数据库会越来越清晰,下次再看就一目了然。

3.5 小结

静态分析是逆向的基石。字符串、导入表、资源,这三样东西就像犯罪现场的指纹和脚印。你只要耐心看,总能找到线索。而IDA Pro,就是你的放大镜和显微镜。

下一讲,我们会进入动态分析,让程序真正跑起来,看看它到底干了什么。到时候,你会发现静态分析的结果和动态行为相互印证,那种感觉,真的很爽。

好了,今天的课就到这里。记住,多动手,多分析。光看不练,永远成不了高手。去下载几个样本练练手吧。