CreateDetour by Croner (99%) | CyberRazzer (1%) :p
Detour:
Code:
#define Detour_Type_0xE9 1
#define Detour_Type_0xB8 2
#define Detour_Type_0x68 3
DWORD CreateDetour(DWORD dwThread,DWORD dwAdress,DWORD dwType,DWORD dwSize)
{
DWORD dwDetour,dwProtect,i;
if (dwAdress&&dwThread&&dwSize>= dwSize)
{
dwDetour = (DWORD)VirtualAlloc(0,dwSize+dwSize,0x1000,0x40);
if (dwDetour&&VirtualProtect((VOID*)dwAdress,dwSize,0x40,&dwProtect))
{
for (i=0;i<dwSize;i++)
{
*(BYTE*)(dwDetour+i)=*(BYTE*)(dwAdress+i);
}
switch (dwType)
{
case Detour_Type_0xE9:
{
*(BYTE*)(dwDetour+dwSize+0)=0xE9;
*(DWORD*)(dwDetour+dwSize+1)=(dwAdress-dwDetour-dwSize);
*(BYTE*)(dwAdress+0)=0xE9;
*(DWORD*)(dwAdress+1)=(dwThread-dwAdress-dwSize);
}
break;
case Detour_Type_0xB8:
{
*(BYTE*)(dwDetour+dwSize+0)=0xB8;
*(DWORD*)(dwDetour+dwSize+1)=(dwAdress+dwSize);
*(WORD*)(dwDetour+dwSize+5)=0xE0FF;
*(BYTE*)(dwAdress+0)=0xB8;
*(DWORD*)(dwAdress+1)=(dwThread);
*(WORD*)(dwAdress+5)=0xE0FF;
}
break;
case Detour_Type_0x68:
{
*(BYTE*)(dwDetour+dwSize+0)=0x68;
*(DWORD*)(dwDetour+dwSize+1)=(dwAdress+dwSize);
*(WORD*)(dwDetour+dwSize+5)=0xC3;
*(BYTE*)(dwAdress+0)=0x68;
*(DWORD*)(dwAdress+1)=(dwThread);
*(WORD*)(dwAdress+5)=0xC3;
}
break;
}
VirtualProtect((VOID*)dwAdress,dwSize,dwProtect,&dwProtect);
VirtualProtect((VOID*)dwDetour,dwSize+dwSize,0x20,&dwProtect);
return dwDetour;
}
}
Sleep(10);
return (0);
}
Usage:
Code:
pPresent = (oPresent)CreateDetour((DWORD)myPresent,(DWORD)VTable(17),Detour_Type_0xE9,5);
Use for Dip Detour B8 with Size 7 - And Full Undetected (Need Rehook)
(Function,Adresse,Byte,Size)