本帖最后由 yuejunqi 于 2010-03-02 11:35:34 编辑

解决方案 »

  1.   

    不太懂,楼主咋没用SetWindowsHookEx函数啊
      

  2.   

    从ring0 修改 ring3, 就可以绕过COW但如果这样不如直接在ring0改
      

  3.   

    ring0不是谁都会的,再说那个稳定性也是问题!
      

  4.   

    不知道在哪个地方用setwindowshookex,有会的吗
      

  5.   

    想用全局钩子代码写在DLL中。
    SetWindowsHookEx的最后一个参数为0.
    给你写一段代码
    以下是MyDll.Dll的部分代码。
    //共享段
    #pragma data_seg("MySec")
    HWND g_hMain=NULL; //调用DLL的窗口句柄主要方便DLL和主程序通信
    #pragma data_seg()
    #pragma comment(linker,"/section:MySec,RWS")HHOOK g_Hook=NULL;
    HINSTANCE hInst=NULL; //dll实例BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // handle to the DLL module
    DWORD fdwReason,     // reason for calling function
    LPVOID lpvReserved   // reserved
    )
    {

    switch(fdwReason)
    {
    case DLL_PROCESS_ATTACH:
    hInst=hinstDLL;
    break;
    case DLL_PROCESS_DETACH:
    UnIntercept();
    break;
    }
    return true;
    }
    LRESULT CALLBACK MoniterProc(
       int nCode,     // hook code
       WPARAM wParam, // current-process flag
       LPARAM lParam  // message data
       )
    {
    //你想干的事情在这里写。
    .......
    //最后别忘了调用钩子链的下一个钩子。
    return CallNextHookEx(g_Hook,nCode,wParam,lParam);
    }
    BOOL SetAPIHook(HWND hwnd) 
    {
    //设置全局钩子
    g_Hook=SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)MoniterProc,hInst,0);  //第一个参数是你想下的钩子,此处是WH_CALLWNDPROC,第二个参数是钩到此消息后要执行的过程,第三个是本DLL的实列,最后一代表全局钩子。
    g_hMain=hwnd;
    if(g_Hook!=NULL)
    {
    return true;
    }
    else
    {
    return false;
    }
    }
    然后在主程序中可以动态或静态载入MyDLL.DLL
    然后调用SetAPIHook(m_hWnd)就OK了。