如何获取Linux系统调用列表以及它们自动执行的args数量?

我为radare2调试器编写了一个Linux系统调用映射。 这意味着为系统调用名称名称及其所需的参数数量提供一个巨大的静态数组映射系统调用号。 这对于OpenBSD来说很容易,因为系统调用号在sys / syscall.h中定义,并且在上面的注释中每个都是args的数量。 只需要编写一个脚本来解析它并丢弃数组的C代码。

然而,在Linux上,我们没有这种奢侈品。 很容易从内核头文件中获取系统调用号,但是如何获取args的数量呢? 我唯一的想法是:

1)手动输入。 对于每个拱门(它们在linux中的拱门之间变化)。 所有300多件该死的东西。 没门!

2)解析手册页。

3)编写一个脚本,尝试用0,1,2 … args调用每个系统调用,直到程序构建。 不适用于varargs,但系统调用支持吗?

一定有更好的方法。 请帮忙!

strace ( 主页 )有所有这些内容的表(参见linux//syscallent.h )。 源代码可在GitHub / strace和GitLab / strace中获得 。 例如,x86_64体系结构中的系统调用列表位于此链接中 。

我知道的唯一列表是include / linux / syscalls.h中的内核源代码。 但这只是名字,而不是数字; 我认为您需要使用特定平台的syscall.h标头来获取数字。 并且该文件中有一些#ifdefs ……

文档解析:

http://asm.sourceforge.net/syscall.html解析


标签内的HTML。

要么

http://syscalls.kernelgrok.com/转换JSON http://syscalls.kernelgrok.com/syscalls-2.6.35.4.js

ausyscall – 允许映射系统调用名称和数字的程序

存在具有可变数量的参数的系统调用 – 见证C级别的open()调用,其中第三个参数是可选的(在汇编程序级别可能不是可选的)。

您最好的选择可能是在其他系统头的(预处理的)源中查找syscalls.h中按名称标识的系统调用。 从那些,您可以计算参数的数量。 只是获得正确的标题可能是棘手的,可能会有系统调用永远不会直接作为C函数公开(我没有看到它;但它是不太可能的)。

您可能会看到另一个调试器(如GDB)如何执行相同的工作。

这篇文章值得一读。 希望这可以帮助 :)