2013-08-16 16 views
8

Ho trovato che la funzione guarded_open_np è utilizzata da libsqlite3.dylib per aprire il file di database. Ho dato un'occhiata all'open source di sqlite3, non c'era nulla di simile. Quindi sicuramente Apple lo ha modificato per usare guarded_open_np invece di open di Unix.Parametri di guarded_open_np

So che guarded_open_np è un'API privata e non ho trovato né l'intestazione né la documentazione su di esso. Voglio intercettare (Cydia's MSFunctionHook) su guarded_open_np, quindi ho bisogno di sapere anche quali sono i parametri, non solo il nome della funzione.

I reverse-engineering libsqlite3.dylib usando IDA Pro, ecco come si chiama 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}  

Tuttavia, non è ancora chiaro che cosa params potrebbe richiedere. Apprezzo molto se c'è qualche sito ufficiale che menziona guarded_open_np con tutti i suoi parametri.

+3

La mia ipotesi migliore è che sembra aperta di UNIX (3): https://gist.github.com/CodaFi/7c73abd9dfb602dcc26e – CodaFi

+1

@Krypton Vuoi essere in grado di agganciare questo in un debugger e verificare ciò che il contenuto dei registri r0 ~ r3 (e se puntano alla memoria, il contenuto della memoria) subito prima dell'istruzione blx? Le convenzioni di chiamata di solito usano r0 per il primo argomento, r1 per il secondo ecc. – Ncat

risposta

2

Dalle informazioni che sono qui, non credo che saremo in grado di dare una risposta solida, anche se CodaFi è un buon suggerimento.

Detto questo, qui alcuni riferimenti che possono essere utili nel dare gli strumenti per scoprire se stessi:

primo luogo, probabilmente già sapete, ma conoscere i registri e lo stack.

In assembly, per chiamare una funzione si segue in genere qualcosa chiamata Application Binary Interface (ABI) che imposta solo convenzioni come le funzioni in cui si aspettano i propri argomenti (registri, stack ecc.) Che registra una chiamata di funzione è consentita cambiare e cetera.

Poiché questo è iOS, si dovrebbe guardare lo Procedure Call Standard for ARM Architecture e lo iOS ABI Function Call Guide.

Guardando la sezione "Standard di procedura di base standard" nel primo collegamento sopra, è possibile dire che le chiamate di funzione prevedono che i loro primi quattro argomenti siano nei registri r0 ~ r4, rispettivamente.

Quindi, per la tua indagine, probabilmente vorrai scoprire cosa c'è in questi registri subito prima della diramazione in guarded_open_np stub. XCode può sputare per te l'assemblaggio di un file e dovresti essere in grado di impostare punti di interruzione su di esso; quindi utilizzare il comando register read in llvm per visualizzare tutti i contenuti del registro (alcuni dei registri potrebbero contenere solo posizioni di memoria che si desidera esaminare con i comandi lldb memory read).

Per scavare un po 'di più nell'assembly iOS, consiglio il post di Mike Ash in 3 parti "Disassemblare l'assieme" parti 1, 2 e 3. Quindi ti potrebbe piacere il suo recente post su ARM 64 bit updates. Queste sono risorse informali ma ti aiutano a fare i conti rapidamente con l'assemblaggio di scansione e sapere in generale che cosa sta succedendo.

+0

Grazie a Wilson per i materiali e i riferimenti. Immagino che ci vorrà un po 'di tempo per digerire il materiale: D – Krypton

+0

@Krypton Grazie per il credito! Non me lo aspettavo davvero.I post del blog citati sopra sono in realtà un luogo di partenza abbastanza decente (il riferimento ABI e il materiale è piuttosto denso e non proprio per l'assemblaggio di apprendimento). Tuttavia, se vuoi veramente conoscere le tue cose, allora il tomo di Randall Hyde, The Art of Assembly Language è una lettura altamente raccomandata. – Ncat