2013-08-16 11 views
8

Znalazłem, że funkcja libsqlite3.dylib używa funkcji guarded_open_np do otwierania pliku bazy danych. Spojrzałem na open source sqlite3, nie było czegoś takiego. Więc na pewno Apple zmodyfikował go tak, aby używał guarded_open_np zamiast uniksowego open.Parametry guarded_open_np

Wiem, że guarded_open_np jest prywatnym API i nie znalazłem ani nagłówka, ani dokumentacji na jego temat. Chcę przechwycić (Cydia MSFunctionHook) na guarded_open_np, więc muszę wiedzieć, jakie są również parametry, a nie tylko nazwa funkcji.

odwrócić inżynierii libsqlite3.dylib użyciem IDA Pro, to jak to nazywa guarded_open_np:

sub_79c1c: 
push {r7, lr} 
mov r7, sp 
sub sp, #0x4 
mov r3, r1 
movw r1, #0xc57e 
movt r1, #0x0 
str r2, [sp, #0x4 + var_0] 
add r1, pc 
movs r2, #0xf 
blx imp___picsymbolstub4__guarded_open_np 
add sp, #0x4 
pop {r7, pc}  

Jednak to nadal nie jest jasne, jakie params to może potrwać. Doceniam wiele, jeśli istnieje jakaś oficjalna strona z podaniem guarded_open_np ze wszystkimi jej parametrami.

+3

Zgaduję, że wygląda na to, że UNIX jest otwarty (3): https://gist.github.com/CodaFi/7c73abd9dfb602dcc26e – CodaFi

+1

@Krypton, możesz go podłączyć do debuggera i sprawdzić zawartość zawartości rejestrów r0 ~ r3 (i czy wskazują na pamięć, zawartość pamięci) tuż przed instrukcją blx? Konwencje wywoływania zwykle używają r0 dla pierwszego argumentu, r1 dla drugiego itd. – Ncat

Odpowiedz

2

Z informacji, które tu są, nie wierzę, że będziemy w stanie udzielić solidnej odpowiedzi, chociaż CodaFi to dobra sugestia.

powiedział, że tu są pewne odniesienia, które mogą być pomocne w co daje narzędzia, aby dowiedzieć się:

Pierwsze, to pewnie już wiesz, ale dowiedzieć się o rejestrach i stosu.

W zestawie, aby wywołać funkcję, zwykle następuje coś, co nazywa się interfejsem binarnym aplikacji (ABI), który po prostu konfiguruje konwencje, takie jak miejsce, w którym funkcje oczekują ich argumentów (rejestry, stos itp.), Które rejestruje wywołanie funkcji, jest dozwolone zmienić i cetera.

Ponieważ jest to system iOS, powinieneś zobaczyć: Procedure Call Standard for ARM Architecture i iOS ABI Function Call Guide.

Patrząc na sekcję "Podstawowe wywołanie procedury standardowej" w pierwszym łączu powyżej, można stwierdzić, że wywołania funkcji oczekują, że ich pierwsze cztery argumenty będą znajdować się odpowiednio w rejestrach r0 ~ r4.

Tak więc, dla twojego dochodzenia, prawdopodobnie chcesz dowiedzieć się, co jest w tych rejestrach tuż przed rozgałęzieniem się na stub w guarded_open_np. XCode może wypluć zbiór pliku dla ciebie, i powinieneś być w stanie ustawić na nim punkty przerwania; następnie użyj komendy register read w llvm, aby wyświetlić całą zawartość rejestru (pamiętaj, że niektóre rejestry mogą zawierać tylko lokalizacje w pamięci, które chcesz sprawdzić za pomocą komend lldb memory read).

W celu jeszcze większego zagłębienia się w zespół iOS, polecam 3-częściowy blog Michaela Asha "Demontaż zespołu" 1, 2 i 3. Wtedy możesz polubić jego najnowszy post na ARM 64 bit updates. Są to zasoby nieformalne, ale pomagają szybko opanować proces skanowania i ogólnie wiedzieć, co się dzieje.

+0

Dziękuję Wilsonowi za materiały i referencje. Sądzę, że zajmie to trochę czasu, aby przetrawić materiał: D – Krypton

+0

@Krypton Dzięki za zasługę! Tak naprawdę się tego nie spodziewałem.Posty na blogu odwołują się do całkiem przyzwoitego miejsca startowego (referencje ABI i inne rzeczy są dość gęste, a nie do nauki). Jednakże, jeśli naprawdę chcesz poznać swoje rzeczy, to wolumin Randall'a Hyde'a, The Art of Assembly Language, jest wysoce polecaną lekturą. – Ncat