2008-11-07 5 views
7

Estoy buscando parchar una pieza de abandware con algún código.Cómo insertar un comando LC_LOAD_DYLIB en un binario Mach-O (OSX)

El software está basado en carbono, por lo que no puedo usar un InputManager (al menos, no creo que pueda). Mi idea era agregar una referencia dylib al encabezado mach-o, y lanzar un nuevo subproceso cuando se llama a la rutina de inicialización.

He perdido el tiempo con el encabezado mach-o utilizando un editor hexadecimal para agregar el comando de carga apropiado (LC_ LOAD_DYLIB).

otool informa lo que espero ver, así que estoy bastante seguro de que el archivo está formateado correctamente.

 
Load command 63 
      cmd LC_LOAD_DYLIB 
     cmdsize 60 
     name @executable_path/libAltInput.dylib (offset 24) 
    time stamp 1183743291 Fri Jul 6 19:34:51 2007 
     current version 0.0.0 
compatibility version 0.0.0 

Sin embargo, el lanzamiento de la binaria me da el siguiente error

 
dyld: bad external relocation length 

Todo lo que puedo adivinar que esto significa es que tengo que modificar las secciones LC_ SYMTAB o LC_ DYNSYMTAB ...

¿Alguien tiene alguna idea?

Respuesta

4

No estoy del todo seguro de lo que está tratando de lograr, pero la forma más fácil de hacerlo es, probablemente, inyectar un hilo en la tarea mach después de que comience. Una gran fuente de información sobre cómo hacer esto (así como también ejecutar el código para hacerlo) se puede encontrar aquí: http://rentzsch.com/mach_inject/.

Algunas advertencias que se deben tener en cuenta:

  1. el mach task_for_pid() llamada es necesaria para obtener el puerto de Mach a la tarea ahora es privleged y requiere autorización para llamar. La razón para esto es bastante evidente, pero si planeaba liberar algo con código inyectado, debe tener esto en cuenta.
  2. Su código se ejecutará en el mismo espacio de proceso que la aplicación original pero en un hilo separado. Por lo tanto, tendrá acceso completo a la aplicación; sin embargo, si no es consciente de los subprocesos, tenga mucho cuidado con el uso y la manipulación de datos desde fuera del código inyectado. Obviamente, todos los problemas multiproceso se amplificarán aquí porque el código original nunca fue consciente de sus adiciones.
+0

Genial. Este es un gran consejo. Para responderte, no, no estoy distribuyendo la aplicación. Lo estoy aplicando para mi uso personal, de modo que pueda usar un HID alternativo (casi he renunciado a la esperanza tanto en el distribuidor de la aplicación como en el fabricante del controlador para el HID). –

+0

Sí, acabo de leer su otra pregunta ... mach_inject es probablemente su mejor y más fácil apuesta aquí. –

2

La solución más sencilla que no implica parchear el binario es simplemente usar la variable de entorno DYLD_INSERT_LIBRARIES y luego ejecutar su aplicación.

set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib 

Asumo la razón que el enlazador dinámico informa de un error se debe a que muchos campos en el formato de archivo de Mach-O contienen direcciones especificadas como un desplazamiento desde el principio del archivo por lo que añadir otro comando de carga invalidaría todas las dirección. Por ejemplo, consulte las entradas symoff y stroff en el Mac OS X ABI Mach-O File Format Reference.

Cuestiones relacionadas