CJK Workbench
Arbeitsabläufe

Praktisches Reverse Engineering, Funktion für Funktion

03
Das Szenario

So fängst du mit praktischem Reverse Engineering an

Wähle eine kleine Funktion aus einem C-Programm, das du selbst kompiliert hast, und untersuche sie von der ersten Anweisung bis zum abschließenden return. Gesetze und Lizenzbedingungen unterscheiden sich je nach Land, nutze also nur deinen eigenen Code oder Übungsdateien. Vier Schritte folgen unten.

01

Öffne deinen Projektordner

Wähle einen Arbeitsordner mit deinem C-Quelltext, einer Kopie der kompilierten Datei und später dem exportierten Listing.

02

Exportiere ein Text-Listing

Lass Shell den Exportbefehl deines Disassemblers auf der Kopie ausführen oder speichere das Listing selbst, sodass das Ergebnis eine Textdatei ist.

03

Bitte um eine Erklärung

Bitte den Agenten, das Listing zu lesen und die Funktion Zeile für Zeile zu erklären, und speichere dann die Notizen mit write_file.

04

Prüfe die Antwort

Vergleiche die Notizen mit deinem Quelltext und dem Listing, lies den Diff in Ask first und teste das Ergebnis im Labor, wenn das legal ist.

Ein Lern-Listing zum Lesen

add_numbers.asm
; add_numbers.asm - teaching listing, x64 Windows
; Returns the sum of its first two integer arguments.
; Argument 1 arrives in ecx (low half of rcx).
; Argument 2 arrives in edx (low half of rdx).
add_numbers:
    mov eax, ecx    ; copy argument 1 into eax
    add eax, edx    ; add argument 2, the sum stays in eax
    ret             ; return to the caller, result in eax

Diese Funktion addiert zwei Ganzzahlen. Nach der Windows-x64-Konvention kommen die Argumente in ecx und edx an, die Summe entsteht in eax, und ret gibt die Kontrolle an den Aufrufer zurück.

Zwei Übungen für einen Reverse-Engineering-Kurs

Beginne mit einer Funktion, die du selbst geschrieben hast

Eine häufige Anfängerfrage lautet, wie man mit Assembler beginnt, und die Antwort ist eine Funktion, die du selbst geschrieben hast. Schreibe eine kurze C-Funktion, kompiliere sie und exportiere das Listing als Text. read_file öffnet das Listing, und der Agent erklärt jede Anweisung: welches Register welches Argument hält, was der Stack tut und wohin das Ergebnis zurückkommt. write_file speichert diese Erklärungen in notes/begin.md. In Plan only listet der Agent diese Schritte zuerst auf. Noch läuft nichts. Wechsle dann zu Ask first und lies den Diff vor jedem Speichern. Vergleiche zum Schluss die Notizen mit deinem Quelltext und teste die kompilierte Funktion, wenn es legal ist, im Labor.

Dokumentiere die Funktionen deiner eigenen Bibliothek

Eine gute Übung für das Reverse Engineering von APIs ist es, die Funktionen aufzulisten, die deine eigene Bibliothek bereitstellt, und festzuhalten, was jedes Argument bewirkt. Speichere die Liste der importierten und bereitgestellten Funktionen aus deinem eigenen Werkzeug als Text, dann findet der Agent mit grep jeden Aufruf einer Funktion und öffnet mit read_file die Zeilen darum. Er entwirft eine Tabelle in notes/api.md, und edit_file zeigt jede Änderung als Diff. Beginne mit einer Funktion. Dieselbe Methode hilft dir, zu rekonstruieren, wie dein eigener alter Code funktioniert hat. Der Agent kann sich bei einem Typ oder Zweck irren, vergleiche also jede Zeile mit deinem Quelltext und mit einem eigenen Test, bevor du sie annimmst.

CJK Workbench für Windows

Arbeite dein eigenes Beispiel durch

CJK Workbench herunterladen ↗