JNI proguard Verschleierung
Ich habe ein problem mit der Verschleierung. Für eine bessere Vorstellung:
JAVA-CODE
class JniTest...
public void test()
{
//some code
}
public void runJniCode()
{
//here I call native code
}
NATIVE CODE
JNIEXPORT void JNICALL
Java_path_to_class_test(JNIEnv* env, jobject obj)
{
//here I call test method from Java
}
Alles funktioniert gut, bis ich freigeben möchten eine verschleierte version. Der name der Java-Klasse (JniTest
zum Beispiel) und Methode test
in dieser Klasse werden umbenannt, indem proguard zu "a" und "a ()" " (dies ist nicht immer die gleiche), aber in native-code die ursprünglichen Namen der Methode und der Klasse bleiben, weil es hardcoded als string, wie:
jmethodID mid = env->GetMethodID(cls, "test", "someSignature");
... gibt es irgendeine Möglichkeit, den Namen der Methode, dynamisch?
- hey, hast du keine Lösung gefunden ?
- Nein, ich hatte zum ändern der Einstellungen der proguard zu halten diese Methode 🙁
Du musst angemeldet sein, um einen Kommentar abzugeben.
Während den Recherchen zu diesem genau das gleiche problem stieß ich auf eine Lösung, die ich denke, ist vernünftig. Leider ist die Lösung nicht automatisch verschleiern nativen Java-code und JNI-Methoden, wie verlangt, aber ich dachte immer noch, es wäre es Wert.
Zitat aus der Quelle:
Quelle: Verschleierung der JNI-Schicht,
Ich bin immer noch auf der Suche nach einem tool, das verschleiern nativen Java-code und die damit verbundenen JNI automatisch.
JNI unterstützt zwei Arten der Bindung von nativen Methoden. Die einfache erfolgt durch name, und kann nicht verwendet werden, für die obfuscated Klassen-und Methodennamen.
Andere Weise umfasst das aufrufen RegisterNatives von
JNI_OnLoad()
in Ihrer Bibliothek. Du msut bereiten Sie eine Tabelle von native methdos für jede Klasse, die für diese Technik:java:
c++:
Dieses kleine snippet zeigt, dass Sie können eigentlich ersetzen Sie den Namen mit den tatsächlichen verschleierte diejenigen, die von ProGuard. Der einfache Weg ist, zu Vertrauen, dass ProGuard Verschleierung ist deterministisch, und kopieren Sie manuell die Namen aus dem mapfile nach dem release Java build ist vorbei. Automatisierung erfordern Anpassungen des gradle-build, weil man normalerweise für C++ kompiliert wird, bevor Java, aber das ist möglich.
Wenn die verschleierte Methode bezieht sich auf einige Klassen, die Verschleierung Unterziehen, auch - die Aufgabe wird schwieriger.
Den großen Vorteil, RegisterNatives() für die Verbergung ist, dass nicht nur können Sie ändern Sie die Klasse und den Methodennamen, sondern auch die nativen Implementierungen von Methoden sind von außen nicht sichtbar, Ihr native Bibliothek. E. g. in dem obigen Beispiel, cnm ist
static
und ist nicht leicht erkennbar.