Disassemblern? Wie?



  • WDASM == W32DSM 😉



  • mal so nebenbei.

    Man kann auch mit dem normalen DOS-Debugger disassemblieren.

    Problematisch ist übrigens, dass ein Diassembler nur die Zahlen sieht.
    Deklarierte Texte werden ebenfalls als Befehlsfolge gewertet, was zu Fehlern führen kann..

    Hier der Ablauf des DEbuggens mit der debug.exe

    • 'debug Programm.exe' aufrufen
    • Befehl 'rcx' ausgeben und Wert merken
    • debug beenden (q)
    • 'debug Programm.exe > Programm.asm' aufrufen
    • Achtung: jetzt muss man durch die Umleitung blind schreiben
    • 'u 0100 ' und den Wert von rcx + 0100(hex) dahinter schreiben
    • debug beenden (q)
    • die erste und die letzte Zeile können gelöscht werden

    Klar ist das nur eine Notlösung, aber es funktioniert und außerdem hat jeder Windowsrechner/DOSrechner den debugger dabei 😃

    cYa
    DjR



  • Original erstellt von DocJunioR:
    **Klar ist das nur eine Notlösung, aber es funktioniert und außerdem hat jeder Windowsrechner/DOSrechner den debugger dabei 😃
    **

    Hm, also von Funktionieren war da nicht soviel bei mir zu sehen 🙄. Das mag bei 16-Bit-DOS-Exes ja ganz nett gehen, aber bei Win32-EXEs hat die Lösung verloren. Schon weil in 32-Bit Befehle anders codiert werden.



  • Ihr wisst ja das ihr nur EURE Programme dessamblieren dürft?

    MFG

    LordHoto



  • "Problematisch ist übrigens, dass ein Diassembler nur die Zahlen sieht.
    Deklarierte Texte werden ebenfalls als Befehlsfolge gewertet, was zu Fehlern führen kann.."

    Der IDA erkennt das ziemlich gut. Außerdem kann man diesem Disasm auch sagen ob eine Stelle Daten oder Code darstellt.
    Ist ja auch ein wenig antidebug, wenn man die Daten direkt zwischen den Code packt. Zum Beispiel kann man einen String ja auch so einer Windowsfunktion übergeben:

    call mylabel
    DB "thestring",0
    mylabel:
    

    Normalerweise sieht es ja eher so aus:

    mystring DB "thestring",0
    ...
    ...
    push offset mystring
    


  • Bei "debug" steht aber auch "Deassembler", wenn man "?" eingibt.

    Mir gefällt übrigens "W32dsm87"!

    P.S.: Nur mal so nebenbei: Bei "debug" kann man ja COM- Dateien erstellen, indem man Assembler- Programme mit einem Segment erstellt. Da muss man nach assemblieren "n name.com" eingeben, und dann "rcx", dann folgt die Angabe der Bytes. Was ist das überhaupt? Dann folgt übrigens ein "w" zum endgültigen erstellen des Programms.



  • rcx liest den Inhalt des Registers cx aus.
    debug speichert dort die Länge des Programms.

    zum Thema des 16 BIT - Debuggens und win32-Progs - ich sagte ja, dass das einige Macken hat 😉



  • Muss die Länge eine bestimmte Länge haben? 🙂



  • du musst die Anzahl Bytes angeben, die du wegschreibst.
    wenn Du nicht weißt, wieviel das sein muss, würd ich einfach immer das komplette segment wegschreiben (länge = feff, weil der scherz ja erst bei 0100 anfängt)

    an könnte übrigens theoretisch auch ganze exe-dateien schreiben. das muss man aber dann zu Fuß machen, also quasi den exe-Header selbst bauen.
    Die Größe ist auch kein Problem. debug kann eigentlich den gesamten Speicher verwalten...

    cYa
    DjR



  • Also hab mal bei debug folgendes probiert, um zu testen, obs geht:

    0100: jmp 0100
    0102: db "Hallo bei debug!", "$"
    mov ah, 9
    mov dx, 102
    int 21
    mov ah, 4c
    int 21

    dann muss ich die Bytes mit "rcx" schreiben:
    mach ich also FEFF. Wenn ich das Proggy aber dann erstelle läuft es zwar, kommt aber nicht einmal nach einer Ewigkeit das "Hallo bei debug!" (also es kommt nimmer).
    was hab ich falsch gemacht?


Anmelden zum Antworten