Всем хай) Тема уже эта заеженая, но уже 2 дня втыкаю и немогу втыкнуть)
Перехватываю "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkP acket@@@Z"
сплайсингом, перехват удаёттся, а дальше либо крит при логине, либо ошибка в игре с первого же раза.
Пишу орыгинальные 5 байт в структуру и следом за этими 5 байтами jmp near на орыгинальную функцию + 6, jmp nearы вроде как вычеслены правильно, я хз уже волосы рву, может ктото со светлой головой подскажет, собсно код вот:
PHP код:
#include <windows.h>
BYTE old[5];
DWORD dwProtect;
BYTE * fptr;
size_t _CalculateDispacement(void* lpFirst, void* lpSecond)
{
return reinterpret_cast<char*>(lpSecond) - (reinterpret_cast<char*>(lpFirst) + 5);
}
#pragma pack(push, 1)
struct jmp_near
{
BYTE opcode;
BYTE * addr;
};
#pragma pack(pop)
#pragma pack(push, 1)
struct jmp_org
{
BYTE old[5];
struct jmp_near jmp;
}org;
#pragma pack(pop)
void splice()
{
//MessageBox(0, "Hello from splice", "OK", MB_OK);
BYTE * addr = (BYTE*)&org;
__asm
{
jmp addr
}
}
void Intercept(void)
{
struct jmp_near jmp;
MessageBox(0, "Ready!?", "OK", MB_OK);
fptr = (BYTE *)GetProcAddress(GetModuleHandle(TEXT("engine.dll")), "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPacket@@@Z");
jmp.opcode = 0xE9;
jmp.addr = (BYTE*)_CalculateDispacement(fptr, splice);
VirtualProtect(fptr, 5, PAGE_EXECUTE_READWRITE, &dwProtect);
ReadProcessMemory(GetCurrentProcess(), (void*)fptr, (void*)&old[0], 5, 0);
WriteProcessMemory(GetCurrentProcess(), (void*)fptr, (void*)&jmp, 5, 0);
memcpy(org.old, old, 5);
org.jmp.opcode = 0xE9;
org.jmp.addr = (BYTE*)_CalculateDispacement(&org.jmp, (fptr + 6));
MessageBox(0, "The end", "OK", MB_OK);
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Intercept, NULL, NULL, NULL);
}
break;
case DLL_THREAD_ATTACH: break;
case DLL_THREAD_DETACH: break;
case DLL_PROCESS_DETACH: break;
}
return TRUE;
}
Добавлено через 23 часа 18 минут
Всё вышло.