Ich habe einen [relativ komplexen] Java-Code in eine .class-Datei kompiliert und ihn dann mit jad wieder in Java dekompiliert. Natürlich war der Code verschleiert, was zu erwarten war. Da ich jedoch den Originalcode hatte, dachte ich, ich könnte den dekompilierten Code ziemlich einfach durchsehen. Ich habe jedoch Unterschiede im Code festgestellt, z. B. wo bestimmte Variablen definiert wurden (einschließlich Unterschiede im Umfang).
Gibt es einen Hauptgrund dafür? Ich stelle mir vor, dass dies eines der Dinge ist, die nur beim Dekompilieren von Code passieren, aber ich bin neugieriger, welche Faktoren die Änderung verursachen (z. B. Komplexität des Codes, ob er sich auf andere Dateien bezieht usw.).
Könnte mir jemand eine gute Erklärung geben, welche Faktoren die Unterschiede im Code vorher und nachher verursachen?
Bearbeiten
Technisch gesehen wird die .class-Datei aus einem Glas gezogen. Ich habe den Inhalt extrahiert und dort die .class-Datei verwendet.
Was den von mir verwendeten Obfuscator betrifft, habe ich den Retroguard-Obfuscator mit den folgenden Optionen verwendet (ich untersuche derzeit nur die Verschleierung und finde heraus, welche jeweils vorhanden sind Dies führt zum Endergebnis.):
.option Application.option Applet.option Repackage.option Annotations.option MapClassString.attribute LineNumberTable.attribute EnclosingMethod.attribute Veraltet
Die Dokumentation für das Skript finden Sie auf ihrer Website. Es ist ein wenig unorganisiert, aber Sie sollten in der Lage sein, angemessene Erklärungen zu finden. Es ist auch bemerkenswert, dass ich die Generika und die lokale Variablentabelle entfernt habe.
Ich habe jetzt auch eine Möglichkeit eingerichtet (inspiriert von den Entwicklern des Minecraft Coder Pack), die Quellen mithilfe von Daten aus einer Datei umzubenennen ( oder Dateien), die an ein Wörterbuch mit Listen für Pakete, Klassen, Methoden und Felder übergeben werden.
# Snippet aus der MCP-Version (meine ist etwas anders) (alle in Python): srg_types = {'PK:': ['obf_name', 'deobf_name'], 'CL:': ['obf_name', 'deobf_name'],
'FD:': ['obf_name', 'deobf_name'], 'MD:': ['obf_name', 'obf_desc', 'deobf_name', 'deobf_desc']} parsed_dict = {'PK': [], 'CL ': [],' FD ': [],' MD ': []}
Eine Zeile wird dann aus der Datei analysiert und an das parsed_dict und dann verwendet, um alles umzubenennen (hin und her). Implementiert nach dem Kompilieren als beim ersten Dekompilieren (nachdem ich Unterschiede festgestellt habe).