Hi,
am Anfang wollte ich nur mal alle vorwarnen, die nicht mit Assembler oder der Struktur von Programmen im RAM vertraut sind, denn dieses Wissen wird hier verlangt :).
Vorgeschichte:
Ich schreibe ein 3D-Spiel in C++ und DirectX und dazu eine eigene Engine. Ob ich das schaffe sei mal dahin gestellt. Auf jedenfall soll diese Engine eine eigene Skriptsprache besitzen. Soweit schön und gut. Doch ich dachte mir, warum die Skriptsprache nicht in Maschinencode kompilieren (ist dann zwar keine Skriptsprache mehr, aber ich benutze das Wort "Skriptsprache" hier lieber als "Programmiersprache"), in den RAM laden, Instruction Pointer auf die Adresse der geladenen Bytes setzen und dann ausführen lassen. Gesagt, getan. Doch dann bekam ich gleich den ersten Fehler: 0xC0000005. Dieser sagt aus, dass ich eine Zugriffsverletzung begehe, d.h in meinem Fall keinen Code im Data-Segment ausführen darf. Also Google befragt und voilà, ich fand VirtualProtectEx, mit der man die Berechtigung in bestimmten Adressräumen ändern kann. Also gleich ausprobiert der alte Fehler war weg, aber ...
Das Problem:
Code
... nun schmeißt er mir einen Fehler in Zeile 28. Wiederrum erzählt er mir, ich würde eine Zugriffsverletzung begehen, doch ich wüsste nicht warum. Weiterhin hat er mir
Vielen Dank im Voraus
LG
Fritschifisch
am Anfang wollte ich nur mal alle vorwarnen, die nicht mit Assembler oder der Struktur von Programmen im RAM vertraut sind, denn dieses Wissen wird hier verlangt :).
Vorgeschichte:
Ich schreibe ein 3D-Spiel in C++ und DirectX und dazu eine eigene Engine. Ob ich das schaffe sei mal dahin gestellt. Auf jedenfall soll diese Engine eine eigene Skriptsprache besitzen. Soweit schön und gut. Doch ich dachte mir, warum die Skriptsprache nicht in Maschinencode kompilieren (ist dann zwar keine Skriptsprache mehr, aber ich benutze das Wort "Skriptsprache" hier lieber als "Programmiersprache"), in den RAM laden, Instruction Pointer auf die Adresse der geladenen Bytes setzen und dann ausführen lassen. Gesagt, getan. Doch dann bekam ich gleich den ersten Fehler: 0xC0000005. Dieser sagt aus, dass ich eine Zugriffsverletzung begehe, d.h in meinem Fall keinen Code im Data-Segment ausführen darf. Also Google befragt und voilà, ich fand VirtualProtectEx, mit der man die Berechtigung in bestimmten Adressräumen ändern kann. Also gleich ausprobiert der alte Fehler war weg, aber ...
Das Problem:
C-Quellcode
- #include <iostream>
- #include <Windows.h>
- using namespace std;
- int main()
- {
- int output = 0;
- char bytes[2]; //einfache Befehle zu Testzwecken
- bytes[0] = 0x40; //inc eax
- bytes[1] = 0xCB; //retf
- HANDLE h = OpenProcess(PROCESS_VM_OPERATION, FALSE, GetCurrentProcessId());
- DWORD dummy = 0;
- if (VirtualProtectEx(h, (LPVOID)&bytes, sizeof(bytes), PAGE_EXECUTE_READWRITE, &dummy) == FALSE)
- {
- cout << "FAILED!" << endl;
- system("PAUSE");
- return 1;
- }
- __asm
- {
- mov eax, 41;
- call dword ptr [bytes];
- mov [output], eax;
- };
- printf("%.8X\n", output);
- system("PAUSE");
- return 0;
- }
... nun schmeißt er mir einen Fehler in Zeile 28. Wiederrum erzählt er mir, ich würde eine Zugriffsverletzung begehen, doch ich wüsste nicht warum. Weiterhin hat er mir
eax
(jedenfalls laut VS2013) nicht auf 42 inkrementiert, was er ja eigentlich hätte machen sollen. Daraufhin hab' ich versucht output
auch spezielle Berechtigungen zu geben, doch das hat (wie ich beinahe gedacht hatte, weil das war eine reine Verzweiflungstat) keinen Unterschied gemacht. Ich habe es auch über andere Lösungswege versucht, wie zum Beispiel bytes
in einen Funktionzeiger zu casten (void(*callFunction)(void) = (void(*)(void))&bytes;
), doch auch da schmeißt mir wieder eine Zugriffsverletzung. Ich hoffe das Problem ist nicht zu speziell und jemand kann mir helfen.Vielen Dank im Voraus
LG
Fritschifisch