#include <windows.h>
#include <stdio.h>
#include <CONIO.H>
ULONG
g_PointerToRawData = 0 ;
ULONG
g_RawOffset = 0 ;
LPVOID
GetAddress(
char
*,
char
*);
LPVOID
WINAPI DetourVirtualAllocEx(
HANDLE
hProcess,
LPVOID
lpAddress,
DWORD
dwSize,
DWORD
flAllocationType,
DWORD
flProtect
);
BOOL
Inline_InstallHook(
void
);
BOOL
Inline_UnInstallHook();
VOID
TestHook();
int
main(
int
argc,
char
* argv[])
{
TestHook();
Inline_InstallHook();
TestHook();
printf
(
"yes i am ok\n"
);
getchar
();
return
0;
}
VOID
TestHook()
{
LPVOID
lpAddr = VirtualAlloc(NULL,0x1000,MEM_COMMIT,PAGE_READWRITE);
}
LPVOID
WINAPI DetourVirtualAllocEx(
HANDLE
hProcess,
LPVOID
lpAddress,
SIZE_T
dwSize,
DWORD
flAllocationType,
DWORD
flProtect
)
{
LPVOID
lpAddr = NULL ;
printf
(
"[DetourVirtualAllocEx] VirtualAllocEx called.\n"
);
lpAddr = VirtualAllocEx(hProcess,lpAddress,dwSize,flAllocationType,flProtect);
printf
(
"[DetourVirtualAllocEx] Alloced Buffer = 0x%X\n"
,lpAddr);
return
lpAddr;
}
DWORD
G_OldAddress = 0;
DWORD
G_NewAddress = 0;
BOOL
Inline_InstallHook()
{
HMODULE
hModule_ = LoadLibraryA(
"kernel32.dll"
);
BOOL
bFound = FALSE;
BOOL
bResult = FALSE ;
ULONG
addrTemp = 0 ;
ULONG
addrTargetFun = (
ULONG
)GetAddress(
"kernel32.dll"
,
"VirtualAllocEx"
);
PBYTE
pFun = (
PBYTE
)GetAddress(
"kernel32.dll"
,
"VirtualAlloc"
);
PBYTE
pBase = pFun;
int
i = 0 ;
for
(i=0;i<0x30;i++,pFun++)
{
if
(pFun[0] == 0xff && pFun[1] == 0x25)
{
union
{
byte bb_[4];
DWORD
address_;
};
bb_[0] = pFun[2];
bb_[1] = pFun[3];
bb_[2] = pFun[4];
bb_[3] = pFun[5];
G_OldAddress = address_;
DWORD
*jmpAddress_ =
reinterpret_cast
<
DWORD
*>( G_OldAddress );
MEMORY_BASIC_INFORMATION mbInfor_;
VirtualQuery( jmpAddress_, &mbInfor_,
sizeof
( mbInfor_ ) );
SIZE_T
wwww;
addrTemp = (
LONG
)DetourVirtualAllocEx;
G_NewAddress = addrTemp;
DWORD
oldProtect_;
VirtualProtect( mbInfor_.BaseAddress, mbInfor_.RegionSize, PAGE_EXECUTE_READWRITE, &oldProtect_ );
bResult = WriteProcessMemory( GetCurrentProcess( ), jmpAddress_, &addrTemp,
sizeof
(
LONG
), &wwww);
VirtualProtect( mbInfor_.BaseAddress, mbInfor_.RegionSize, oldProtect_, nullptr );
int
aa = 0;
bResult = FALSE;
break
;
}
}
if
(bResult)
{
g_PointerToRawData = (
ULONG
)pFun + 1 ;
g_RawOffset = *(
LONG
*)(pFun+1) ;
addrTemp = (
LONG
)DetourVirtualAllocEx - (
LONG
)pFun - 5 ;
bResult = WriteProcessMemory(GetCurrentProcess(),pFun+1,&addrTemp,
sizeof
(
LONG
),NULL);
}
return
bResult;
}
BOOL
Inline_UnInstallHook()
{
DWORD
addrTemp = g_RawOffset ;
return
WriteProcessMemory(GetCurrentProcess(),(
LPVOID
)g_PointerToRawData,&addrTemp,
sizeof
(
LONG
),NULL);
}
LPVOID
GetAddress(
char
*dllname,
char
*funname)
{
HMODULE
hMod=0;
if
(hMod=GetModuleHandle(dllname))
{
return
GetProcAddress(hMod,funname);
}
else
{
hMod=LoadLibrary(dllname);
return
GetProcAddress(hMod,funname);
}
}