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.
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.
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.
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.
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>