-
-
[求助]ring3 采用DLL式HOOK全局API如何退出
-
发表于:
2008-12-21 14:21
5583
-
[求助]ring3 采用DLL式HOOK全局API如何退出
在看完
《RING3代码HOOK的原理实现》后,我加以修改采用DLL式HOOK全局API但运行时却出现EXPLORER》EXE出错,先前我也做过类似HOOK,但程序退出时总是出错,我考虑是程序退出了DLL自然被卸载了,但先前HOOK时做的修改并没改回,当调用此API时程序会引入一个被释放了的内存地址,因此出错。考虑到采用的是进程插入,因此在DLL_PROCESS_DETACH中调用了UninstallHook(),其中UninstallHook()中代码如下
extern"C"__declspec(dllexport) bool UninstallHook()
{
return(UnhookWindowsHookEx(g_hHook));
}
看似只是HOOK退出而已,并没改回所做的修改,但却HOOK正常,只是退出时出错,我估计运行时出错也是由于部分进程可能在随时退出和运行。如果按我理解在UninstallHook()中加入改回所做修改的功能,如下
extern"C"__declspec(dllexport) bool UninstallHook()
{
HookOff() ;
return(UnhookWindowsHookEx(g_hHook));
}
运行发现HOOK失败,估计有一个进程退出HOOK就退出了,因此本人十分不解,不知道退出时如何恢复所做的修改,请高手指点,本DLL全部代码如下(头文件没弄):
#include <windows.h>
#include "dll.h"
HHOOK g_hHook;
HINSTANCE g_hinstDll;
HMODULE hModule;
BOOL bHook=false;
void HookOn();
void HookOff();
unsigned int * OldProc;
typedef int (__stdcall * MYOPENPROCESS)(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId);
int __stdcall MyOpenProcess(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId)
{
//强制转换成API函数类型 调用原来的函数
return ((MYOPENPROCESS) OldProc)(dwDesiredAccess,bInheritHandle,dwProcessId);
}
//---------------------------------------------------------------------------
// 空的钩子函数
LRESULT WINAPI Hook(int nCode,WPARAM wParam,LPARAM lParam)
{
return(CallNextHookEx(g_hHook,nCode,wParam,lParam));
}
//---------------------------------------------------------------------------
// 输出,安装空的钩子函数
extern"C"__declspec(dllexport) bool InstallHook()
{
g_hinstDll=LoadLibrary("dll.dll"); // 这里的文件名为Dll本身的文件名
g_hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)Hook,g_hinstDll,0);
if (!g_hHook)
{
MessageBoxA(NULL,"SET ERROR","ERROR",MB_OK);
return(false);
}
return(true);
}
//---------------------------------------------------------------------------
// 输出,Uninstall钩子函数
extern"C"__declspec(dllexport) bool UninstallHook()
{
return(UnhookWindowsHookEx(g_hHook));
}
void HookOn()
{
AfxHookCode((void*)OpenProcess, (void*)MyOpenProcess, (void**)&OldProc, 5);
bHook=true;
}
//---------------------------------------------------------------------------
void HookOff()
{
AfxUnHookCode((void*)OpenProcess, OldProc, 5); // 恢复被hook的代码
bHook = false;
}
//---------------------------------------------------------------------------
int WINAPI DllMain(HINSTANCE hinst,unsigned long reason,void* lpReserved)
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
HookOn();
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
if(bHook) UninstallHook();
break;
}
return TRUE;
}
头文件就是用的
RING3代码HOOK的原理实现 文件中的那个,请高人指点下DLL全局HOOK API退出的问题,感谢!
[课程]Linux pwn 探索篇!