J'écris une carte d'appels système Linux pour le débogueur radare2. Cela signifie qu’il faut fournir un énorme numéro d’appel système de mappage de tableau statique à un nom de nom syscall et au nombre d’arguments requis. 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 analyser 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 noyau, 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). Tous 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
( home page ) a des tables avec tout ça dans (voir linux/<platform>/syscallent.h
). Code source disponible dans GitHub/strace et GitLab/strace . Par exemple, la liste des appels système dans l'architecture x86_64 se trouve dans ce lien .
La seule liste que je connaisse est la source du noyau, 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 particulière pour obtenir les chiffres. Et il y a quelques #ifdefs dans ce fichier ...
ausyscall - un programme qui permet de mapper des noms et des numéros d'appels système
Analyse de la documentation:
http://asm.sourceforge.net/syscall.html Analyse le code HTML contenu dans les balises <pre>
.
ou
http://syscalls.kernelgrok.com/ Convert JSON http://syscalls.kernelgrok.com/syscalls-2.6.35.4.js
Il existe des appels système avec un nombre variable d'arguments - observez 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.
Ceci post vaut la peine d'être lu. J'espère que cela vous aidera :)