E
Mechanics schrieb:
Es gibt doch genug C/C++ Bibliotheken, die dir die Opcodes und Parameter generieren, mit denen kann man deutlich übersichtlicher arbeiten.
Schön, war mir neu
Hab mal versucht danach zu suchen, aber kenn wohl nicht die richtigen Keywords.
Das hier finde ich aber immer noch halbwegs lesbar.
(Edit: Ok, mit instructions die mehr als 1 Byte brauchen ist es etwas unhandlich, ich überleg mir was.)
Allerdings weiß ich nicht, ob ich einfach so ein globales array für meinen Code verwenden darf, oder ob ich das immer per VirtualAlloc machen sollte.
#include <windows.h>
#define NOP 0x90
#define CALL 0xE8
#define JMP 0xE9
#define PUSH_EBP 0x55
#define MOV 0x89
#define ESP_TO_EBP 0xE5
#define EBP_TO_ESP 0xEC
#define POP_EBP 0x5D
#define RET 0xC3
void foo(){
MessageBox(NULL, "Hello World!", "Success!", MB_OK);
}
BYTE code[12] = {
//enter function
PUSH_EBP,
MOV, ESP_TO_EBP,//EDIT: this line is one instruction
//call address
CALL, 0, 0, 0, 0,
//leave function
MOV, EBP_TO_ESP,//EDIT: this line is one instruction
POP_EBP,
RET
};
int main(){
DWORD dw = 0;
VirtualProtect(code, sizeof(code), PAGE_EXECUTE_READWRITE, &dw);
*(DWORD*)(code + 4) = (DWORD)foo - (DWORD)code - 1 - 4 - 3;
void(*test)() = (void(*)())code;
test();
return 0;
}