Как я могу получить список системных вызовов Linux и количество аргументов, которые они принимают автоматически? - PullRequest
18 голосов
/ 07 июля 2011

Я пишу карту системных вызовов Linux для отладчика radare2.Это означает предоставление системного номера огромного статического сопоставления массива имени имени системного вызова и количеству аргументов, которые оно принимает.Это было легко для OpenBSD, так как числа syscall определены в sys / syscall.h, а в комментариях над каждым указано количество аргументов.Это был всего лишь вопрос написания сценария для его анализа и выброса кода C для массива.

Однако в Linux у нас нет такой роскоши.Легко получить номер системного вызова из заголовков ядра, но как мне получить количество аргументов?Единственные идеи, которые у меня есть:

1) Введите их вручную.Для каждой арки (они различаются между арками в Linux).Все 300+ проклятых вещей.Ни в коем случае!

2) Разбор страниц справочника.

3) Напишите скрипт, который пытается вызвать каждый системный вызов с 0, 1, 2 ... args до сборки программы.Не подойдет ли varargs, но поддерживают ли это системные вызовы?

Должен быть лучший способ.Пожалуйста, помогите!

Ответы [ 6 ]

17 голосов
/ 07 июля 2011

strace ( домашняя страница ) содержит таблицы со всем этим (см. linux/<platform>/syscallent.h).Исходный код доступен в GitHub / strace и GitLab / strace .Например, список системных вызовов в архитектуре x86_64 находится в этой ссылке .

4 голосов
/ 07 июля 2011

Единственный список, который мне известен, это источник ядра, в include / linux / syscalls.h . Но это только по имени, а не по номеру; Я думаю, что вам нужно использовать заголовок syscall.h для вашей конкретной платформы, чтобы получить числа. И в этом файле есть несколько #ifdefs ...

2 голосов
/ 19 марта 2015

ausyscall - программа, которая позволяет отображать имена и номера системных вызовов

2 голосов
/ 07 июля 2011

Анализ документации:

http://asm.sourceforge.net/syscall.html Разбор HTML внутри тегов <pre>.

или

http://syscalls.kernelgrok.com/ Преобразование JSON http://syscalls.kernelgrok.com/syscalls-2.6.35.4.js

1 голос
/ 04 марта 2018

Этот пост стоит прочитать.Надеюсь, это поможет:)

1 голос
/ 07 июля 2011

Существуют системные вызовы с переменным числом аргументов - посмотрите на вызов open() на уровне C, где третий параметр является необязательным (может быть необязательным на уровне ассемблера).

Лучше всего найти системные вызовы, идентифицированные по имени в syscalls.h, в (предварительно обработанном) источнике других системных заголовков. Из них вы можете посчитать количество аргументов. Просто получить правильные заголовки на месте может быть сложно, и, возможно, могут существовать системные вызовы, которые никогда не будут представлены как функции C напрямую (я не смотрел на это, хотя это довольно маловероятно).

Вы можете посмотреть, как другой отладчик, такой как GDB, выполняет ту же работу.

...