静态分析与动态分析
顾名思义,静态分析就是在不运行程序的时候进行分析,相反动态分析就是在运行程序的过程中分析。比如文章(https://www.jianshu.com/p/e910b3db42bd)中的实例就是动态分析。
1. 静态分析
方法:
a. 阅读反汇编代码
b. 提取可执行文件中的字符串,分析使用了那些单词
以wsample01a.exe为例分析
工具:WinHex、IDA7.0 Freeware version
源程序:https://github.com/kenjiaiko/binarybook/tree/master/chap01/wsample01a/Release
之后可以尝试利用IDA7.0对程序进行反汇编,这个工具可以帮助我们更好地理解汇编代码,可以选择Text View或是Graph View,用不同的视图来查看代码,可以用类似流程的方式解释梳理代码的结构。
意义:我们在完全没有源代码的情况下搞清楚了程序的行为
2. 动态分析
方法:
a. 获取文件和注册表访问日志
b. 抓取网络包
以wsample01b.exe为例分析
工具:Process Monitor
源程序:https://github.com/kenjiaiko/binarybook/blob/master/chap01/wsample01b/Release/wsample01b.exe
运行程序,打开Process Monitor查看程序相关的部分,可以通过Crl+l的方式调出过滤规则设置窗口,然后找到对应的程序日志
我们发现,这个程序也在C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup的位置备份了自己的程序。
接下来可以使用调试器进一步跟踪程序逻辑。我们可以用它设断点:再任意位置中断或是恢复程序的运行,或是直接单步执行(单步跳入跳出),辨认其中的内存和变量情况。
跳入:调用函数时进入函数内部
跳出:调用函数时不进入函数内部,而是将函数调用作为一条指令来执行
页面中分为四个部分:左上为主要反汇编窗口,左下为内存数据窗口,右上为寄存器信息,右下为当前栈信息。
一些简单的操作:可以通过Ctrl+g的方式跳转需要的位置、F2用于设置断点、F9用于启动程序、F7单步跳入、F8单步跳出(对于不需要关注的函数可以选择跳出)
总结:从分类的角度,静态分析与动态分析的区别在于“是否运行目标程序”,但是实际上不止如此,静态分析更偏重于“总览全局”,而动态分析则侧重于“细看局部”。因此在软件分析的时候,常常用WinHex和IDA看一下整体的结构,粗略地有个大体印象,知道程序在做什么,然后再根据Ollydbg单步运行查看一些细节。
参考材料:
1.《有趣的二进制·软件安全与逆向分析》【日】爱甲健二