Operating system 如何通过静态分析从二进制文件收集系统调用?

Operating system 如何通过静态分析从二进制文件收集系统调用?,operating-system,reverse-engineering,system-calls,static-analysis,Operating System,Reverse Engineering,System Calls,Static Analysis,我想通过静态分析获得在给定二进制文件(x86_64)中使用的系统调用列表。我尝试了strace,但它不能保证它是一个完整的列表,因为在执行过程中可能不会调用某些系统调用。使用工具NDepend,您可以通过代码查询来实现这一点,但只能在.NET程序集上实现: from x in ThirdParty.CodeElements select new { x, callers = x.IsMethod ? x.AsMethod.MethodsCallingMe.Cast<ICodeElem

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

使用工具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] }
第三方中x的
代码元素
选择新{x,呼叫者=
x、 IsMethod?x.AsMethod.MethodScalingMe.Cast():
x、 IsType?x.AsType.TypesUsingMe.Cast():新ICodeElement[0]}

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

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

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


查找系统调用的一种方法是创建脚本,以便根据此处和此处的描述查找系统调用。IDAPython提供了一个“足够好”的API,可以查看每个基本块中的指令,以确定调用了什么系统调用。

外部链接表不够用吗?我真的不知道外部链接表是什么,但我肯定会研究它。谢谢符号表(也称为链接表或依赖表)是程序使用的另一个二进制模块中的符号列表。当操作系统加载您的可执行文件时,它会通过加载其他模块并连接它们来解决这些依赖关系。其工作方式各不相同,但所有COFF/PE文件都包含此表。我知道它可能只包含二进制调用的函数,但我要查找的是特定的系统调用。但是获取函数列表也很有帮助,因为我可以分析这些函数并找到被调用的系统调用。我想知道是否有更好更快的方法来实现这一点。删除在执行过程中没有调用的系统调用需要解决停止问题。实际上,我将重点放在像C或C++这样的编译程序上。