byOpen ist eine erweiterte Version der dlfunctions-Bibliothek, die die Einschränkungen mobiler Systeme umgeht.
vonOpen Features
Unterstützt das Laden und Verwenden der Android-Systembibliotheksschnittstelle in der App (auch wenn die Karten noch nicht geladen wurden).
Unter Android 7 und höher ist der Aufruf von dlopen und System.load eingeschränkt. Allerdings gibt es derzeit im Internet Bibliotheken wie Nougat_dlfunctions, die die Ladebeschränkungen umgehen, indem sie die so-Bibliothek aus Karten finden.
Diese Methode funktioniert jedoch nicht für die SO-Bibliothek in der App, die nicht in Karten geladen wurde.
ByOpen unterstützt nicht nur das Laden gefälschter Dlopen aus Karten, sondern kann auch das Laden von Bibliotheken, die noch nicht in Karten geladen wurden, unter Umgehung von Systembeschränkungen erzwingen, um ein universelleres Dlopen zu erreichen.
Hinweis: Die aktuelle Implementierungsmethode ist theoretisch relativ universell. Zumindest wurde sie auf meinem Android 10 getestet, sie wurde jedoch nicht vollständig im Detail getestet. Bitte bewerten Sie selbst, ob Sie sie verwenden sollten.
durchOffene verwandte Prinzipien
Das spezifische Implementierungsprinzip ist relativ einfach. Es basiert hauptsächlich auf der Idee und Implementierung einer einfachen Methode, um die Einschränkungen von Android P für Nicht-SDK-Schnittstellen zu umgehen.
Obwohl der Hauptzweck dieses Artikels darin besteht, die Hide-API zu umgehen, kann die darin verwendete Methode, die sich als Systemaufruf tarnt, auch mit System.loadLibrary verwendet werden, um dem System den Eindruck zu vermitteln, dass das System selbst System.loadLibrary aufruft.
Dadurch wird die Classloader-Namespace-Beschränkung von Android N umgangen, jede SO-Bibliothek im System/System/Lib wird in Maps geladen und dann wird Fake Dlopen für dlsym verwendet.
durchOffene Schnittstellennutzung
Die relevanten statischen Bibliotheken und Schnittstellen befinden sich in: dlopen.h
Die relevanten Verwendungsmethoden sind genau die gleichen wie beim nativen Dlopen
typedef by_char_t const* (*curl_version_t)();
by_pointer_t handle = by_dlopen("libcurl.so", BY_RTLD_LAZY);
if(handle)
{
by_pointer_t addr = by_dlsym(handle, "curl_version");
if (addr)
{
curl_version_t curl_version = (curl_version_t)addr;
by_print("curl_version: %s", curl_version());
}
by_dlclose(handle);
}