【请教】实现对Openprocess的API的HOOK
最近因为需要,要对OpenProcess这个API进行HOOK,一旦发现有第三方程序企图利用该API打开我的进程 程序就自动退出。
本人没研究过APIHOOK,不知哪位大神有做过,可以给个源码研究一下。
[解决办法]
- C/C++ code
class clsHookInfo
{
private:
BYTE mbytOldCode[5];
BYTE mbytNewCode[5];
int mlngFunAddr;
bool hookBeOK;
public:
bool HookApi(LPCTSTR strDllName,LPCTSTR strFunName,int lngFunAddr)
{
hookBeOK=false;
HMODULE hModule=NULL;
int dwJmpAddr=0;
hModule=GetModuleHandle(strDllName);
if (hModule==NULL) {return false;}
mlngFunAddr=(int)GetProcAddress(hModule,strFunName);
if (mlngFunAddr==NULL) {return false;}
CopyMemory(mbytOldCode,(const void *)mlngFunAddr,5);
mbytNewCode[0]=0xE9;
dwJmpAddr=lngFunAddr-mlngFunAddr-5;
CopyMemory(&mbytNewCode[1],&dwJmpAddr,4);
hookBeOK=true;
HookStatus(true);
return true;
}
bool HookStatus(bool blnIsHook)
{
DWORD oldACC,newACC;
if (!hookBeOK) {return false;}
if (blnIsHook)
{
VirtualProtect((LPVOID)mlngFunAddr,5,PAGE_WRITECOPY,&oldACC);
CopyMemory((void *)mlngFunAddr,mbytNewCode,5);
VirtualProtect((LPVOID)mlngFunAddr,5,oldACC,&newACC);
}
else
{
VirtualProtect((LPVOID)mlngFunAddr,5,PAGE_WRITECOPY,&oldACC);
CopyMemory((void *)mlngFunAddr,mbytOldCode,5);
VirtualProtect((LPVOID)mlngFunAddr,5,oldACC,&newACC);
}
return true;
}
};
clsHookInfo g_myHOOK1;
int myMessageBoxW(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT UType)
{
g_myHOOK4.HookStatus(false);
int myReturn=MessageBoxA(hWnd,"这个是被替换的messageboxW","apihook成功",UType);
g_myHOOK4.HookStatus(true);
return myReturn;
}
g_myHOOK4.HookApi("user32.dll","MessageBoxW",(int)myMessageBoxW);
[解决办法]
楼主可以用detour库
[解决办法]
[解决办法]
看看这个
http://apps.hi.baidu.com/share/detail/55093194