Comment obtenir une liste des appels système Linux et le nombre d’arguments pris automatiquement?

J’écris une carte d’appels système Linux pour le débogueur radare2. Cela signifie qu’il faut fournir un très grand numéro d’appel système de tableau statique à un nom de nom syscall et au nombre d’arguments requirejs. Cela était facile pour OpenBSD car les nombres d’appels système sont définis dans sys / syscall.h et dans un commentaire au-dessus de chacun, il y a le nombre d’arguments. Il suffisait d’écrire un script pour parsingr cela et jeter le code C du tableau.

Sur linux cependant, nous n’avons pas ce luxe. Il est facile d’obtenir le numéro d’appel système à partir des en-têtes du kernel, mais comment puis-je obtenir le nombre d’arguments? Les seules idées que j’ai sont:

1) Tapez-les manuellement. Pour chaque arc (ils varient entre les arcs sous Linux). Les 300+ des maudits choses. En aucune façon!

2) Analyser les pages de manuel.

3) Ecrivez un script qui essaie d’appeler chaque appel système avec 0, 1, 2 … arguments jusqu’à la construction du programme. Ne fonctionnera pas pour varargs, mais les appels système prennent-ils cela en charge?

Il doit y avoir une meilleure façon. S’il vous plaît aider!

strace ( page d’accueil ) contient des tables avec tout cela dans (voir linux//syscallent.h ). Code source disponible dans GitHub / strace et GitLab / strace . Par exemple, la liste des appels système dans l’architecture x86_64 figure dans ce lien .

La seule liste que je connaisse est la source du kernel, dans include / linux / syscalls.h . Mais ce n’est que par nom, pas par numéro; Je pense que vous devez utiliser l’en-tête syscall.h de votre plate-forme pour obtenir les chiffres. Et il y a quelques #ifdefs dans ce fichier …

Analyse de la documentation:

http://asm.sourceforge.net/syscall.html Analyser le code HTML à l’intérieur des balises


.

ou

http://syscalls.kernelgrok.com/ Convertir JSON http://syscalls.kernelgrok.com/syscalls-2.6.35.4.js

ausyscall – un programme qui permet de mapper des noms et des numéros d’appel système

Il existe des appels système avec un nombre variable d’arguments – assistez à l’appel open() au niveau C, où le troisième paramètre est facultatif (peut ne pas l’être au niveau de l’assembleur).

Votre meilleur choix pourrait être de rechercher les appels système identifiés par leur nom dans syscalls.h dans la source (prétraitée) des autres en-têtes système. À partir de ceux-ci, vous pouvez compter le nombre d’arguments. Il peut être difficile de placer les bons en-têtes sur place, et il pourrait être concevable que des appels système ne soient jamais exposés en tant que fonctions C directement (je n’ai pas cherché à voir; c’est assez improbable, cependant).

Vous pouvez voir comment un autre débogueur, tel que GDB, fait le même travail.

Cet article mérite d’être lu. J’espère que cela t’aides 🙂