[C] jmp Funktionsname geht - jmp Adresse nicht



  • Hallo nochmal.

    Ich habe folgendes C Programm:

    void doNothing() // hier Haltepunkt für Debugger setzen
    {
    }
    
    int main()
    {
    	_asm
    	{
    		jmp doNothing
    	};
    }
    

    Das funktioniert: der Debugger-Haltepunkt wird angesprochen.
    (wenn man mit dem Debugger weiter durchläuft stürzt es natürlich ab, weil die Funktion nicht mit call aufgerufen wurde. Aber darum gehts hier nicht)

    Jetzt habe ich mir über die Disassembly im Debugger von Visual C++ die Adresse der Funktion rausgesucht:

    void doNothing()
    {
    [b]00411A20[/b]  push        ebp  
    00411A21  mov         ebp,esp 
    ...
    

    Wenn ich aber jetzt statt jmp doNothing ein jmp dword ptr cs:[00411A20h] mache, komme ich nicht am Haltepunkt an, sondern bekomme eine Zugriffsverletzung.

    Kann sich jemand vorstellen warum?



  • call dword ptr [pointer]



  • bzw

    DWORD der_pointer = (DWORD*) 0xdeadbeef;

    __asm
    {
    push argument
    call dword ptr [der_pointer]
    }



  • Wie man die Funktion richtig aufruft ist mir schon klar. 🙂

    Es ging mir aber in diesem Beitrag um die Unterschiede zwischen den beiden Jump-Verfahren.



  • erstmal siehe => hier
    Wenn du das ganze nun im VC++ benutzen willst, kannst du aber keinen FAR-Jump nehmen, da du hier dein Segment nicht einfach so wechseln darfst. 😉

    Dann vielleicht noch eine Erklaerungen zur Funktionsweise des jmp-Befehls:
    Das Dingens verwendet bei NEAR Jumps mit direkt angegebenem Ziel immer Offsets, die relativ zur Position des jmp-Befehls berechnet werden (also zB. Springe 200Bytes nach vorn oder 125 nach hinten etc.).
    Koennte also durchaus sein, dass der Inline Asm auch nur relative Adressen frisst (jmp $+xxx o.ae.).

    Wenn du nun keine Lust hast, dich mit diesen relativen Adressen rumzuschlagen, bleibt nur der Sprung via Register.



  • jmp dword ptr cs:[00411A20h]

    hier wird nicht nach 411A20 gesprungen, sondern zu der addresse, die das dword an 411420 speichert. dort steht aber code (nämlich der funktionsprolog), also springt der code irgendwo ins nirvana.


Anmelden zum Antworten