RegisterShellHookWindow使用

来源:互联网 发布:战国之王刷金软件 编辑:程序博客网 时间:2024/04/30 18:56
2010年03月10日 星期三 20:12

   今晚因为某种用途用到RegisterShellHookWindow ,使用还是比较简单的,功能也不错,详细看下MSDN。把代码贴出来
HWND Hwnd = GetSafeHwnd();

msgShellHook = RegisterWindowMessage("SHELLHOOK");
   
RegisterShellHookWindow( Hwnd );
   
lpPrevWndProc = SetWindowLong( Hwnd , GWL_WNDPROC, (LONG)WindowProcxx );


/////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WindowProcxx(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{

CHAR szProcessPath[_MAX_PATH] = { 0 };
DWORD dwPid = 0;
#define HSHELL_APPCOMMAND 12

if( uMsg == msgShellHook)
{
   switch( wParam )
   {
   case HSHELL_WINDOWCREATED:
    {
    
     GetWindowThreadProcessId( (HWND)lParam ,&dwPid);
     if( dwPid != GetCurrentProcessId())
     {
      GetProcessName( dwPid , szProcessPath, _MAX_PATH );
      MessageBoxA(NULL,"窗口创建", szProcessPath, MB_OK);

     }
    }
    break;
   case HSHELL_APPCOMMAND:
    {
     MessageBoxA(NULL,"xx窗口创建", szProcessPath, MB_OK);
    }
   case HSHELL_REDRAW: //比如TAB也却换
    {
     MessageBoxA(NULL,"窗口HSHELL_REDRAW", szProcessPath, MB_OK);
    }
    break;
   default:
    break;
   }
}

return CallWindowProc((WNDPROC)lpPrevWndProc, hwnd, uMsg, wParam, lParam);

}

后注:
RegisterShellHookWindow
就是 NtUserCallHwnd 传入 72号。 这个数其实是个索引。用于索引_apfnSimpleCall
而 _apfnSimpleCall 是一个保存着许多函数指针的一个数据结构。我们可以通过下列的函数来调用_apfnSimpleCall里面的函数。因为这些函数的参数比较少,没有参数,一个参数或者俩个参数,所以下面的函数名号理解。
NtUserCallHwndParam NtUserCallNoParam NtUserCallOneParam NtUserCallTwoParam等
每个接受的INDEX是有限制的。
一些安全软件可能会HOOK NtUserCallOneParam NtUserCallTwoParam之类的。具体看 _apfnSimpleCall里面的指针,看你对哪个感兴趣就HOOK哪个。
或者直接修改 _apfnSimpleCall 里面的指针来达到目的也可以。这样比较隐蔽。
嗯,就看这些,有时间再看下,复习去。

原创粉丝点击