有什么方法可以获取列表全部应用程序中使用的系统调用而不运行应用程序中所有可能的场景?
答案1
理论上,如果应用程序遵守某些约束,是的。一般来说,没有。
调用系统调用的最常见方法是通过标准库包装器。例如,read(fd,buf,BUFLEN)
编译为程序集call read
,并且在 amd64 目标代码中e8 00 00 00 00
(其中零被 的符号表条目覆盖read
)。构建标准库使用的所有系统调用的表,通读目标代码以查找对标准库的调用,使用它来查找可能的系统调用。
不过,程序也可以syscall
直接使用。第一个参数是系统调用号。它可以从文件、命令行参数、标准输入、网络套接字中读取该数字,或者进行一些冗长的计算(尝试分解素数、顺序搜索产生特定 SHA2 哈希值的输入、运行通用图灵机)机器直到它停止等)来生成它。
程序还可以使用dlopen
/dlsym
来调用标准库函数,并且它可以从文件、命令行参数、标准输入、网络套接字或经过一些冗长的计算后获取要调用的名称。事实上,它可能查找的标准库函数可能就是syscall
它本身。
因此,有些程序的答案是“它可能会调用任何东西”。