Die Geschichte, wie der Autoplay Media Studio 8.5.3.0-Wasserkocher kaputt ging

Bild

Da es nicht schwer zu erraten ist, bin ich die Teekanne.

Neulich wollte ich mir die Quelle eines Dienstprogramms ansehen, das offensichtlich mit AMS-Tools erstellt wurde (.cdd-Datei neben .exe und ein paar lua * .dll). Vor ein paar Jahren habe ich ein Programm analysiert, das mit ähnlichen Mitteln erstellt wurde, und die Idee, .cdd zu packen, ein reguläres Zip-Archiv mit einem Passwort, ist verfügbar. Nun, ohne zu zögern drückte ich AMSUnpacker und erhielt einen Fehler beim Auspacken. Nun, von diesem Moment an begann der Spaß ...

Der erste Gedanke, der mir einfiel, war, dass die Datei mit etwas anderem als UPX (das ich natürlich entpackt habe) gepackt war. Nun, ich habe es einfach nicht überprüft (DIE, Exeinfo PE, Nauz File Detector) und jeder überzeugt mich, dass es nicht gepackt ist. Nun, ich denke, ich werde die banale .exe mit Total Commander mit dem zuvor entpackten Programm und diesem vergleichen, und es stellte sich heraus, dass .exe sehr unterschiedlich ist (ich habe andere Programme auf AMS verglichen und der Unterschied bestand nur in einzelnen Bytes, tatsächlich in einem Passwort, das nur in Klartext geschrieben wurde .exe selbst und im Ressourcenteil). Es wurde klar, dass dies entweder eine modifizierte oder nur eine neue Version von AMS ist. Ich glaubte nur schwer an Letzteres und wusste (nun, ich dachte zuerst, dass ich es wusste), dass die Entwickler das Programm schon lange geschlagen hatten, begann aber nicht zu prüfen, ob es das war oder nicht, und es hätte kaum etwas gegeben.

Ich fing an, mich näher mit x64dbg zu befassen, mit denen ich auf "You" in der alten Version des Programms einen Ort gefunden habe, an dem das Passwort "gelesen" wird. Nachdem sie in der "neuen" Version mit demselben x64dbg gestöbert hatten, stellte sich heraus, dass sie nicht so unterschiedlich sind, aber es gibt einfach mehr Funktionen als in der alten. Ich habe einen ähnlichen Ort gefunden, an dem anstelle des begehrten Pushs <Adresse, an der das Passwort gespeichert ist> eine Art Bewegung <etwas dort> und mehrere Aufrufe einiger anderer Funktionen vorhanden waren und einige Zeilen unter dem Code dem in der alten Version ähneln.

Bild
(links ist die alte Version, rechts ist die neue)

Und hier war ich traurig, weil mein Debugger-Wissen eindeutig nicht ausreicht, um dies alles zu verstehen.
Es gab einen Gedanken - ein anderes ähnliches entpackbares Programm zu finden und dessen EXE-Datei zu vergleichen. Ein solches Programm wurde vom selben Autor gefunden wie das, das ich auspacken wollte. Und der Dateivergleich ergab das Ergebnis. Neben geringfügigen Unterschieden wurde ein ganzer Block verschiedener Daten gefunden:

Bild

Und die Freude, dass ich diesen einzigartigen Ort gefunden habe, an dem anscheinend das Passwort enthalten war, und die Enttäuschung, dass es eindeutig kein Passwort war, in der Form wie in früheren Versionen.

Es blieb nichts anderes übrig, als den Debugger zu verstehen. Das ganze "Problem" ist, dass ich den Assembler auf der Ebene mehrerer Befehle kenne, mit einer sehr oberflächlichen Darstellung dessen, was sie tun, und der Debugger selbst auf der Ebene mehrerer Videos, die auf Youtube angesehen werden, und mit wenig Erfahrung in der Verwendung, hauptsächlich mit der "Poke-Methode".

Nach einer Stunde Ausführen des Debuggers und unzähligen Neustarts fand ich irgendwie einen Ort, an dem die begehrten Bytes gelesen wurden, und wenig später fand ich einen Code, der diese Bytes manipuliert:

Bild

Es dauerte viel Zeit, um zu verstehen, was dort getan wurde.

Irgendwie habe ich herausgefunden, dass dies eine Art Chiffrierblock ist, in dem es zwei Tabellen gibt, eine ist ein verschlüsseltes Passwort, wobei das entsprechende Zeichen einfach die Position im zweiten Notizblock angibt.

Bild

Wenn Sie die Werte der unteren Tabelle durch die entsprechenden Werte aus der oberen Tabelle ersetzen, erhalten Sie im Allgemeinen ein Array von Bytes: 7B 10 DD 5A 4D 26 72 EE B2 2A 04 2B 6E F7 14 E2 F9 14 F8 9E 8A 99 28 AE B8 4B C0 D7 42 DA AD .

Für welche anderen eindeutigen Arrays von Bytes, bevor und nachdem ich das Passwort entschlüsseln musste, habe ich nicht verstanden, aber ich habe mich auch nicht wirklich damit befasst. Ich vermute, dass es einige Prüfsummen gibt ...

Und dann liegt es an Ihnen, es in einen String zu konvertieren und das geschätzte .cdd-Archiv mit diesem Passwort zu entpacken. Ein kleines Problem war, dass die resultierende Zeile nicht über Strg + C -> Strg-V in den Archivierer eingefügt werden konnte, weil Zeichen "brechen" in der Zwischenablage (insbesondere nicht in die Essenz eingetaucht). Das Auspacken ist nur programmgesteuert möglich. Glücklicherweise gibt es einige Kenntnisse über C # (deren Kenntnisstand sich im Allgemeinen nicht wesentlich vom Kenntnisstand des Debuggers unterscheidet) und wenig Erfahrung in der Untersuchung des Funktionsprinzips des zuvor erwähnten AMSUnpacker, der ebenfalls in C # geschrieben ist, und es ist nicht schwer zu erkennen, was es dort ist und wie.

Fast auf dem Knie stapelte er ein Dienstprogramm, um die Funktionsfähigkeit des zuvor untersuchten Algorithmus zu überprüfen, und voila, es funktioniert.

Sie können es hier herunterladen.

Bild

Das Programm erstellt ähnlich wie der zuvor erwähnte AMSUnpacker den Ordner extrahiert_cdd neben der EXE-Datei mit dem Inhalt des .cdd-Archivs.

Nachdem ich die begehrte .cdd-Datei erfolgreich entpackt hatte, stellte ich fest, dass dies die „neue“ Version (ab Ende 2018) von AMS 8.5.3.0 ist. Und auf der Website lesen sie über die neue Version: Feature: Verbesserte die Sicherheit der Datendatei der kommerziellen Version. . Nun, anscheinend hat es nicht sehr gut geklappt ...

Ich habe eine Frage an diejenigen, die wissen, dass ein solcher Algorithmus zum Ausblenden eines Passworts Teil eines Standardverschlüsselungsalgorithmus ist (ich meine, er ist jetzt in Programmen anwendbar und nicht historisch), oder haben die Entwickler höchstwahrscheinlich daran gedacht?

PS Ich weiß, dass es am einfachsten ist, den Quellcode für Lua-Programme (die AMS verwenden) über die gepatchte lua * .dll zu erhalten, die im Internet surfen und / oder über den externen Hook der Funktion lua_load () in derselben lua * .dll. Das ist alles was ich einmal getan habe. In dieser Situation war es ein rein sportliches Interesse, herauszufinden, wie man ein Passwort für .cdd bekommt. Und ich verstehe auch sehr gut, dass es unwahrscheinlich ist, dass jemand es braucht und keinen praktischen Wert hat.

Ich habe wahrscheinlich in Bezug auf die "Teekanne" übertrieben, weil Es gibt wenig Erfahrung im Programmieren und Umkehren, aber dies ist nur ein kleines Hobby "für mich" und es gibt nicht viel Zeit oder Lust, sich eingehend damit zu befassen.

PPS Dies ist mein erster Artikel über Habré, wahrscheinlich der erste dieser Art.

Source: https://habr.com/ru/post/de451524/


All Articles