第三讲:静态分析入门——字符串、导入表、资源与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
不过要注意,恶意软件作者也会反制。他们会把字符串加密、压缩或者动态生成。这时候,光靠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,就是你的放大镜和显微镜。
下一讲,我们会进入动态分析,让程序真正跑起来,看看它到底干了什么。到时候,你会发现静态分析的结果和动态行为相互印证,那种感觉,真的很爽。
好了,今天的课就到这里。记住,多动手,多分析。光看不练,永远成不了高手。去下载几个样本练练手吧。