2011-07-06 19 views
17

Estoy escribiendo un mapa de llamada del sistema Linux para el depurador radare2. Esto significa proporcionar un número de llamada de sistema de asignación de matriz estática enorme a un nombre de nombre de sistema y la cantidad de argumentos que toma. Esto fue fácil para OpenBSD ya que los números de syscall están definidos en sys/syscall.h y en un comentario arriba cada uno es el número de argumentos. Era solo una cuestión de escribir un guión para analizar esto y arrojar el código C para la matriz.¿Cómo puedo obtener una lista de las llamadas al sistema Linux y el número de argumentos que toman automáticamente?

En Linux, sin embargo, no tenemos este lujo. Es fácil obtener el número de syscall de los encabezados del kernel, pero ¿cómo debo obtener el número de args? Las únicas ideas que tengo son:

1) Tírelos manualmente. Para cada arco (varían entre arcos en linux). Todo 300+ de las malditas cosas. ¡De ninguna manera!

2) Páginas de manual de Parse.

3) Escriba un script que intente llamar a cada syscall con 0, 1, 2 ... args hasta que se construya el programa. No funcionará para varargs, pero ¿los syscalls soportan eso?

Tiene que haber una manera mejor. ¡Por favor ayuda!

+1

Para ver un ejemplo de varargs, consulte 'open()'. –

+0

@OliverCharlesworth, ¿qué quieres decir con esto? 'sys_open()' tiene exactamente 3 argumentos. – Ruslan

Respuesta

16

strace (home page, source) tiene tablas con todo esto en (ver linux/<platform>/syscallent.h).

+0

Esta es la página web ahora: https://sourceforge.net/p/strace/code/ci/master/tree/linux/ Después de abrirla, navegue a '/syscallent.h' – VasyaNovikov

4

La única lista que conozco es la fuente del kernel, en include/linux/syscalls.h. Pero eso es solo por nombre, no por número; Creo que debes usar el encabezado syscall.h para tu plataforma en particular para obtener los números. Y hay unos pocos #ifdefs en ese archivo ...

+0

es el número de argumentos para cada llamada al sistema que necesito –

+0

@ vext01: ¿Supongo que también necesita los tipos? Porque algunos argumentos pueden ser de 32 bits y otros de 64 bits, creo.De todos modos, si hace clic en el enlace al origen del encabezado que proporcioné, verá que la firma completa de cada llamada al sistema está allí. – Nemo

+0

No necesito tipos por ahora, así que puedo analizar la implementación de systrace. –

1

Hay llamadas al sistema con números variables de argumentos: atestigüe la llamada open() en el nivel C, donde el tercer parámetro es opcional (podría no ser opcional en el ensamblador) nivel).

Lo mejor que puede hacer es encontrar las llamadas al sistema identificadas por su nombre en syscalls.h en la fuente (preprocesada) de los otros encabezados del sistema. De ellos, puede contar la cantidad de argumentos. Solo obtener los encabezados correctos en su lugar podría ser complicado, y es posible que haya llamadas al sistema que nunca se expongan directamente como funciones C (no he querido ver, pero es bastante improbable).

Puede ver cómo otro depurador, como GDB, hace el mismo trabajo.

+0

probablemente usa información de enano ... –

+1

@ vext01: tal vez, pero no en plataformas sin DWARF, por lo que puede haber ideas que puedan usarse. Y la información DWARF tiene que venir de algún lado. –

2

ausyscall - un programa que permite que los nombres y números de llamadas al sistema de mapeo

1

This posterior merece la pena leer. Espero que esto ayude :)

Cuestiones relacionadas