Char-Array als Funktion



  • Ich wollte mal fragen ob man ein Char-Array eigentlich als Funktion verwenden kann.
    Also das man in das Array die OPCodes reinschreibt, den Pointer dann auf einen Funktionspointer umcastet und die "Funktion" aufruft.

    Ungefähr so:

    //Erzeuge ein char Feld mit Maschinenbefeheln
    unsigned char c[] = {0xB8,0x05,0x00,0x00,0x00,0xc3};
    //Rufe Funktion auf und gib Return-Wert aus
    printf("return value -> %d", ((int(*)(void))c)() );
    

    Als Assembler würde das dann so ausschauen:

    0xB8 0x05...      mov  eax,5 
    0xc3              ret
    

    Wenn ich das ganze mit dem GNU GCC Compiler kompiliere und starte wird 5 ausgegeben, was ich ja erreichen wollte.
    Hat das nur zufällig funktioniert oder kann man das so machen?

    OS: Windows 7
    Prozessor: Intel



  • Ja, kann man machen. Dein Betriebssystem könnte nur was dagegen haben -> Data Execution Prevention.



  • MightyDuck schrieb:

    Prozessor: Intel

    Du meinst sicher DEN Intel 8088?


  • Mod

    Ja, das ist möglich. Ist natürlich hochgradig plattformabhängig, aber wenn du weißt, was du tust, dann wird das auch funktionieren. Was man eventuell noch beachten sollte ist die Existenz von Techniken wie dem NX-Bit auf x86. Viele OS haben nämlich was dagegen, wenn Daten ausgeführt werden, weil das ein ganz typisches Vorgehen von Computerviren ist.

    edit: Zu langsam.



  • Danke für die schnellen Antworten!

    Anscheinend hat mein Betriebssystem vorerst nichts dagegen 😃

    Hab das ganze auch mit C++ und Visual Studio 2010 probiert aber da hängt sich das kurz vor dem Aufruf der Funktion auf.
    Weiß da jemand warum?

    17:     i = func();
    013B1535 8B F4                mov         esi,esp  
    013B1537 FF 55 D8             call        dword ptr [ebp-28h]  
    013B153A 3B F4                cmp         esi,esp                        ;Hier hängt es immer
    013B153C E8 5E FC FF FF       call        @ILT+410(__RTC_CheckEsp) (13B119Fh)  
    013B1541 89 45 CC             mov         dword ptr [ebp-34h],eax
    

Anmelden zum Antworten