Frage

Nun, ich stehe ein paar Inline-Baugruppen in Delphi und der Montage Crypto-Routine ist alles großartig, bis ich versuche, den Kurzstring in das Textfeld zu analysieren.

Die Verletzung, die ich bekomme, ist wie folgt: Fehler

Der vollständige Code ist hier:

generasacodicetagpre.

Wenn ich einen Haltepunkt auf der Linie "edit2.text:= tcaption (Key)" einfügen;Ich kann sehen, dass der Kurzschlüssel "Taste" tatsächlich ordnungsgemäß verschlüsselt wurde, aber auch mit vielen seltsamen Charakteren dahinter.

Die ersten 16 Zeichen sind die echte Verschlüsselung.

Verschlüsselung http://img831.imageshack.us/img831/365/29944312.png

generasacodicetagpre.

danke!

War es hilfreich?

Lösung

Was ist der Code

Für diejenigen von Ihnen, die keinen Assembler sprechen, ist der Code in Pascal wahrscheinlich, dass der Code dies wahrscheinlich tun soll. "Wahrscheinlich", weil das Original einige Fehler enthält:

generasacodicetagpre.

Mit Optimierungen, die eingeschaltet sind, ist der von diesem erzeugte Assembler-Code im Vergleich zum vorgeschlagenen Code tatsächlich kürzer, enthält keinen redundanten Code, und ich bin wettbereit, ist schneller. Hier sind ein paar Optimierungen, die ich im Delphi-generierten Code ( im Vergleich zu dem vom OP vorgeschlagenen Assemblercode) bemerkte:

    .
  • delphi hat die Schleife umgekehrt (Downto 0). Dies spart einen "CMP-Anweisungen, da der Compiler einfach" ESI "und der Schleife auf der Nullfahne" dec "kann.
  • Gebraucht "XOR EDX" und "Div EBX" für die zweite Division, spart einige winzige Zyklen.

Warum ist der bereitgestellte Assembler-Code, der fehlgeschlagen ist?

Hier ist der ursprüngliche Assembler-Code mit Kommentaren. Der Fehler ist am Ende der Routine an der Anweisung "CMP" - er vergleicht ESI in die Länge des Schlüssels, nicht auf die Länge des Namens. Wenn der Schlüssel länger ist, ist der Name, "Encryption" über den Namensgipfel, überschreibt das Zeug, das den Nullterminator für die Zeichenfolge überschreibt, wodurch der Debugger lustige Zeichen nach den richtigen Zeichen anzeigt).

Während des Überschreibens EBX und ESI ist nicht zulässig, dies ist nicht das, was den Code für AV verursacht, wahrscheinlich weil der umgebende Delphi-Code EBX oder ESI nicht verwendet wurde (gerade probiert).

generasacodicetagpre.

Meine 2 Cent-Ratschläge

Assembler sollte für Geschwindigkeitsoptimierungen und nichts anderes verwendet werden. Es sieht mir aus, als wollte der OP den Assembler verwenden, um zu verwenden, was der Code tut. Hat nicht geholfen, es dauerte nur ein paar Minuten, um genau herauszufinden, was der Code tut, und ich bin nicht einen Assembler-Experten.

Andere Tipps

Zunächst einmal müssen Sie EDI und ESI erhalten.Nur EAX, EDX und ECX, kann ohne Konservierung verwendet werden (außer wenn Sie es laden und es behalten müssen).

Versuchen Sie, etwas Push-EDI hinzuzufügen, drücken Sie ESI und POP ESI, POP EDI um Ihren Code herum.

Sie können die Register nicht einfach für Ihre eigenen Zwecke in Inline ASM mitnehmen, ohne den Registerinhalt zu erhalten (speichern und wiederherzustellen).

In Ihrem Code trampeln Sie über EAX (die "Self" hält) und EDX (welche - mit dem Standard-Convention-Convention Register anrechent - höchstwahrscheinlich "Sender").

Und wie ich es verstehe, können andere Register auch für lokale Variablen verwendet werden.

TIPP: Was ist, wenn ESI oder EAX oder was auch immer sich selbst hält?Ihr Assembler müllt es ab.Nächste Zeile, die Sie versuchen, Edit2 zu verwenden, was Zugang zu sich selbst erfordert, was ist ... Nun, nicht mehr bei uns.

Beide Compiler und Sie verwenden Register.Sie müssen nett spielen und mit Compiler zusammenarbeiten, was die Werte der Register speichern / wiederherstellen.

Andernfalls denke ich, dass Sie den Assembler-Code auslast, um die Routine zu trennen, sodass kein Pascal-Code vorhanden ist, der Register auch verwenden kann.HINWEIS, dass Sie weiterhin ein Anrufekonventionsprotokoll anpassen müssen: Nicht alle Register können frei verwendet werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top