Ich versuche, eine Funktion in einen zugeordneten Speicherpuffer zu laden und später anrufen, also habe ich einen Testfall gemacht auszuprobieren:Kopieren vorhandene Funktion in dem Speicherpuffer
auto func() -> void{
asm(
"nop;"
"nop;"
"nop;"
"nop;"
);
}
auto main(int argc, char *argv[]) -> int{
void *exec_mem = mmap(nullptr, getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
// check errors here
memcpy(exec_mem, reinterpret_cast<const void*>(func), 5); // size is known
(reinterpret_cast<void(*)()>(exec_mem))(); // function call
munmap(exec_mem, getpagesize());
}
die gut arbeitet, aber Sobald ich etwas Triviales versuche, bekomme ich einen Segfault.
Ich habe versucht, eine einfache variable Zuordnung wie dies zu tun:
int x;
auto func() -> void{
x = 5;
}
und jetzt segfaults meinen Funktionsaufruf. Ich habe die Puffergröße entsprechend geändert und bin sicher, dass der richtige Speicher in den Puffer geschrieben wird.
Welche wichtige Information fehlt mir hier? Warum kann ich das nicht tun?
P.S. Bitte lehre mich nicht über unsicheren Code, dies ist eine einfache persönliche Lernübung.
Sie müssen in Ihrem Job sehr unsicher sein, auch wenn Sie daran denken, diese Art von Code zu schreiben. –
@EdHeal Ja, ich programmiere nicht für einen Job. – CoffeeandCode
Nur neugierig, was ist das für eine Syntax: 'auto/-> '? Habe es noch nie gesehen. –