Opções de Detours Combat Arms
Com o tamanho do detour "const int len" = 10 é para funcionar em todos os Windows XP, Windows 7 e Windows 8.
Code:
void *DetourJMP(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] = '\xE9';
*(DWORD*)(&src[1]) = (DWORD)(dst - src) - 5;
for (int i = 5; i < len; i++) src[i] = 0x90;
VirtualProtect(src, len, dwBack, &dwBack);
return (jmp - len);
}
oPresent = (tPresent)DetourJMP((PBYTE) dwVTablePresent, (PBYTE) &Present, 10);
Code:
void *DetourNOPJMP(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] = '\x90';
src[1] = '\xE9';
*(DWORD*)(&src[2]) = (DWORD)(dst - src) - 6;
for (int i = 6; i < len; i++) src[i] = 0x90;
VirtualProtect(src, len, dwBack, &dwBack);
return (jmp - len);
}
oPresent = (tPresent)DetourNOPJMP((PBYTE) dwVTablePresent, (PBYTE) &Present, 10);
Code:
void *DetourPUSHRET(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] = '\x68';
*(DWORD*)(&src[1]) = (DWORD)(dst);
src[5] = '\xC3';
for (int i = 6; i < len; i++) src[i] = 0x90;
VirtualProtect(src, len, dwBack, &dwBack);
return (jmp - len);
}
oPresent = (tPresent)DetourPUSHRET((PBYTE) dwVTablePresent, (PBYTE) &Present, 10);
Code:
void *DetourNOPNOPJMP(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] = '\x90';
src[1] = '\x90';
src[2] = '\xE9';
*(DWORD*)(&src[3]) = (DWORD)(dst - src) - 7;
for (int i = 7; i < len; i++) src[i] = 0x90;
VirtualProtect(src, len, dwBack, &dwBack);
return (jmp - len);
}
oPresent = (tPresent)DetourNOPNOPJMP((PBYTE) dwVTablePresent, (PBYTE) &Present, 10);
Code:
void *DetourPUSHPOPJMP(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] = '\x50';
src[1] = '\x58';
src[2] = '\xE9';
*(DWORD*)(&src[3]) = (DWORD)(dst - src) - 7;
for (int i = 7; i < len; i++) src[i] = 0x90;
VirtualProtect(src, len, dwBack, &dwBack);
return (jmp - len);
}
oPresent = (tPresent)DetourPUSHPOPJMP((PBYTE) dwVTablePresent, (PBYTE) &Present, 10);
Code:
void *DetourSTCJB(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] = '\xF9';
src[1] = '\x0F';
src[2] = '\x82';
*(DWORD*)(&src[3]) = (DWORD)(dst - src) - 7;
for (int i = 7; i < len; i++) src[i] = 0x90;
VirtualProtect(src, len, dwBack, &dwBack);
return (jmp - len);
}
oPresent = (tPresent)DetourSTCJB((PBYTE) dwVTablePresent, (PBYTE) &Present, 10);
Code:
void *DetourCLCJNB(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] = '\xF8';
src[1] = '\x0F';
src[2] = '\x83';
*(DWORD*)(&src[3]) = (DWORD)(dst - src) - 7;
for (int i = 7; i < len; i++) src[i] = 0x90;
VirtualProtect(src, len, dwBack, &dwBack);
return (jmp - len);
}
oPresent = (tPresent)DetourCLCJNB((PBYTE) dwVTablePresent, (PBYTE) &Present, 10);
Code:
void *DetourMOVJMP(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';
*(DWORD*)(&src[1]) = (DWORD)(dst);
src[5] = '\xFF';
src[6] = '\xE0';
for (int i = 7; i < len; i++) src[i] = 0x90;
VirtualProtect(src, len, dwBack, &dwBack);
return (jmp - len);
}
oPresent = (tPresent)DetourMOVJMP((PBYTE) dwVTablePresent, (PBYTE) &Present, 10);
Code:
void *DetourXORTESTJE(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] = '\x33';
src[1] = '\xC0';
src[2] = '\x85';
src[3] = '\xC0';
src[4] = '\x0F';
src[5] = '\x84';
*(DWORD*)(&src[6]) = (DWORD)(dst - src) - 10;
for (int i = 10; i < len; i++) src[i] = 0x90;
VirtualProtect(src, len, dwBack, &dwBack);
return (jmp - len);
}
oPresent = (tPresent)DetourXORTESTJE((PBYTE) dwVTablePresent, (PBYTE) &Present, 10);
Créditos:
Azorbix / Gordon / Patrick / WE11ington[/QUOTE]