Assembler - Eine Verständnissfrage



  • Hi,

    ich habe nun schon einige Erfahrung mit C++ und wollte mal tiefer gehen, um mein
    Verständnis, was die CPU genau macht und wie Maschinencode aussieht, zu erweitern.
    Ich habe mir im Internet einiges angeschaut. Unter anderem "Assembler-Programmierung für x86-Prozessoren"
    von Wikibooks.org. Soweit komme ich auch damit klar, nur bei der Sache mit Texten habe ich ein Verständnissproblem.
    Ich habe einfach mal ein kleines C++-Programm geschrieben, deren exe ich mit W32Dasm dissassembled habe. Um genauer auf mein Problem einzugehen,
    hier mal ein Beispiel aus der exe:

    * Reference To: User32.MessageBoxA. Ord:020Eh
    
    :004011F7 FF1508314000          Call dword ptr [00403108]
    :004011FD 5E                    pop esi
    :004011FE 5F                    pop edi
    :004011FF B801000000            mov eax, 00000001
    :00401204 5B                    pop ebx
    :00401205 8BE5                  mov esp, ebp
    :00401207 5D                    pop ebp
    :00401208 C21000                ret 0010
    

    Soweit ich es verstanden habe, holt pop das erste "Wort" vom "Stapel" und überträgt es in den Zieloperanden.
    mov kopiert den Inhalt des rechten Operanden in den linken.
    ret nimmt den Befehlszeiger vom Stapel und führt das auf dem Call-Befehl folgende Kommando aus.

    Sagt mir bitte, falls ich die Befehle falsch verstanden habe, danke!

    So, jetzt zu meiner eigentlichen Frage. Wie und/oder Wo kann ich erkennen/herausfinden, was für ein Text beim MessageBox-Aufruf verwendet wurde?

    Hoffe ihr versteht meine Frage.

    Und nochwas, bei Call steht ja am Ende ...00403108...! Kann mir jemand genauer erklären, wohin das führt?
    Die exe geht nur bis zu 004023F9. Würde das gerne Verstehen.

    Danke, an alle, die bis hierhin gelesen haben 🙂 Hoffe ihr könnt mir helfen!



  • ich hab ne Frage schrieb:

    So, jetzt zu meiner eigentlichen Frage. Wie und/oder Wo kann ich erkennen/herausfinden, was für ein Text beim MessageBox-Aufruf verwendet wurde?

    Dafür wäre der Ausschnitt vor dem Call interessant. Parameter werden grundsätzlich über Register und/oder dem Stack übergeben. Laut Wikipedia ist das bei der WinAPI in umgekehrter Reihenfolge über den Stack.

    Wenn es sich um einen festen Text handelt, steht dieser in der Regel in der Data Section der Executable. Es wird dann entsprechend die Startadresse gepusht. Das Ende des String kann der Verwender selber herausfinden, da dieser Nullterminiert ist.

    ich hab ne Frage schrieb:

    Und nochwas, bei Call steht ja am Ende ...00403108...! Kann mir jemand genauer erklären, wohin das führt?
    Die exe geht nur bis zu 004023F9. Würde das gerne Verstehen.

    Die Adresse dürfte auf die import section der Executable verweisen. Wenn die Executable geladen/gestartet wird, trägt das Betriebssystem dort ein wo sich die verwendeten DLL Funktionen befinden. Ich weiß es zwar nicht 100%ig, denke aber das dort ein einfaches "jmp HierIstDieFunktionWirklich" eingetragen wird.



  • Dafür wäre der Ausschnitt vor dem Call interessant...

    Was meinst du genau? Vor dem MessageBox-Block stehen die anderen Funktionen.

    Wenn es sich um einen festen Text handelt, steht dieser in der Regel in der Data Section der Executable.

    Danke, das hat mir Google auch angedeutet. Kannst du mir damit weiterhelfen? Hier kurz mehr Info:

    Code Offset = 00000400. Code Size = 00001400
    Data Offset = 00002600. Data Size 0 00000200
    

    Beginnt die Data-Section an der Adresse in Verbindung mit dem Data-Offset? Wie kann ich deren Position bestimmen? Muss ich mit dem Program Entry Point arbeiten?

    Kann ich da mit einem HexEditor an den Text herankommen? Doch da ist das Problem, das man da nach Text suchen kann.
    Ich möchte aber nicht suchen, indem ich den gewünschten Text eingebe.



  • Kann mir denn wirklich keiner weiterhelfen?



  • ich hab ne Frage schrieb:

    Kann mir denn wirklich keiner weiterhelfen?

    Bei folgendem C-Konsolen-Beispielprogramm:

    #include <windows.h>
    int main(void)
    {
    	MessageBox (0,"Massage?","Massage-Titel",MB_OK);
    	return 0;
    }
    

    würde der enstsprechende Output von W32Dasm wie folgt lauten:

    ...
    :00401003 6A00                    push 00000000
    :00401005 6818614000              push 00406118
    :0040100A 6828614000              push 00406128
    :0040100F 6A00                    push 00000000
    
    * Reference To: USER32.MessageBoxA, Ord:020Eh
                                      |
    :00401011 FF15E0604000            Call dword ptr [004060E0]
    :00401017 33C0                    xor eax, eax
    :00401019 5D                      pop ebp
    :0040101A C3                      ret
    ...
    

    Wie Du siehst, habe ich noch etwas hinzugenommen. Die 'push' gehören nämlich auch zum MessageBox-Aufruf. Das (erste) 'push 00000000' entspricht dem 'MB_OK' im C-Programm, das 'push 00406118' dem Titel, das 'push 00406128' dem Text und das (letzte) 'push 00000000' dem aktuellen HWND. Durch die Push's werden die Parameter auf den Stack geschoben, wo sie MessageBox später abholt. Du findest den Text also an der Speicherstelle 0x00406128

    Das 004060E0 des Call-Aufrufs gehört zu einer Tabelle, in die Windows bei Programmstart die Sprungadressen zu den Betriebssystemaufrufen hineinschreibt. Der Sprung selbst ist indirekt, d.h.: Nimm den Wert, der in Speicherzelle 004060E steht und springe dahin.

    Diese Tabelle ist notwendig, da die EXE-Datei nicht weiß, wo sich die Betriebssystem-Funktionen später befinden werden.

    HTH
    viele grüße
    ralph

    EDIT: Die Angaben von W32Dasm beziehen sich auf das Programm, wie es im Speicher zu liegen kommt, nachdem Windows alle Header und Inhalte der EXE-Datei ausgewertet und verwurschtet hat. Mit diesen Angaben kannst Du nur noch sehr bedingt die Lage der Daten in der EXE-Datei bestimmen. Versuche Dich mal an einem PE-Viewer, z.B. PEBrowser (http://www.smidgeonsoft.prohosting.com/pebrowse-pro-file-viewer.html)



  • @rkhb
    Leider bin ich erst jetzt dazu gekommen, deine Antwort zu lesen. Erstmal ein riesen dank, für deine ausführliche beschreibung.
    Das mit push hatte ich schon gedacht, dass es etwas damit zu tun hat. Habe mir
    den PE-Viewer runtergeladen. Auf dem ersten Blick scheint er ja sehr komfortabel zu sein, danke für den Tipp.

    Eine Frage noch, kann man irgendwie den Inhalt der Adressen bei Push auslesen? Kommt man irgendwie da dran?



  • ich hab ne Frage schrieb:

    Eine Frage noch, kann man irgendwie den Inhalt der Adressen bei Push auslesen? Kommt man irgendwie da dran?

    Ich nehme dafür meist OllyDbg:

    http://www.ollydbg.de/

    Irgendwie ging das auch in W32Dasm, wenn man den Debugger zum Laufen gekriegt hat, ich weiß aber nicht mehr wie und hab jetzt keine Lust, mir das Tutorial zur Brust zu nehmen.

    Es gibt kein All-in-one-Swiss-Army-Knife für so etwas. Suche im Internet nach Tools (Disassembler, Debugger, Viewer, Logger, usw.) und stelle Dir ein Bündel von Programmen zusammen, mit denen Du selbst am besten umgehen kannst. Viel Nützliches findet man auch, wenn man sich durch die großen Programmpakete schnüffelt (z.B. Visual Studio oder Windows-SDK).

    viele grüße
    ralph



  • http://tuts4you.com/download.php?view.2876

    Lad dir mal die Tutorials Serie runter schau dir die ersten Videos an dann kannste zumindest schon etwas mit dem OllyDebugger machen.

    Hab gerade mal kurz gegoogelt:
    http://home.inf.fh-rhein-sieg.de/~ikarim2s/how2injectcode/code_inject.html

    Das Tutorial sieht ganz gut aus versuch es mal damit hinzubekommen. Ist echt nicht so schwierig.^^

    Du kannst natürlich selbst ein Programm schreiben welches die passenden Opcodes in die Exe schreibt. Das geht zur Laufzeit mit der Funktion WriteProcessMemory und ansonsten halt mit den normalen C/C++ Datei Operationen wie z.b. write. (Nicht vergessen die Datei im Binär Modus zu öffnen wenn du da mit write rumspielen willst allerdings musst du dann wissen wie die Maschienen Codes in Opcodes geschrieben werden naja und mit RVA und VA solltest du dich auskennen. Was das ist kann man hier lernen: http://msdn.microsoft.com/en-us/magazine/cc301805.aspx )


Anmelden zum Antworten