2016-06-03 4 views
1

Unser kommerzielles Jar, das mit Batch-Dateien (java -jar ..) ausgeführt wird, wird mit unserer Signatur verteilt. Es ist NICHT ausgelöst mit JNLP. Es enthält auch zusätzliche Bibliotheken von Drittanbietern. Wenn eine böswillige Person eine Java-Klasse ersetzt, wird das JAR nicht mehr ausgeführt, weil die Signatur nicht übereinstimmt. Aber wenn er die MANIFEST Dateien aus dem Glas entfernt, gibt es keinen Check mehr. Wie können wir verhindern, dass das Programm ausgeführt wird, wenn eine Klasse ersetzt oder geändert wird? Eine Option könnte die Manifest-Dateien in der Java-Quelle überprüft werden, wie Verifying Jar Signature angegeben und How to verify a jar signed with jarsigner programmatically wieJava verhindert Manipulation von Zertifikatsdateien (Manifest) in JAR-Dateien

jarFile jar = new JarFile(new File("path/to/your/jar-file")); 

// This call will throw a java.lang.SecurityException if someone has tampered 
// with the signature of _any_ element of the JAR file. 
// Alas, it will proceed without a problem if the JAR file is not  signed at all 
InputStream is = jar.getInputStream(jar.getEntry("META-INF/MANIFEST.MF")); 
Manifest manifest = new Manifest(is); 

und Kontrolle auch die mitbeteiligten usw.

manifest.getCodeSigners(); 

Aber was passiert, wenn die Person, die versucht, zerbrich das Glas, führt Dekompilierung durch (mit jad zum Beispiel)? Um die Dekompilierung zu verhindern, haben wir einige Obfuscatoren angewendet, aber beim Dekompilieren können wir die Logik sehen, selbst wenn die Methodennamen geändert wurden. Also ist die Verschleierung nicht genug.

Was ist Ihr Vorschlag? Ist es eine gute Herangehensweise, den Zeichenprüfcode kompliziert zu schreiben, z. B. mit reflect api, mit verstümmelten Daten, Spagetti-Code mit goto, oder können Sie eine andere Vorgehensweise raten, um Manipulationen zu verhindern und Decompiler nicht erfolgreich zu machen? Ich habe die Optionen im Obfuscator überprüft, aber was können wir in der Code-Writing-Phase tun, um den Verschleierungsschritt zu verbessern und zu verstärken?

+1

Eine Sache, die ich getan habe, ist, meinen öffentlichen Schlüssel in den Code einzubetten und die Unterschriften mit diesem öffentlichen Schlüssel zu überprüfen. Wieder ist es nicht perfekt, nichts ist, aber es ist stärker, und es beruht auf dem Manifest und den Zertifikaten, die da sind. – EJP

Antwort

1

Solange ich weiß, gibt es bis jetzt keine perfekte Lösung für dieses Problem. Sie können lesen, das Problem ist ähnlich. Bis jetzt ist Verschleierung wahrscheinlich die beste + leichte Anstrengung. Ich meine, nicht nur mit dem Code-Obfuscator, sondern auch mit der komischen Logik, die den Algorithmus versteckt, damit der Cracker die Logik- und Methodenaufrufe nicht so leicht nachvollziehen kann.