2010-04-22 9 views

Odpowiedz

22

Odpowiedź zależy od tego, czy chcesz to zrobić we własnej aplikacji, czy w całym systemie. We własnej aplikacji jest to dość łatwe; dynamiczny linker zapewnia funkcje, takie jak DYLD_INSERT_LIBRARIES. Jeśli robisz to dla celów debugowania/oprzyrządowania, sprawdź także DTrace.

Można zastąpić implementacje metody Objective-C za pomocą metody swizzling, np. JRSwizzle lub Apple method_exchangeImplementations (10.5+).

Jeśli chcesz zmodyfikować zachowanie biblioteki na cały system, będziesz musiał załadować do przestrzeni adresowej innych procesów.

  • dwa mechanizmy załadowcze pierwotnie zaprojektowane do innych celów (input managers i scripting additions) są powszechnie wykorzystywane w tym celu, ale nie będę ich naprawdę polecam.
  • mach_inject/mach_override są zestawem bibliotek open-source do ładowania kodu i zastępowania implementacji funkcji, odpowiednio; jednak odpowiadasz za pisanie własnej aplikacji korzystającej z bibliotek. (Również spojrzeć na this answer; potrzebne są specjalne uprawnienia, aby wprowadzić kod do innych procesów.)

Proszę pamiętać, że wstrzyknięcie łatanie aplikacji/kod do celów innych niż debugowanie jest odradzane przez Apple, a niektóre Mac użytkownicy (i programiści) są niezwykle krytyczni wobec praktyki. Wiele z tej krytyki jest słabo poinformowanych, ale istnieje wiele źle napisanych "wtyczek" (szczególnie tych, które łatają Safari), które są zamieszane w awarie aplikacji i problemy. Kodeks obronny.

(Zastrzeżenie:. Ja jestem autorem jest (za darmo) moduł APE i aplikację, która wykorzystuje mach_inject)

+0

link jest martwy tam jest jakaś zmiana? Mówię o SDK –

+1

APE jest obecnie praktycznie nieobsługiwany i nie ma oficjalnego wydania dla kilku wersji systemu operacyjnego - twój najlepszy zakład to mach_inject. –

+0

'DYLD_INSERT_LIBRARIES' jest teraz ignorowane na El Capitan i wyżej dzięki SIP. – Qix

Powiązane problemy