2011-06-04 14 views
5

He envuelto varias funciones de llamada al sistema como write(), open() etc y LD-PRELOAD se usa para anular las llamadas originales del sistema. Además, he definido algunas funciones más y he convertido esta biblioteca en una trituradora.Capturar una llamada al sistema justo antes de que el control ingrese a una biblioteca compartida

Me gustaría detectar todas las llamadas al sistema desde diferentes procesos de aplicación a estas bibliotecas compartidas antes de que entren en la biblioteca compartida. ¿Cómo puedo hacer eso?

Gracias

+1

Las llamadas al sistema son una cosa irrelevante, las llamadas a la biblioteca son otra. Es posible que desee ver el código fuente de las herramientas 'strace' amd' ltrace'. –

+0

@ n.m. un puntero útil. no lo pienso –

+0

Está mezclando cosas: la correspondencia entre las llamadas al sistema y los puntos de entrada API documentados (abrir, cerrar, etc.) no es 1: 1. – zvrba

Respuesta

0

estoy bastante seguro de que el único modo de hacerlo es mediante la modificación de la tabla de llamadas al sistema. Los sistemas HIDS (como Samhain) informarán sobre esto como una intrusión y los desarrolladores del kernel de Linux fruncen el ceño al respecto. Los detalles de implementación son muy específicos del sistema operativo (es decir, lo que funciona en FreeBSD no necesariamente funcionará en Linux), pero los detalles generales de implementación serán los mismos. Un módulo kernel podría ser una mejor manera de ir con API más limpias y estandarizadas.

4

LD_PRELOAD no es necesariamente una buena manera de intercalar llamadas al sistema, porque a) solo le permite interceptar llamadas de la biblioteca yb) solo le permite interceptar llamadas de la biblioteca. ;)

A) Aunque, en general, las llamadas al sistema están envueltas en su sistema, nadie le impide llamar al sistema usted mismo, por ejemplo, configurando el contenido del registro correcto y emitiendo INT 0x80 en un sistema x86. Si el programa que le interesa lo hace, nunca los detectará con la interposición de libc basada en LD_PRELOAD.

B) En general, la mayoría de los programas utilizan la biblioteca compartida en su sistema para realizar llamadas al sistema, a veces las aplicaciones están vinculadas estáticamente, lo que significa que el código libC es parte de la aplicación y no proviene de la biblioteca compartida. En tales casos, LD_PRELOAD tampoco ayuda.

Un comentario ya sugerido para usar strace/ltrace - mi consejo general sería echar un vistazo a ptrace() que ambas herramientas usan y que deberían darle lo que quiere sin la necesidad de modificar el kernel.

+0

@BjoernD ... gracias –

Cuestiones relacionadas