Funktion in Stack Array aufrufen
-
Hallo ihr.
Ich versuche den Code einer Funktion sozusagen "dynamisch" nachzuladen. Zurzeit is das noch nebensächlich und ich kopiere lediglich eine Schon vorhandene Funktion an eine Andere Stelle.
Wenn man diese aber aufrufen will stürtzt das Programm ab...
erstmal mein Programm:
#include <cstdlib> #include <iostream> using namespace std; typedef void (*pFunc)(); void Func1() { system("PAUSE"); return; } int main() { char codedata[512]; // Feld für Kopie von Func1 // char * codedata = (char *) malloc(512); // Funktionier ebenso wenig, gleicher Fehler void * src = (void *) &Func1; // Zeiger auf Func1 void * dst = (void *) &codedata; // Zeiger auf codedata memcpy(dst,src,30); // Code von Func1 in codedata kopieren // Laut gdb sind es 19 Bytes, mehr schadet ja nicht printf("Original Address: %i\n",&Func1); // Nur zum testen drinne printf("Will now jump to %i\n",&codedata); // s.o. system("PAUSE"); // Bis hier funktionierts ((pFunc)&codedata)(); // Code in codedata ausführen (Kopie von Func1) // SEGMENTION FAULT system("PAUSE"); return 0; }und die ausgabe des gdb beim ausführen:
(gdb) run Starting program: C:\bin\code\cpp\memcode\Output\MingW\Project1.exe [New thread 4712.0x1350] Error: dll starting at 0x77680000 not found. Error: dll starting at 0x76fc0000 not found. Error: dll starting at 0x77680000 not found. Error: dll starting at 0x777a0000 not found. Original Address: 4199374 Will now jump to 2682656 Error: dll starting at 0x4ab50000 not found. Drücken Sie eine beliebige Taste . . . Program received signal SIGSEGV, Segmentation fault. 0x002a40ca in ?? ()jemand eine Idee sowas zum laufen zu bekommen?
mfg
-
Das ist schwarze Magie... für sowas sollte man Leute *zensiert*
Wird so nicht funktionieren, da in einer Funktion nicht nur relative Sprünge vorkommen können, sondern auch Sprünge an absolute Adressen. Wenn du nur einfach den Funktionscode an eine andere Adresse kopierst änderst du die Sprungadressen nicht und springst an die alte Adresse.
Ausserdem (so genau kenn ich mich da jetzt nicht aus) besitzen moderne Prozessoren ein No Execution Bit für bestimmte Speicherbereiche, die das Ausnutzen von Buffer Overflows verhindern sollen. In genau diese Kategorie fällt aber auch dein Vorhaben, sodass selbst das OS etwas dagegen haben könnte, Funktionen im Datensegment auszuführen.
-
Pfui!
Code "dynamisch" nachladen macht man mit Hilfe des Betriebssystems. Unter Windows mit LoadLibrary und unter Linux mit dlopen.
Phype schrieb:
void * src = (void *) &Func1; // Zeiger auf Func1 void * dst = (void *) &codedata; // Zeiger auf codedata memcpy(dst,src,30); // Code von Func1 in codedata kopierenZugriff auf die Bytes bei *src: Undefiniertes Verhalten, da die Addresse in src kein richtiger Objekt-Zeiger sondern nur ein reinterpretierter Funktionszeiger ist.
Phype schrieb:
((pFunc)&codedata)(); // Code in codedata ausführen // SEGMENTION FAULTKein Wunder. Du hast einen Reinterpret-Cast auf einen Funktionpointer-Typen und willst die "Funktion" aufrufen, die keine ist. Du kannst nicht einfach Daten und Code vermischen oder das eine wie das andere behandeln -- nicht ohne die Hilfe des Betriebssystems. Siehe http://de.wikipedia.org/wiki/Schutzmodus
-
Stimmt an Dll's / Libraries hab ich garnicht geadcht.
dankeschön, für den hinweis
mfg
*gelöst, bzw als nicht lösbar geklärt*