Einführung in die Verwendung von ProGuard

Wenn wir Java entwickeln, stoßen wir im Allgemeinen auf das Problem, wie wir den von uns entwickelten Code schützen können. Da die Java-Sprache auf JVM basiert, ist es sehr einfach, Klassendateien zu dekompilieren. Angenommen, wir erstellen ein Webprogramm und veröffentlichen dieses Webprogramm für Kunden. Tatsächlich ist es für Kunden sehr einfach, unseren Quellcode zu dekompilieren, einschließlich aller SRC-Dateien und JSP-Dateien usw.

Um unseren Quellcode zu schützen, sollten tatsächlich mehrere Methoden verwendet werden können: 1. Verwenden Sie einen Code-Obfuscator. 2. Überladen Sie den Klassenlader des Anwendungsservers. Für die erste Methode gibt es viele Open-Source-

Tools, die dies können Im Freien verwendet werden, ich persönlich denke, dass Proguard die beste Verwendung ist. Proguard ist vor allem einfach zu bedienen und leicht zu erlernen. Und es bietet viele Funktionen. Das Folgende ist eine kleine persönliche Erfahrung

(1): Laden Sie das Proguard-Tool aus dem Internet herunter. Das Proguard-Tool enthält hauptsächlich mehrere JAR-Dateien und einige Beispiele. Die Download-Adresse lautet http://proguard.sourceforge.net/

(2). Einige innerhalb der JAR-Datei in den Klassenpfad einfügen. Natürlich können Sie es nicht hinzufügen, aber bei der Verschleierung müssen Sie den Klassenpfad angeben, damit Sie während des Verschleierungsvorgangs (3) auf diese Klasse zugreifen und

eine Konfigurationsdatei schreiben können, hauptsächlich einige Parameter des Verschleierers. Das Folgende ist beispielsweise ein Beispiel
-injars platform.jar
-outjars platform_out.jar
-libraryjars <java.home>/lib/rt.jar
-libraryjars ibatis-common-2.jar
-libraryjars ibatis-dao-2.jar
- Bibliotheksjars ibatis -sqlmap-2.jar
-libraryjars junit-3.8.1.jar
-libraryjars d:/j2ee.jar
-libraryjars struts.jar
-libraryjars commons-lang.jar
-libraryjars D:/0working/coreproject/byislib/jasperreports-0.6.1.jar
-libraryjars commons -beanutils.jar

-printmapping proguard.map
-overloadaggressively
-defaultpackage ''
-allowaccessmodification
-dontoptimize
-keep public class *
{ public protected *; } -keep public class org.** -keep public class it.** Die Bedeutung jedes einzelnen Parameter Sehen Sie sich das Proguard-Dokument an, das sehr detailliert ist und den Einstieg erleichtert. An diesem Punkt ist die Code-Verschleierung abgeschlossen. Öffnen Sie das generierte JAR-Paket und Sie können sehen, dass es viele weitere Klassendateien wie a, b und gibt C. Zeigt an, dass das Verschleierungsergebnis erfolgreich war. Löschen Sie das ursprüngliche Glas und führen Sie das verwirrende Glaspaket aus. Alles ist normal! Häufig gestellte Fragen: Ich bin während der Nutzung auf mehrere Probleme gestoßen, und es hat am Anfang lange gedauert, sie zu lösen










a. Speicherüberlaufausnahme: Der Hauptgrund ist, dass Proguard bei der Verschleierung viel Speicher verbraucht. Daher können Sie beim Ausführen des Obfuscators den Speicher erhöhen, z. B. java -mx512m ..... b. Stapelüberlaufausnahme:
Vor allem wenn Proguard eine Verschleierung durchführt, werden einige Codes optimiert. Wenn es auf einige relativ komplizierte Methoden stößt, kann diese Ausnahme ausgelöst werden. Der Weg, damit umzugehen, besteht darin, den Konfigurationsparameter -dontoptimize zu erhöhen, wie im obigen Konfigurationsbeispiel gezeigt

. Bei der zweiten Methode ist das Prinzip der Überlastung des Klassenladers des Servers wie folgt. Zuerst verschlüsseln wir die Klassendatei mit einem bestimmten Algorithmus und schreiben dann unseren eigenen Klassenlader, um den Klassenlader des Servers zu ersetzen. Auf diese Weise können wir die Klassendatei lesen, sie durch unseren eigenen Algorithmus in die richtige Klasse entschlüsseln und sie dann erneut laden. Diese Methode wurde noch nicht angewendet. Ich erforsche sie derzeit und werde hier einige neue Ergebnisse zusammenfassen.


ProGuard ist ein Open-Source-Projekt, Homepage: http://proguard.sourceforge.net/, die neueste Version ist 4.11. Das Laden des Obfuscators ist sehr einfach: Entpacken Sie einfach proguard4.11.zip und wählen Sie dann das Proguard-Installationsverzeichnis auf der Registerkarte J2ME->Packing->Obfuscation aus. Wie in der Abbildung unten gezeigt, können Sie hier die Klassennamen konfigurieren, die während der Verschleierung beibehalten werden müssen. Der Name der MIDlet-Klasse muss beibehalten werden, damit die Java Runtime Environment (JRE) des Geräts den Einstiegspunkt für die Ausführung finden kann.
http://images.csdn.net/20050726/image027.jpg, Es geht um das obige Bild.



Ein weiteres Dokument
ProGuard ist ein kostenloser Dateikompressor, Optimierer und Obfuscator der Java-Klasse. Es kann nutzlose Klassen, Felder (Feld), Methoden und Attributwerte (Attribut) finden und löschen. Es optimiert außerdem den Bytecode und entfernt nutzlose Anweisungen. Schließlich werden Ihre Klassen-, Feld- und Methodennamen in einfache, bedeutungslose Namen umbenannt. Die JAR-Datei wird nach den oben genannten Vorgängen kleiner und lässt sich nur schwer rückentwickeln. Hier wird erwähnt, dass die Hauptfunktionen von ProGuard Komprimierung, Optimierung und Verschleierung sind. Im Folgenden werde ich zunächst diese Konzepte vorstellen und dann die grundlegende Verwendung von ProGuard vorstellen.

l Was ist Komprimierung?

Java-Quellcode (.java-Datei) wird normalerweise in Bytecode (.class-Datei) kompiliert. Komplette Programme oder Bibliotheken werden in der Regel komprimiert und als Java-Archive (.jar-Dateien) verteilt. Bytecode ist prägnanter als Java-Quelldateien, enthält jedoch immer noch viel nutzlosen Code, insbesondere wenn es sich um eine Bibliothek handelt. Die Minifier-Operation von ProGuard analysiert den Bytecode und entfernt nicht verwendete Klassen, Felder und Methoden. Programme behalten nur die funktionale Äquivalenz bei, einschließlich der Informationen, die für die Beschreibung des Ausnahmestapels benötigt werden.

l Was ist Verschleierung:

Normalerweise enthält der kompilierte Bytecode immer noch viele Debugging-Informationen: Quelldateiname, Zeilennummer, Feldname, Methodenname, Parametername, Variablenname usw. Diese Informationen erleichtern die Dekompilierung und das Reverse Engineering des gesamten Programms. Manchmal ist es widerlich. Verschleierer wie ProGuard können diese Debug-Informationen entfernen und alle Namen durch bedeutungslose Zeichenfolgen ersetzen, was das Reverse Engineering sehr erschwert, was den kostenlosen Code weiter vereinfacht. Mit Ausnahme von Klassennamen, Methodennamen und Zeilennummern, die für Informationen zum Ausnahmestapel erforderlich sind, behalten Programme nur funktionale Äquivalenz bei. Durch das obige Verständnis sollten Sie verstehen, warum Sie verwirrt sein müssen.

l ProGuard unterstützt diese Art von Optimierungen:

Zusätzlich zu den nutzlosen Klassen, Feldern und Methoden, die bei der Komprimierung gelöscht werden, kann ProGuard auch Leistungsoptimierung auf Bytecode-Ebene bereitstellen. Die internen Methoden sind: ²

Auswertung konstanter Ausdrücke

² Entfernen unnötiger Feldzugriffe

² Entfernen Sie unnötige Methodenaufrufe

² Entfernen Sie unnötige Verzweigungen

² Entfernen Sie unnötigen Vergleich und Instanz der Validierung

² Entfernen Sie nicht verwendeten Code

² Entfernen Sie schreibgeschützte Felder

² Entfernen Sie nicht verwendete Methodenparameter

² Verschiedene Vereinfachungen wie Push/Pop Verschiedene Gucklochoptimierungen²

Fügen Sie nach Möglichkeit statische und endgültige Modifikatoren zu Klassen hinzu²

Fügen Sie nach Möglichkeit private, statische und finale Modifikatoren zu Methoden hinzu²

Machen Sie get/set-Methoden nach Möglichkeit inline

² Wenn die Schnittstelle nur eine Implementierungsklasse hat, ersetzen Sie diese

² Löschen Sie selektiv den Protokollcode.

Der tatsächliche Optimierungseffekt hängt von Ihrem Code und der virtuellen Maschine ab führt den Code aus. Einfache virtuelle Maschinen sind effizienter als fortgeschrittene virtuelle Maschinen mit komplexen JIT-Compilern. Unabhängig davon wird Ihr Bytecode kleiner sein.

Es gibt immer noch einige offensichtliche Optimierungstechniken, die nicht unterstützt werden:

² Machen Sie nicht endgültige konstante Felder inline.

² Machen Sie andere Methoden wie get/set-Methoden inline.

² Verschieben Sie konstante Ausdrücke außerhalb von Schleifen.

² Optimierungen, die eine Escape-Analyse erfordern



ProGuard ist ein Befehlszeilentool und bietet eine grafische Benutzeroberfläche. Es kann auch in Verbindung mit Ant oder J2ME Wireless Toolkit verwendet werden. Die schlankeren JAR-Dateien, die über ProGuard abgerufen werden, bedeuten, dass nur weniger Speicherplatz benötigt wird; die Netzwerkübertragung ist weniger zeitaufwändig; das Laden ist schneller und nimmt weniger Speicherplatz in Anspruch. Darüber hinaus ist ProGuard sehr schnell und effizient, es benötigt nur wenige Sekunden und ein paar Megabyte Speicher, um das Programm abzuarbeiten. Die Reihenfolge seiner Verarbeitung ist zuerst Komprimierung, dann Optimierung und schließlich Verschleierung. Der Ergebnisteil stellt tatsächliche Zahlen für eine Reihe von Anwendungen dar. Der Hauptvorteil von ProGuard gegenüber anderen Java-Obfuskatoren ist vielleicht seine einfache Konfiguration auf Basis von Vorlagendateien. Ein paar intuitive Befehlszeilenoptionen oder eine einfache Konfigurationsdatei reichen aus. Beispielsweise schützt die folgende Konfigurationsoption alle Applets in der JAR-Datei:

-keep public class * erweitert java.applet.Applet

Benutzerhandbuch erklärt alle verfügbaren Optionen und demonstriert Ihnen diese leistungsstarken Konfigurationsoptionen anhand zahlreicher Beispiele.



Nachdem wir die vielen Vorteile von ProGuard oben erwähnt haben, schauen wir uns nun an, wie ProGuard im Programm verwendet wird. Es wurde auch erwähnt, dass ProGuard die Befehlszeile, die grafische Oberfläche, Ant usw. zum Ausführen und Verarbeiten des Programms verwenden kann Ich habe die Konfigurationsdatei erwähnt. Sehen wir uns an, wie man sie zusammen verwendet:

Der Befehl zum Ausführen von ProGuard in der Befehlszeile lautet wie folgt:

java –jar proguard.jar Optionen...

Spezifische Optionen finden Sie im ProGuard-Benutzerhandbuch kann diese Eigenschaften auch in die Konfigurationsdatei schreiben; beim Ausführen müssen wir nur diese Konfigurationsdatei angeben, zum Beispiel:

java –jar proguard.jar @config.pro

Das Format der Konfigurationsdatei sollte ebenfalls gemäß dem von ProGuard bereitgestellten Format geschrieben werden. Hierzu können Sie auf die Konfigurationsdatei im ProGuard-Beispiel zurückgreifen, um die für Ihr Anwendungssystem geeignete ProGuard-Konfigurationsdatei zu konfigurieren. ProGuard bietet ein Konfigurations- und Laufprogramm mit einer grafischen Oberfläche. Sie können die gewünschten Parameter auf der Oberfläche konfigurieren und es dann ausführen. Die oben genannten manuell zu schreibenden Konfigurationsdateien können auch über eine grafische Oberfläche konfiguriert und generiert werden.

Wenn Sie ProGuard in Ant ausführen möchten, fügen Sie einfach eines der folgenden Ziele hinzu:

<target name="proguard" depend="init">

<taskdef resources="proguard/ant/task.properties" classpath="=" lib. dir/proguard/proguard.jar"/><proguardconfiguration="��.����/��������/��������.����"/>< ������������������="{src.dir}/config.pro" />

</target>

Sie müssen nur lib.dir und src angeben. Das Dir-Attribut reicht aus. Ebenso wird hier auch die Proguard-Konfigurationsdatei verwendet, die mit der oben erwähnten identisch ist. Es wird empfohlen, ProGuardGUI als Assistenten zum Generieren von Konfigurationsdateien zu verwenden, sodass wir nur die Konfigurationsdatei ändern müssen, ohne eine Konfigurationsdatei neu zu schreiben.

Wenn Sie denken, dass ProGuard nicht schlecht ist, dann fügen Sie es schnell zu Ihrem Projekt hinzu.





Das dritte Dokument
sollte nicht in der Open-Source-Community erscheinen, aber es ist tatsächlich ein Open-Source-Projekt, genau wie sein Name, Proguard, nämlich Program Guard (Programmschutz), das das Gegenteil von Open Source darstellt – Codeschutz .
  Als Hochsprache wie JAVA stellt das kompilierte Produkt nur ein Konzept relativ zum Quellcode dar. Obwohl der Bytecode nicht so einfach zu verstehen ist wie der Quellcode, ist eine Dekompilierung keineswegs unmöglich. Es gibt viele dekompilierte Produkte für JAVA, wie CAVAJ, JAD und so weiter. Was sollten Entwickler, die Code als Reichtum betrachten, angesichts des kontinuierlichen Aufkommens dekompilierter Produkte tun?
  Vor diesem Hintergrund entstand der Obfuscator. Da es unmöglich ist, die Dekompilierung vollständig abzulehnen, lassen Sie sie sie dekompilieren. Solange das Dekompilierungsergebnis nicht direkt von anderen verwendet werden kann, ist das nicht in Ordnung? Solange der Code verwirrt ist, können andere die dekompilierten Ergebnisse nicht verstehen oder gar kompilieren.
  Es gibt viele Möglichkeiten zur Verwirrung, vor allem in den folgenden Aspekten.
Umbenennen, benennen Sie private Klassen, private Mitglieder und Variablennamen innerhalb des Methodenkörpers in a, b, c usw. oder sogar 1, 2, 3 um (im Code nicht zulässig ist nicht gleichbedeutend mit im Produkt nicht zulässig). B. die
Umkehrung der if-Bedingung, den Austausch von if/else-
äquivalentem Code, z. B. das Ändern der Schleife in GOTO
ungültigen Code, das Einfügen von nicht erreichbarem, nutzlosem Code.
  Proguard ist ein sehr guter Open-Source-JAVA-Obfuskator, der unter http zu finden ist :/ Heruntergeladen von /proguard.sourceforge.net/, lassen Sie mich jetzt einen Blick auf Proguard werfen.
  Nehmen Sie Version 3.2 als Beispiel, geben Sie das komprimierte Paket frei, wir sehen, dass es als Open-Source-Projekt Dokumente, lib, src, Beispielordner, hier werden sie nicht einzeln vorgestellt.
  Geben Sie das lib-Verzeichnis ein, dort befindet sich proguard.jar. Wenn Sie die Shell des Obfuscators oder als ANT-Plug-In verwenden möchten, verwenden Sie es. Einzelheiten finden Sie in der Dokumentation von Proguard.
  Was wir uns ansehen wollen, ist proguardgui.jar, die grafische Oberfläche von Proguard. Wir verwenden JDK, um es zu öffnen. Beachten Sie, dass es sich um JDK und nicht um JRE handelt.

Klicken Sie auf die Registerkarte Eingabe/Ausgabe, wählen Sie das zu verwechselnde JAR-Paket aus (beachten Sie, dass es sich um ein JAR-Paket handelt), geben Sie das JAR-Paket und alle verwendeten Klassenbibliotheken aus.
Klicken Sie auf die Registerkarte „Verschleierung“, wählen Sie die Klasse aus, die nicht verwechselt werden muss (die Klasse, die wiedergegeben werden soll, darf nicht verwechselt werden), klicken Sie auf die
Registerkarte „Verarbeiten“ und dann auf die Schaltfläche „Verarbeiten“ und warten Sie, bis das Ergebnis angezeigt wird.
Proguard umfasst auch die Funktionen der Codeoptimierung und Codeorganisation, die nicht im Rahmen dieses Artikels liegen. Wenn Sie interessiert sind, können Sie es selbst studieren.) Diese Methode wird
nur von Verschleierungsoptionen



verwendet. Wenn az verwendet wurde, wird dies der Fall sein Wechseln Sie zu aa.class, wie in der folgenden Konfiguration gezeigt. Schnittstelle
1,4,6,9,10,11,12

Quellcodepaket
org.zwm.pub;

öffentliche Klasse Bru { /** * @param args */ public static void main(String[] args) { // TODO Automatisch generierter Methoden-Stub System.out.println(showMsg()); } public static String showMsg() { return „You are my sun“; } } Dekompilierter Code // Dekompiliert von Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.















// Jad-Homepage: http://www.kpdus.com/jad.html
// Dekompileroptionen: packimports(3)

package org.zwm.pub;

import java.io.PrintStream;

public class Bru
{ public Bru() { } public static ;return "You are my sun"{ public static String PK0304140008000800fZ()}));({ void main(String args[])



















Noch ein Beispiel, ich hoffe, es hilft allen:

Führen Sie in der Befehlszeile den ProGuard-Befehl aus: java -jar proguard.jar @proguard.pro Die Datei proguard.pro enthält die angegebenen Verwirrungsinformationen.

Beispiel: Eine Swing-Anwendung:

-injars gimt.jar
-outjars gimt_out.jar
-libraryjars lib/rt.jar
-libraryjars lib/antlr/antlr-2.7.5H3.jar
-libraryjars lib/cglib/cglib-full-2.0.2. jar
-libraryjars lib/db2-connector/db2jcc_license_cu.jar
-libraryjars lib/dom4j/dom4j-1.5.2.jar
-libraryjars lib/encache/ehcache-1.1.jar
-libraryjars lib/hibernate/hibernate3.jar
-libraryjars lib/jakarta -common/commons-beanutils.jar
-libraryjars lib/log4j/log4j-1.2.9.jar
-libraryjars lib/mysql-connector/mysql-connector-java-3.0.17-ga-bin.jar
-libraryjars lib/spring/ spring.jar
-libraryjars lib/db2-connector/db2jcc.jar
-libraryjars lib/jakarta-common/commons-collections-2.1.1.jar
-libraryjars lib/jakarta-common/commons-dbcp-1.2.1.jar
-libraryjars lib/jakarta -common/commons-lang-2.0.jar
-libraryjars lib/jakarta-common/commons-logging-1.0.4.jar
-libraryjars lib/jakarta-common/commons-pool-1.2.jar
-libraryjars lib/spring/spring- mock.jar
-libraryjars lib/j2ee/jta.jar
-libraryjars lib/db2-connector/db2java.zip

-printmapping proguard.map
-overloadaggressively
-defaultpackage ''
-allowaccessmodification
-dontoptimize

-keep public class com.wisdom.tool.MainFrame {     public static void main(java.lang.String[]);

}

-keep class * erweitert javax.swing.plaf.ComponentUI {     public static javax.swing.plaf.ComponentUI createUI(javax.swing.JComponent); } -keep public class com.wisdom.model.user.* {     *; } -keep public class com.wisdom.service.* {     *; } -keep public class com.wisdom.service.impl.MenuServiceImpl Eine kleine Erklärung: 1. Die Option -dontoptimize wird am Anfang nicht hinzugefügt, manchmal kann es zu Problemen kommen , wie oben erwähnt. 2. Alle abhängigen .jar-Pakete werden aufgelistet. 3. Die Option „Keep“ teilt Proguard mit, dass diese nicht verwechselt werden müssen.     a. Bei Swing-Anwendungen darf die Eingabe des gesamten Programms nicht verwechselt werden.     b. Bei von ComponentUI geerbten Klassen kann createUI nicht verwechselt werden.     c. Verwenden Sie das Dienstobjekt des Domänenobjekts von Hibernate, da der Reflexionsmechanismus verwendet wird.



















Supongo que te gusta

Origin blog.csdn.net/oligaga/article/details/132661901
Recomendado
Clasificación