如何使用静态分析从二进制文件中收集系统调用?

时间:2017-12-18 22:58:16

标签: operating-system reverse-engineering system-calls static-analysis

我想获得一个使用静态分析的给定二进制文件(x86_64)中使用的系统调用列表。我尝试了strace,但它不能保证它是一个完整的列表,因为在执行期间可能不会调用某些系统调用。

4 个答案:

答案 0 :(得分:1)

对于C / C ++,您可以尝试CppDepend来检测外部库和系统调用的所有依赖项。但是,您必须分析源代码而不是二进制文件。

答案 1 :(得分:1)

在静态分析中,假设没有混淆二进制文件,有几种工具可以深入了解二进制文件。最常用的是IDA。在单独分析二进制文件时,有几种编译选项在具有挑战性的静态分析技术中发挥着重要作用,即动态对静态链接,剥离二进制文件,优化选项等。

查找系统调用的一种方法是使用IDAPython API创建脚本,以便根据此处X86 Assembly/Interfacing with Linux和此处Linux Syscall Reference的描述查找系统调用。 IDAPython提供了一个“足够好”的API,可以查看每个基本块中的指令,以得出正在调用什么系统调用的结论。

答案 2 :(得分:0)

使用NDepend工具,您可以使用代码查询,但仅限于.NET程序集:

from x in ThirdParty.CodeElements
select new { x, callers = 
  x.IsMethod ? x.AsMethod.MethodsCallingMe.Cast<ICodeElement>() : 
  x.IsType   ? x.AsType.TypesUsingMe.Cast<ICodeElement>() : new ICodeElement[0] }

NDepend calls to system

答案 3 :(得分:0)

我认为早期的答案是解决这个问题的最简单方法。一个选项是使用支持二进制文件并导航控制流图的静态分析工具。这可能允许您在死代码中调用它们时排除某些函数,但它也会复杂得多。 GrammaTech CodeSonar是一个支持二进制文件的商业工具,可以在这里提供帮助。