我正在编写一个工具,我需要为汇编指令生成调用图。但我不知道如何从汇编指令中准确生成调用图。你有什么主意吗?为了澄清起见,我在沙箱环境中运行了一个二进制示例,并用汇编语言提取了它的踪迹。所以现在我想为此生成调用图?我知道可以使用 IDA pro 通过静态分析生成调用图,但我的问题是如何从动态分析生成调用图?
为汇编指令生成调用图
逆向工程
部件
恶意软件
静态分析
动态分析
调用图
2021-06-29 16:15:40
2个回答
有了痕迹,这很容易。按顺序跟踪跟踪并:
- 对于第一条指令,在第一条指令的地址处创建一个函数对象。
- 对于每个调用语句或push + ret,创建一个函数对象,并从当前函数到这个函数对象添加一条边。
- 对于每个新的调用语句,创建或重用一个函数对象,并从当前函数到新的或已知的函数对象添加一条边。
- 在 RET* 指令之后,将当前函数更改为上一个函数。使用堆栈并向/从它推送/弹出元素。
我可以从您想要的唯一情况看出,如果您有库函数并且跟踪不包含相应的代码或系统调用。但是就像不更改此类调用的当前函数一样简单。
完成所有这些步骤后,您将拥有一个带有调用图的图结构。
注意:函数对象可以简单地是一个地址。
区分调用的一种方法是解析进程的地址空间并为各种库建立内存范围。因此,在解析跟踪时,您应该能够分辨什么是“本地”调用与对 lib 的调用。我还会解析各种库导出表,以建立各种入口点并使跟踪分析更容易一些。您当然需要跟踪动态负载等。处理内核中的调用也应该很容易与用户级区分开来。当然,这是假设您在分析跟踪时拥有内存信息。我不知道你是在分析 Windows 还是 Linux 跟踪,但这里有一篇很好的文章,用于在 Windows 上查找和解析导出表
http://fumalwareanalysis.blogspot.com/2011/12/malware-analysis-tutorial-8-pe-header.html
如果您要跟踪从创建到完成的整个过程,您还应该能够至少确定各种 DLL 的加载地址(可能还有大小)。如果您没有上面提到的外部存储器信息,那应该可以让您对内存布局有一个很好的了解。这应该足以区分本地调用和库调用。如果您对它调用的库不感兴趣,那就更容易了。您知道图像加载的地址,因此给定二进制文件的大小和加载程序的知识,您可以计算(或近似估计)加载的可执行文件的大小。超出此范围的任何内容,您都可以考虑“外部”。