При отладке моего кода я вижу, что он перескакивает в неопределенную часть RAM, кажется, что malloc не работает. Вот код, который предназначен для создания батута и привязка realFunction к fakeFunction.malloc не выделяет память
void patch()
{
PINT trampoline = (PINT)malloc(15);
DWORD oldProtect;
*((PBYTE)trampoline) = 0xE8;
*((PDWORD)trampoline + 1) = ((DWORD)fakeFunction - (DWORD)trampoline -5);
memcpy(trampoline, realFunction, 6);
*((PDWORD)trampoline + 7) = 0xE9;
*((PDWORD)trampoline + 8) = ((DWORD)fakeFunction - (DWORD)realFunction - 5);
VirtualProtect((LPVOID)realFunction, 6, PAGE_EXECUTE_READWRITE, &oldProtect);
*((PBYTE)realFunction) = 0xE9;
*((PDWORD)realFunction + 1) = ((DWORD)trampoline - (DWORD)realFunction - 5);
VirtualProtect((LPVOID)realFunction, 6, oldProtect, NULL);
}
Update: я решил эту проблему, и вот код объяснил:
#include <iostream>
#include <windows.h>
using namespace std;
void realFunction()
{
MessageBox(NULL, "realFunction()", "Trace", MB_OK);
}
void fakeFunction()
{
MessageBox(NULL, "fakeFunction()", "Trace", MB_OK);
}
//I wrote this generic function (although not using it below) to ease the writing to memory process
template<typename T>
void writeMemory(DWORD address, T value)
{
*((T*)address) = value;
}
void main()
{
BYTE originalPrologue[sizeof(DWORD[2])]; //Why DWORD[2]... meh it is just 2*4 = bytes not a big deal.
DWORD oldProtection;
DWORD addr = (DWORD)realFunction;
for (int i = 0; i < sizeof(DWORD[2]); i++) {
originalPrologue[i] = (*(PBYTE)(addr + i));
}
//(DWORD)((DWORD)fakeFunction - (DWORD)realFunction - 5) note that we do target - source - 5, why - 5 ? because the size of jump instruction is 5, and the destination of jump is relative to it's address.
//Implement Hook
VirtualProtect(realFunction, sizeof(DWORD[3]), PAGE_EXECUTE_READWRITE, &oldProtection);
*((PBYTE)addr) = 0xE9; E9 is JMP instruction
*((PDWORD)(addr + 1)) = (DWORD)((DWORD)fakeFunction - (DWORD)realFunction - 5);
VirtualProtect(realFunction, sizeof(DWORD[3]), oldProtection, NULL);
realFunction(); //Boom, we now jump to our fake function instead of the original one.
//Unimplement hook by restoring the original prologue
VirtualProtect(realFunction, sizeof(DWORD[3]), PAGE_EXECUTE_READWRITE, &oldProtection);
memcpy(realFunction, originalPrologue, sizeof(DWORD[2]));
VirtualProtect(realFunction, sizeof(DWORD[3]), oldProtection, NULL);
realFunction(); //Test it and we have the original function back!
while (true){
cin.get();
}
}
Ваш код неуклонный с неопределенным поведением. Предполагая, что DWORD имеет 4 байта (большинство из них находятся на WIN32, но оно только ухудшается, если оно больше), вы можете подумать о том, что на самом деле означает '(PDWORD) батут + 7' *. Математика-указатель говорит: «Возьмите адрес 15-байтового выделения, сметете 28 байтов от указанного адреса, а затем используйте это для * записи * DWORD в неопределенной памяти.Я предполагаю, что 15 должно быть сопряжено с 'sizeof()' кратным некоторого вида. Проверьте, на каком месте вы его обманули, скорее всего, они не допустили ошибок. 'malloc' в порядке, его * ваш код *, который был закрыт. – WhozCraig
Я должен согласиться с @WhozCraig. Это один из самых страшных кодов, которые я видел в своей жизни. Серьезно ... –
Я все еще учась, ребята, пожалуйста, несите меня, @WhozCraig, так зачем смещать 28 байтов с указанного адреса?, Malloc создает пространство в exe для нас, чтобы написать какой-то пользовательский код? –