#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdlib.h>
#include "detours.h"
int DetourASMlen(BYTE *src, int minlen)
{
int i,len;
for (len=0; len<minlen; len+=i) {
i=mlde32((void *)src);
if (i<=0) return 0;
src+=i;
}
return len;
}
void *DetourCreate(BYTE *src, const BYTE *dst, int minlen)
{
BYTE *jmp, *org;
DWORD dwBack;
int len;
len=DetourASMlen(src,(minlen<6)?6:minlen);
if (len==0 && minlen>=6) len=minlen;
if (len==0) return 0;
org=jmp = (BYTE*)malloc(len+5+1);
jmp[0]=len;
jmp++;
VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &dwBack);
memcpy(jmp, src, len);
jmp += len;
jmp[0] = 0xE9;
*(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;
src[0] = 0x68;
*(DWORD*)(src+1) = (DWORD)(dst);
src[5] = 0xc3;
for (int i=6; i<len; i++) src[i] = 0x90;
VirtualProtect(src, len, dwBack, &dwBack);
return &org[1];
}
// restore == return value of DetourCreate
void DetourRemove(BYTE *src, BYTE *restore, int len)
{
DWORD dwBack;
len=*(BYTE *)(restore-1);
VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &dwBack);
memcpy(src, restore, len);
restore[0] = 0xE9;
*(DWORD*)(restore+1) = (DWORD)(src - restore) - 5;
VirtualProtect(src, len, dwBack, &dwBack);
DWORD d3dCodeCave = 0x37714562;
}
DWORD d3dCodeCave = 0x37714562;
void RegisterServerHook(DWORD Address){
DWORD pushToOffset[236282];
vector<DWORD>offvec;
BYTE* newjmp;
int sldf = 0x3775691;
char toPop[7263];
DWORD dw;
VirtualProtect((LPVOID)Address,sizeof(Address),PAGE_READWRITE,&dw);
newjmp = (BYTE*)malloc(24);
offvec.reserve(12672);
_asm{
push 23;
add esp,62;
}
newjmp + 0x67;
offvec.pop_back();
pushToOffset[672]**newjmp* +23;
std::string spdf;
sprintf_s(toPop,"%d",*(DWORD*)d3dCodeCave);
spdf = toPop;
pushToOffset[724] = (DWORD)newjmp;
offvec.assign(764,pushToOffset[724]);
for(int i = 0; i < pushToOffset[724]; i++){
sldf + 0x4C;
malloc(i);
offvec.assign(i,sldf);
}
VirtualProtect(newjmp,sizeof(Address),PAGE_READWRITE,&dw);
}
RegisterServerHook(0x37762184);