2008-11-07 13 views
7

Chciałbym załatać kawałek abandonware z jakimś kodem.Jak wstawić komendę LC_LOAD_DYLIB do pliku binarnego Mach-O (OSX)

Oprogramowanie jest oparte na węglu, więc nie mogę używać InputManager (przynajmniej, nie sądzę, że mogę). Moim pomysłem było dodanie referencji dylib do nagłówka mach-o i uruchomienie nowego wątku po wywołaniu procedury inicjalizacji.

Spełniłem się z nagłówkiem mach-o za pomocą hexeditora, aby dodać odpowiednie polecenie obciążenia (LC_ LOAD_DYLIB).

Oświadczenia o tym, czego oczekuję, więc jestem przekonany, że plik jest poprawnie sformatowany.

 
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 

Jednak uruchomienie pliku binarnego daje mi następujący błąd

 
dyld: bad external relocation length 

Mogę tylko zgadywać oznacza to, że trzeba zmodyfikować sekcje LC_ SYMTAB lub LC_ DYNSYMTAB ...

Ktoś ma jakieś pomysły?

Odpowiedz

4

Nie jestem do końca pewien, co próbujesz osiągnąć, ale najprostszym sposobem na to jest prawdopodobnie wstrzyknięcie wątku do zadania mach po jego uruchomieniu. Doskonałe źródło informacji na ten temat (jak również działający kod, aby to zrobić) można znaleźć tutaj: http://rentzsch.com/mach_inject/.

Pewne zastrzeżenia, które powinny być świadomy:

  1. MACH task_for_pid() nazywają to konieczne, aby uzyskać portu mach do zadania jest teraz privleged i wymaga autoryzacji, aby zadzwonić. Przyczyna tego jest całkiem oczywista, ale jeśli planujesz wypuścić coś za pomocą wstrzykniętego kodu, powinieneś być tego świadomy.
  2. Twój kod będzie działał w tym samym obszarze roboczym, co oryginalna aplikacja, ale w osobnym wątku. Będziesz mieć pełny dostęp do aplikacji, jednak jeśli nie jest to wątek, bądź bardzo ostrożny przy używaniu i manipulowaniu danymi spoza twojego wstrzykniętego kodu. Oczywiście wszystkie problemy wielowątkowe zostaną tutaj wzmocnione, ponieważ oryginalny kod nigdy nie był świadomy twoich dodatków.
+0

Świetnie. To świetna wskazówka. Aby odpowiedzieć, nie, nie rozpowszechniam aplikacji. Naprawiam to na własny użytek, aby móc używać alternatywnego HID (prawie straciłem nadzieję zarówno na dystrybutora aplikacji, jak i producenta sterownika dla HID). –

+0

Tak, właśnie przeczytałem twoje drugie pytanie ... mach_inject to prawdopodobnie twój najlepszy, najłatwiejszy zakład tutaj. –

2

Najprostszym rozwiązaniem, które nie wymaga łatania pliku binarnego, jest użycie zmiennej środowiskowej DYLD_INSERT_LIBRARIES, a następnie uruchomienie aplikacji.

set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib 

Jestem zakładając powód dynamiczny linker zgłosił błąd, ponieważ wiele pól w formacie Mach-O zawierają adresy podane jako przesunięcie od początku pliku więc dodanie kolejnego polecenia obciążenia będzie unieważnić każdy adres. Na przykład zobacz wpisy symoff i stroff w pliku Mac OS X ABI Mach-O File Format Reference.

Powiązane problemy