Verwenden Sie vlx-vmengine zur Entschleierung.

vlx-vmengine-jvm ist eine in Java implementierte Java-Bytecode-Ausführungs-Engine. Bitte beziehen Sie sich aufhttps://github.com/vlinx-io/vlx-vmengine-jvm für seine Nutzung.

Es gibt ein einfaches StückJavaCode wie folgt:

class HelloWorld {

    private String name = "";

    public HelloWorld(String name){
        this.name = name;
    }

    public void sayHi(){
        System.out.println("Hi, " + name);
    }

    public static void main(String[] args){
        
        String name = "George";
        HelloWorld hello = new HelloWorld(name);

        hello.sayHi();

    }

}

Nach dem Kompilieren in Klassendateien und der Verschleierung mit einem bestimmten Verschleierungsmotor werden die folgenden Dateien erhalten:

eine Klasse

Nach dem Öffnen mit jadx wurde festgestellt, dass abgesehen von demmain Funktion, alle anderen Informationen sind nicht erkennbar und die Zeichenfolgen wurden verschlüsselt.

image-20230521195209691

Auch wenn es verwirrt ist, sind die Grundstruktur der Klasse und die Bytecode-Informationen immer noch vorhanden. BenutzenClassVieweröffnena.class, können Sie die Methoden und Bytecode-Informationen der Klasse sehen. image-20230521200149593

Egal wie verschleiert wird, es kann den Code nur auf statischer Ebene verwirren und die Komplexität der Analyse erhöhen. Bei der dynamischen Ausführung muss noch die ursprüngliche Lauflogik des Programms wiederhergestellt werden. Verwenden von vlx-vmengine-jvm zum Ausführen des verschleierten Codes immainMit dieser Methode erhalten wir die folgende Ausgabe

2023-05-21 18:19:05 [DEBUG] LocalVars: [kotlin.Unit, kotlin.Unit, kotlin.Unit]
2023-05-21 18:19:05 [DEBUG] "L0: SIPUSH"
2023-05-21 18:19:05 [DEBUG] "push" 7144
2023-05-21 18:19:05 [DEBUG] "L3: SIPUSH"
2023-05-21 18:19:05 [DEBUG] "push" -13249
2023-05-21 18:19:05 [DEBUG] "L6: INVOKESTATIC"
2023-05-21 18:19:05 [DEBUG] "#20"
2023-05-21 18:19:05 [DEBUG] "class a, NameAndType(name='a', type='(II)Ljava/lang/String;')"
2023-05-21 18:19:05 [DEBUG] private static java.lang.String a.a(int,int)
2023-05-21 18:19:05 [DEBUG] "pop" -13249
2023-05-21 18:19:05 [DEBUG] "pop" 7144
2023-05-21 18:19:05 [DEBUG] 	Execute method: private static java.lang.String a.a(int,int)
2023-05-21 18:19:05 [DEBUG] 	Args: [7144, -13249]
2023-05-21 18:19:05 [DEBUG] "push" "George"
2023-05-21 18:19:05 [DEBUG] "L9: ASTORE_1"
2023-05-21 18:19:05 [DEBUG] "pop" "George"
2023-05-21 18:19:05 [DEBUG] "localVars[1] = George"
2023-05-21 18:19:05 [DEBUG] "L10: NEW"
2023-05-21 18:19:05 [DEBUG] class a
2023-05-21 18:19:05 [DEBUG] "push" InstanceToCreate(clazz=class a)
2023-05-21 18:19:05 [DEBUG] "L13: DUP"
2023-05-21 18:19:05 [DEBUG] "pop" InstanceToCreate(clazz=class a)
2023-05-21 18:19:05 [DEBUG] "push" InstanceToCreate(clazz=class a)
2023-05-21 18:19:05 [DEBUG] "push" InstanceToCreate(clazz=class a)
2023-05-21 18:19:05 [DEBUG] "L14: ALOAD_1"
2023-05-21 18:19:05 [DEBUG] "#1"
2023-05-21 18:19:05 [DEBUG] "push" "George"
2023-05-21 18:19:05 [DEBUG] "L15: INVOKESPECIAL"
2023-05-21 18:19:05 [DEBUG] "#47"
2023-05-21 18:19:05 [DEBUG] "class a, NameAndType(name='<init>', type='(Ljava/lang/String;)V')"
2023-05-21 18:19:05 [DEBUG] public a(java.lang.String)
2023-05-21 18:19:05 [DEBUG] "pop" "George"
2023-05-21 18:19:05 [DEBUG] "Execute new instance: public a(java.lang.String)"
2023-05-21 18:19:05 [DEBUG] "Args: [George]"
2023-05-21 18:19:05 [DEBUG] "pop" InstanceToCreate(clazz=class a)
2023-05-21 18:19:05 [DEBUG] "L18: ASTORE_2"
2023-05-21 18:19:05 [DEBUG] "pop" a@4612b856
2023-05-21 18:19:05 [DEBUG] "localVars[2] = a@4612b856"
2023-05-21 18:19:05 [DEBUG] "L19: ALOAD_2"
2023-05-21 18:19:05 [DEBUG] "#2"
2023-05-21 18:19:05 [DEBUG] "push" a@4612b856
2023-05-21 18:19:05 [DEBUG] "L20: INVOKEVIRTUAL"
2023-05-21 18:19:05 [DEBUG] "#54"
2023-05-21 18:19:05 [DEBUG] "class a, NameAndType(name='a', type='()V')"
2023-05-21 18:19:05 [DEBUG] public void a.a()
2023-05-21 18:19:05 [DEBUG] "pop" a@4612b856
2023-05-21 18:19:05 [DEBUG] 	Execute method: public void a.a()
2023-05-21 18:19:05 [DEBUG] 	Receiver: a@4612b856
2023-05-21 18:19:05 [DEBUG] 	Args: [a@4612b856]
Hi, George
2023-05-21 18:19:05 [DEBUG] "L23: RETURN"

Aus der Konsolenausgabe können wir sehen, dass das Programm sein ursprüngliches Verhalten wiederhergestellt hat, nämlich das DruckenHi, George. Gleichzeitig können wir anhand der Ausgabe auch feststellen, dass die Entschlüsselungsfunktion für Zeichenfolgen aktiviert istprivate static java.lang.String a.a(int,int)mit Parametern7144und-13249. Wenn wir weiterhin vmengine zum Debuggen verwendena.a(int,int) Mit dieser Methode können wir die von dieser Verschleierungs-Engine verwendete Zeichenfolgenverschlüsselungsmethode ermitteln.