Удивительно как можно совершить столько ошибок в паре строчек кода
tramp = new unsigned char[6];Code: C++
Memory leak без delete[] в конце. Лучше сразу на стеке объявить char tramp[6];
tramp[1] = (char)pNewFunc;Code: C++
Это копирует только один младший байт адреса.
WriteMemory(pAddress, &tramp, sizeof(tramp));Code: C++
Cразу две ошибки. У тебя tramp - это указатель, следовательно &tramp - адрес этой переременной, а не самого буфера с кодом; по той же причине sizeof(tramp) будет == 4, а не 6.
char trampoline[6];
trampoline[0] = 0x68; // push imm32
memcpy(&trampoline[1], pNewFunc, 4); // тут я не понял. pNewFunc у тебя это уже адрес новой функции или это указатель на переменную с адресом новой функции?
trampoline[5] = 0xС3; // ret
WriteMemory(pAddress, trampoline, sizeof(trampoline));
Code: C++