Ich brauche Hilfe herauszufinden, warum ich zur Laufzeit stürze, wenn ich versuche, meinen Maschinencode zu starten. Der Code stürzt zwischen "3" und "result =% li" ab.Obskurer Laufzeitfehler beim Ausführen des Maschinencodes
HINWEIS: Angenommen, der gesamte Code ist fehlerhaft. Ich habe den Fehlerprüfcode aus Gründen der Leute entfernt, die das lesen.
Maschinendaten:
Windows 10 Home 64-bit
Intel(R) Core(TM) i7-4712MQ
-Code Ich bin mit:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main(int argc, char** argv) {
printf("Loading code\n");
LPVOID m = VirtualAlloc(NULL, 16, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);
printf("1\n");
unsigned char code[] = {
//return x+2;
0x55, //push %rbp
0xe5, 0x89, 0x48, //mov %rsp,%rbp
0xc8, 0x89, //movl %ecx,%eax
0x02, 0xc0, 0x83, //add $0x2,%eax
0xc9, //leaveq
0xc3, //retq
0x90 //nop
};
memcpy(m, code, sizeof(code));
printf("2\n");
PDWORD trash;
VirtualProtect(m, 16, PAGE_EXECUTE_READ, trash);
printf("3\n");
long int (*addTwo)(long int) = m;
long int answer = addTwo(2);
printf("result = %li\n", answer);
VirtualFree(m, 0, MEM_RELEASE);
return 0;
}
Überprüfen Sie den Rückgabewert von 'VirtualProtect'. Hat es gelingen? (Sie sollten auch den Rückgabewert von 'VirtualAlloc' überprüfen, aber ich nehme an, dass das funktioniert oder das' memcpy' wäre abgestürzt.) Wenn 'VirtualProtect' erfolgreich ist, sollten Sie den Debugger im Assembly-Modus starten und Setzen Sie einen Haltepunkt bei der Deklaration von 'addTwo'. – user3386109
Ich habe den ganzen Prüfcode aus Gründen der Leute hier entfernt. @ user3386109 Hat Windows einen nativen Debugger oder soll ich gdb installieren? – tiffanyButterfly95
zur besseren Lesbarkeit und Verständnis: folgen Sie dem Axiom: * nur eine Anweisung pro Zeile und (höchstens) eine Variablendeklaration pro Anweisung. *. Hinweis: 'unsigned char code [] 'platziert die Daten im .data-Bereich und nicht im .text-Bereich und die Einträge im .data-Bereich sind nicht ausführbar – user3629249