Frage:
Suchfunktion in einer abgespeckten dynamischen ELF-Bibliothek
SinOfficial
2018-12-29 07:09:54 UTC
view on stackexchange narkive permalink

Ich reverse derzeit eine Android-App zurück und diese App ruft eine Funktion namens "getUserInfo" in einer ARM 32-Bit-ELF-Bibliothek mit dem Namen "libcms.so" (von TikTok) auf. über die Java Native Interface.

Mein Problem ist: Die Funktion kann nicht mit readelf --syms libcms.so oder readelf - gefunden werden. -dyn-syms libcms.so , da libcms.so entfernt ist und die Funktion nicht in der Symboltabelle enthalten ist.

Die App kann diese Funktion aufrufen, daher weiß ich, dass die Funktion vorhanden ist. Wie finde ich die hexadezimale Position der Funktion?

Einer antworten:
0xec
2018-12-30 04:04:10 UTC
view on stackexchange narkive permalink

Es gibt zwei Möglichkeiten, wie Sie JNI -Funktionen deklarieren können.

Die erste ist die offensichtlichere Methode, mit der die JNI -Funktion einer bestimmten Namenskonvention wie JNIEXPORT void JNICALL Java_com_app_foo_bar folgen muss. Sie können solche Funktionen leicht mit readelf identifizieren.

Die andere nicht so offensichtliche Möglichkeit ist die Verwendung von RegisterNatives . Hier können Ihre Funktionen eine beliebige Signatur haben und müssen außerdem nicht aus der gemeinsam genutzten Bibliothek exportiert werden. Normalerweise rufen Sie RegisterNatives von JNI_OnLoad auf, um die nativen Funktionen zur Java-Laufzeit zu registrieren.

Für Ihre binäre libcms.so verwendet die zweite Methode.

RegisterNatives hat den folgenden Prototyp

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

Wenn Sie den Code von JNI_OnLoad analysieren, werden Sie auf den Aufruf RegisterNatives wie unten stoßen.

enter image description here

Das dritte Argument verweist auf ein Array von JNINativeMethod -Strukturen, das als

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

Das erste Element ist ein Zeiger auf eine nullterminierte Zeichenfolge, die den Funktionsnamen angibt. In Ihrem Fall sind jedoch alle Namen und Signaturen verschlüsselt.

enter image description here enter image description here

Diese werden entschlüsselt zur Laufzeit durch die Funktionsfamilie .datadiv_decodeXXXXXXXX . Der Abschnitt .init_array enthält Zeiger auf diese Entschlüsselungsfunktionen, was bedeutet, dass sie beim Start aufgerufen werden.

enter image description here

Das ist jedoch noch nicht alles. Die Binärdatei verwendet außerdem eine durchgehende Kontrollflussabflachung Verschleierung, sodass der Ausführungspfad möglicherweise nicht leicht erkennbar ist, wie unten gezeigt.

enter image description here

Um die Binärdatei zu analysieren, sollten Sie mit einem Tool wie Frida auf dynamische Analysetechniken zurückgreifen.

Lesen Sie weiter:

li> https://stackoverflow.com/questions/51811348/find-manually-registered-obfuscated-native-function-address
  • https: // stackoverflow. com / question / 1010645 / Was-macht-die-Registrierungsmethode-Methode
  • Wie werden im Abschnitt .ctors gespeicherte Informationen wiederhergestellt?
  • / ul>
    Ich verstehe nicht, kann es dynamisch geladen werden, um die Funktion zu bekommen oder trotzdem? oder verpasse ich den Punkt?
    @GinMay Um die Funktionsnamen zu entschlüsseln, können Sie die Funktionsreihe `.datadiv_decode` ausführen / emulieren.


    Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 4.0-Lizenz, unter der er vertrieben wird.
    Loading...