Come inserire un comando LC_LOAD_DYLIB in un binario Mach-O (OSX)
Domanda
Sto cercando di patchare un pezzo diandonware con un po 'di codice.
Il software è basato sul carbonio, quindi non posso usare un InputManager (almeno, non credo di poterlo fare). La mia idea era quella di aggiungere un riferimento dylib all'intestazione mach-o e avviare un nuovo thread quando viene chiamata la routine di inizializzazione.
Mi sono distratto con l'intestazione mach-o usando un hexeditor per aggiungere il comando di caricamento appropriato (LC_ LOAD_DYLIB).
otool riporta ciò che mi aspetto di vedere, quindi sono abbastanza sicuro che il file sia formattato correttamente.
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
Tuttavia, l'avvio del binario mi dà il seguente errore
dyld: bad external relocation length
Tutto ciò che posso immaginare è che devo modificare le sezioni LC_ SYMTAB o LC_ DYNSYMTAB ...
Qualcuno ha qualche idea?
Soluzione
Non sono del tutto sicuro di ciò che stai cercando di realizzare, ma il modo più semplice per farlo è probabilmente quello di iniettare un thread nell'attività mach dopo l'avvio. Una grande fonte di informazioni su come fare questo (così come eseguire il codice per farlo) può essere trovata qui: http: // rentzsch .com / mach_inject / .
Alcuni avvertimenti di cui dovresti essere a conoscenza:
- la chiamata mach task_for_pid () necessaria per ottenere la porta mach per l'attività è ora privata e richiede l'autorizzazione per chiamare. La ragione di ciò è abbastanza evidente, ma se avevi intenzione di rilasciare qualcosa con il codice iniettato, dovresti esserne consapevole.
- Il codice verrà eseguito nello stesso spazio del processo dell'applicazione originale ma su un thread separato. Avrai quindi pieno accesso all'applicazione, tuttavia, se non è consapevole del thread, stai molto attento all'uso e alla manipolazione dei dati al di fuori del tuo codice iniettato. Ovviamente tutti i problemi con multithreading verranno amplificati qui perché il codice originale non è mai stato a conoscenza delle tue aggiunte.
Altri suggerimenti
La soluzione più semplice che non comporta l'applicazione di patch al file binario consiste semplicemente nell'utilizzare la variabile di ambiente DYLD_INSERT_LIBRARIES e quindi eseguire l'applicazione.
set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib
Suppongo che il motivo per cui il linker dinamico abbia segnalato un errore sia perché molti campi nel formato file Mach-O contengono indirizzi specificati come offset dall'inizio del file, quindi l'aggiunta di un altro comando load invaliderebbe ogni indirizzo. Ad esempio, vedi le voci symoff
e stroff
nella Riferimento al formato di file Mach-O ABI di Mac OS X .