Pregunta

Estoy buscando parchear una pieza de abandonware con algún código.

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 hilo cuando se llama a la rutina de inicialización.

He manipulado el encabezado mach-o usando 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, iniciar el binario me da el siguiente error

dyld: bad external relocation length

Todo lo que puedo suponer es que necesito modificar las secciones LC_ SYMTAB o LC_ DYNSYMTAB ...

¿Alguien tiene alguna idea?

¿Fue útil?

Solución

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

Algunas advertencias que debe tener en cuenta:

  1. la llamada mach task_for_pid () necesaria para obtener el puerto mach para la tarea ahora está privilegiada y requiere autorización para llamar. La razón de esto es bastante evidente, pero si estaba planeando lanzar algo con código inyectado, debería ser consciente de esto.
  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 reconoce los hilos, tenga mucho cuidado al usar y manipular datos desde fuera de su código inyectado. Obviamente, todos los problemas de subprocesos múltiples se amplificarán aquí porque el código original nunca tuvo conocimiento de sus adiciones.

Otros consejos

La solución más fácil 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

Supongo que la razón por la que el vinculador dinámico informó un error es porque muchos campos en el formato de archivo Mach-O contienen direcciones especificadas como un desplazamiento desde el comienzo del archivo, por lo que agregar otro comando de carga invalidaría cada dirección. Por ejemplo, vea las entradas symoff y stroff en las Referencia de formato de archivo Mac-X ABI Mach-O .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top