2011-02-03 13 views
11

¿Cómo puedo, en tiempo de ejecución (no LD_PRELOAD), interceptar/enganchar una función C como fopen() en Linux, a la Detours para Windows? Me gustaría hacer esto desde Python (por lo tanto, supongo que el programa ya está ejecutando una máquina virtual CPython) y también volver a enrutar al código de Python. Estoy bien con solo enganchar funciones de biblioteca compartida. También me gustaría hacer esto sin tener que cambiar la forma en que se ejecuta el programa.¿Cómo interponer dinámicamente las funciones C de Python en Linux (sin LD_PRELOAD)?

Una idea es rodar mi propia herramienta basada en ptrace(), o en volver a escribir código que se encuentra con dlsym() o en el PLT, y la orientación ctypes funciones -generated C-exigible, pero pensé que pediría aquí en primer lugar. Gracias.

+0

¿Cómo lo harías * con * LD_PRELOAD? –

+0

Tendrá que escribir un módulo nativo para hacer el trabajo de bajo nivel para usted. Incluso si logra acceder y modificar el PLT de Python (que probablemente sea posible), necesitará un código para iniciar la máquina virtual de Python. –

+1

@Matt Joiner: Por cierto, usted hace su pregunta, entiendo que no le gusta algo que dije, en cuyo caso sería productivo/constructivo si pudiera ser más específico. Pero en caso de que en realidad solo lo estuvieras preguntando, así es como haces la función de interposición de forma no dinámica: http://stackoverflow.com/questions/426230/what-is-the-ld-preload-trick (y, sí, yo ' he aplicado esto muchas veces antes) – Yang

Respuesta

2

google-perftools tiene su propia implementación de Detour bajo src/windows/preamble_patcher*. Esto es solo de Windows en este momento, pero no veo ninguna razón para que no funcione en ninguna máquina x86, excepto por el hecho de que usa las funciones de win32 para buscar direcciones de símbolos.

Un análisis rápido del código y veo estas funciones de Win32 utilizados, todos los cuales tienen versiones de Linux:

  • GetModuleHandle/GetProcAddress: obtener la dirección de la función. dlsym puede hacer esto.
  • VirtualProtect: para permitir la modificación del conjunto. mprotect
  • GetCurrentProcess: GETPID
  • FlushInstructionCache (al parecer un nop acuerdo con los comentarios)

No parece demasiado difícil de conseguir este compila y se enlaza en Python, pero me gustaría enviar un mensaje a la los desarrolladores de Perftools y ven lo que piensan.

+0

¿Le interesa explicar qué ensamblaje se modifica? –

+0

Por favor, enlace al mencionado archivo fuente. –

+0

http://code.google.com/codesearch#BGeH2W13jNw/trunk/src/windows/preamble_patcher.cc&q=preamble_patcher%20package:http://gperftools%5C.googlecode%5C.com, las llamadas a la función win32 dejan algunas instrucciones al comienzo de cada llamada de función que se puede cambiar a un salto a la función que desee. – aaron

2

Encontrará una forma de hacerlo de uno de los desarrolladores de ltrace. Vea this post, que incluye un parche completo para atrapar la biblioteca cargada dinámicamente. Para llamarlo desde python, probablemente necesites crear un módulo C.

+0

Fantástico enlace, gracias. –

Cuestiones relacionadas