Ich habe mich mit Namensverschleierung beschäftigt und kürzlich einiges über String-Verschlüsselung gelesen.
Der Verschleierungsschutz und die Verschlüsselungs-Shell verfügen über Funktionen zum Schutz der Zeichenfolgenverschlüsselung.
Generell lässt sich die String-Verschlüsselung in zwei Kategorien einteilen:
Die erste Kategorie ist die String-Verschlüsselungstechnologie zum Verschleierungsschutz. Die Hauptfunktion besteht darin, den Codeausführungspfad zu ändern.
Die von den meisten Tools zum Verschleierungsschutz verwendete Zeichenfolgenverschlüsselung fällt in diese Kategorie.
Die zweite Kategorie ist die String-Verschlüsselungstechnologie in Verschlüsselungs-Shells. Diese Methode verschlüsselt die Zeichenfolge in den Metadaten direkt, ohne den IL-Code zu ändern.
Diese Kategorie wird durch remotesoft und maxtocode repräsentiert.
Schauen wir uns zunächst die erste Kategorie an. Die Verschlüsselungsimplementierung sieht ungefähr wie folgt aus.
Vor der Verschlüsselung:
MessageBox.Show("Hello World!");
Nach der Verschlüsselung:
MessageBox.Show(Helper.Decode("A34579dfbbeyu346563345/=="));
Um es einfach auszudrücken: Wo ursprünglich Zeichenfolgen verwendet wurden, wird die direkte Verwendung von Zeichenfolgen in die indirekte Verwendung von Zeichenfolgen geändert.
Dabei verschlüsselt die Schutzsoftware die Zeichenfolge „Hellow World!“ und erhält das Ergebnis „A34579dfbbeyu346563345/==".
Helper.Decode ist eine von der Schutzsoftware bereitgestellte Entschlüsselungsfunktion, die „A34579dfbbeyu346563345/==" in „Hellow World!" wiederherstellt.
Da es sich um einen Verschleierungsschutz handelt, können wir den entschlüsselten Code analysieren und erhalten. Verwenden Sie dann direkt den Code dieser Funktion, um ein kleines Tool zu schreiben, das alle verschlüsselten Zeichenfolgen in der Assembly wiederherstellt. Generieren Sie eine String-Korrespondenztabelle. Um das Lesen und Debuggen von Code zu erleichtern.
Wenn Sie tiefer gehen, können Sie die ursprüngliche Anordnung der Saite automatisch wiederherstellen.
Schauen wir uns den IL-Code des obigen Beispiels an.
Vor der Verschlüsselung:
ldstr „Hallo Welt!“
Rufen Sie MessageBox.Show(string)
nach der Verschlüsselung auf:
ldstr "A34579dfbbeyu346563345/=="
Aufrufstring Helper.Decode(string)
den Aufruf MessageBox.Show(string)
wiederherstellt, ist eigentlich sehr einfach. Wir kennen den Dekodierungscode bereits und können den String bereits entschlüsseln. Die entsprechende Zeichenfolgentabelle wird erhalten.
Ändern Sie direkt
ldstr "A34579dfbbeyu346563345/=="
Aufrufstring Helper.Decode(string)
Ersetzen Sie es einfach durch
ldstr „Hellow World“
. Schreiben Sie einfach ein kleines Tool, das reguläre Ausdrücke zum Suchen und Ersetzen verwendet.
Die zweite Art des String-Verschlüsselungsschutzes:
Die Implementierung besteht darin, den String-Stream direkt in den Metadaten zu verschlüsseln.
Diese Art des Schutzes weist einen Fehler auf. Nach der Ausführung des Programms wird der String-Stream in den Metadaten entschlüsselt und vollständig im Speicher wiederhergestellt. In meinem vorherigen Artikel habe ich den Dump von Metadaten vorgestellt. Ich werde es hier nicht wiederholen.
Für den ersten Typ des String-Verschlüsselungsschutzes gibt es andere Formen. Beispielsweise kann die Funktion „Helper.Decode“ eine native Funktion sein.
Oder es wird mit dem Prozess vermischt.