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?

È stato utile?

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:

  1. 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.
  2. 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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top