Friday 27 January 2012

Wywołanie metody w iOS

Analizując pliki wykonywalne dla systemu iOS można zauważyć, że importowanych jest ograniczona liczba funkcji zewnętrznych a w kodzie wykonywalnym natomiast najwięcej jest odwołań do jednej funkcji objc_msgSend. Jest to związane z tym, że aplikacje dla iOS pisane są w języku Objective-C. Funkcja ta wykorzystywana jest do wysyłana wiadomości do obiektu. Poniżej fragment kodu w IDA Pro.


Funkcja ta przyjmuje, co najmniej dwa parametry: the Receiver – wskaźnik do instancji klasy, która otrzymuje wiadomość oraz theSelector wskazujący metodę, która obsłuży wiadomość. Funkcja może przyjąć też inne parametry, które są argumentami dla wywoływanej metody.

id objc_msgSend(id theReceiver, SEL theSelector, ...)

Z przedstawionego fragmentu wygenerowanego przez IDA Pro wyraźnie widać jaka metoda (kolor zielony) jest wywoływana za pomocą objc_msgSend oraz czy i jakie argumenty są do niej przekazywane (kolor niebieski).
Należy dodać, że IDA Pro rozpoznaje też zadeklarowane przez programistę metody dla klasy (rysunek poniżej).


Powyższe informacje, to pierwszy krok w celu zrozumienia działania aplikacji. Możemy odtworzyć metody klasy (znak +) i metody instancji dla klasy (znak -). Możemy też odtworzyć listę argumentów dla klasy (o tym w następnym artykule). W końcu możemy również odbudowywać kod źródłowy programu. Z przedstawionego na początku fragmentu kodu wynika, że fragment funkcji main jest następujący:

MojaKlasa * objekt_MojaKlasa = [[MojaKlasa alloc] init];
[objekt_MojaKlasa metodaInstancji:@”Input z main.m”];
[MojaKlasa metodaKlasy];