Estou tentando fazer um hook no S2S pra logar os packets mas quando eu entro na partida e aperto INSERT pra ativar o hook o jogo fecha. Estou utilizando a Detour que o luizimloko postou. Será que é porque eu não estou utilizando o SDK e estou fazendo os parâmetros com o tipo errado?
Se alguem puder dar uma olhada no código...
Code:
#include <stdio.h>
#include <windows.h>
typedef unsigned int(*pS2S)(void *buf, unsigned int flags);
pS2S oS2S;
#define ADDR_BYPASS 0x539949
#define ADDR_S2S 0x47B940
LPVOID DetourCreate(BYTE *src, CONST BYTE *dst, CONST INT len)
{
BYTE *jmp = (BYTE*)malloc(len + 5);
DWORD dwBack;
VirtualProtect(src, len, PAGE_READWRITE, &dwBack);
memcpy(jmp, src, len);
jmp += len;
jmp[0] = '\xE9';
*(DWORD*)(jmp + 1) = (DWORD)(src + len - jmp) - 5;
src[0] = '\xB8';
src[5] = '\xA9';
src[10] = '\x50';
src[11] = '\x90';
src[12] = '\xC3';
src[13] = '\x90';
*(DWORD*)(&src[1]) = (DWORD)dst;
*(DWORD*)(&src[6]) = (DWORD)dst;
for (INT i = 14; i < len; i++) src[i] = 0x90;
VirtualProtect(src, len, dwBack, &dwBack);
return (jmp - len);
}
unsigned int hkS2S(void *buf, unsigned int flags)
{
__asm PUSHAD;
printf("hu3hu3");
__asm POPAD;
return oS2S(buf, flags);
}
void Main()
{
DWORD dwOld;
VirtualProtect((void*)ADDR_BYPASS, 6, PAGE_EXECUTE_READWRITE, &dwOld);
while(memcmp((CONST VOID*)ADDR_BYPASS, (CONST VOID*)"\x0F\x84\xB4\x00\x00\x00", 6) != 0) Sleep(100);
memcpy((void*)ADDR_BYPASS, "\xE9\x19\x01\x00\x00\x90", 6);
while (1)
{
if (GetAsyncKeyState(VK_INSERT) & 1) // Ativa hook.
oS2S = (pS2S)DetourCreate((BYTE*)ADDR_S2S, (BYTE*)hkS2S, 7);
}
VirtualProtect((void*)ADDR_BYPASS, 6, dwOld, 0);
}
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
switch ( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
AllocConsole();
freopen("CONOUT$", "w", stdout);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&Main, NULL, 0,NULL);
break;
}
return TRUE;
}