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?
-
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