首页
社区
课程
招聘
[求助]ring3 采用DLL式HOOK全局API如何退出
发表于: 2008-12-21 14:21 5583

[求助]ring3 采用DLL式HOOK全局API如何退出

2008-12-21 14:21
5583
在看完《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 探索篇!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 137
活跃值: (12)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
怎么没人理我
2008-12-21 18:42
0
雪    币: 137
活跃值: (12)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
我伤心,别人不顶自己顶下,问题解决了把些函数
extern"C"__declspec(dllexport) bool  UninstallHook() 
{ 
    return(UnhookWindowsHookEx(g_hHook)); 
} 

改为
extern"C"__declspec(dllexport) bool  UninstallHook() 
{ 
  HookOff() ;
    return(UnhookWindowsHookEx(g_hHook)); 
} 
把DLL入口函数改为
int WINAPI DllMain(HINSTANCE hinst,unsigned long reason,void* lpReserved) 
{ 
    switch (reason) 
    { 
      case DLL_PROCESS_ATTACH:
       HookOn();
        break; 
      case DLL_PROCESS_DETACH: 
        if(bHook) UninstallHook(); 
        break; 
    } 
    return TRUE; 
}
语法错误而已,我以为技术错误,搞了我两个星期!
2008-12-23 08:32
0
雪    币: 202
活跃值: (77)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
为啥现在的人上来就研究高难度的东西呢?
2008-12-23 12:36
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
g_hHook 写在共享节中
2008-12-23 12:38
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
因为现在的人学的太快了
2008-12-23 12:39
0
游客
登录 | 注册 方可回帖
返回
//