Domanda:
Trova la funzione in una libreria ELF dinamica spogliata
SinOfficial
2018-12-29 07:09:54 UTC
view on stackexchange narkive permalink

Al momento sto decodificando un'app Android e questa app chiama una funzione denominata "getUserInfo" in una libreria ELF ARM a 32 bit chiamata "libcms.so" (da TikTok) tramite Java Native Interface.

Il mio problema è: la funzione non può essere trovata con readelf --syms libcms.so o readelf - -dyn-syms libcms.so perché libcms.so è spogliato e la funzione non è contenuta nella tabella dei simboli.

L'app può chiamare questa funzione, quindi so che la funzione è lì. Come posso trovare la posizione esadecimale della funzione?

Una risposta:
0xec
2018-12-30 04:04:10 UTC
view on stackexchange narkive permalink

Ci sono due modi generali in cui puoi dichiarare le funzioni JNI .

Il primo è il modo più ovvio in cui la funzione JNI deve seguire una convenzione di denominazione specifica come JNIEXPORT void JNICALL Java_com_app_foo_bar . Puoi facilmente identificare tali funzioni usando readelf.

L'altro modo non così ovvio è usare RegisterNatives . Qui le tue funzioni possono avere qualsiasi firma e inoltre non devono essere esportate dalla libreria condivisa. In genere, dovresti chiamare RegisterNatives da JNI_OnLoad per registrare le funzioni native in Java Run-time.

Per il tuo binario libcms.so , utilizza il secondo metodo.

RegisterNatives ha il seguente prototipo

  jint RegisterNatives (JNIEnv * env, jclass clazz, const JNINativeMethod *, jint Methods);  

Se analizzi il codice di JNI_OnLoad ti imbatterai in una chiamata RegisterNatives come sotto.

enter image description here

Il terzo argomento punta a un array di strutture JNINativeMethod che è dichiarato come

  typedef struct {char * name; char * signature; void * fnPtr;} JNINativeMethod;  

Il primo membro è un puntatore a una stringa con terminazione nulla che denota il nome della funzione. Tuttavia, nel tuo caso tutti i nomi e le firme sono crittografati.

enter image description here enter image description here

Questi sono decrittografati in fase di esecuzione dalla famiglia di funzioni .datadiv_decodeXXXXXXXX . La sezione .init_array contiene puntatori a queste funzioni di decrittazione, il che implica che verranno chiamate all'avvio.

enter image description here

Tuttavia, non è tutto. Il binario utilizza anche Appiattimento flusso di controllo offuscamento, quindi il percorso di esecuzione potrebbe non essere facilmente distinguibile come mostrato di seguito.

enter image description here

Per analizzare il binario è meglio ricorrere a tecniche di analisi dinamica utilizzando uno strumento come Frida.

Ulteriori letture:

Non capisco, posso caricarlo dinamicamente ottenere la funzione o comunque? o mi manca il punto?
@GinMay Per decifrare i nomi delle funzioni è possibile eseguire / emulare la serie di funzioni `.datadiv_decode`.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 4.0 con cui è distribuito.
Loading...