我用钩子注入的练习 下面是我写的三个文件
DLL.dll被注入的目标.exe安装钩子.exe钩子类型: WH_GETMESSAGE 现在的问题是 我安装钩子后 点击下面按钮
void CEXEDlg::OnBtnPost_Message() 
{  HWND hwnd = ::FindWindow(NULL,"被注入的目标");
    if( hwnd == 0 )
        AfxMessageBox("error");
    else{
        ::PostMessage(hwnd,WM_KEYDOWN,72,0);//72是h的键值
    }
    
}下面是钩子过程
extern "C" LRESULT CALLBACK keybordProc( int code, WPARAM wparam, LPARAM lparam )
{
    if ( code == HC_ACTION )
    {
        MSG *msg = (MSG*)lparam;
        if ( msg->message == WM_CHAR )
        {
            if ( msg->wParam == 'h')
            {    
                  afxMessageBox("华丽地弹出");
            }
        }
    }
    
    return CallNextHookEx( g_hHook, code, wparam, lparam );
}会弹好几次      华丽地弹出 这是问题一!!!!!!!!!!!!!!!!!!!!问题二:: 我把 安装钩子.exe 关了 DLL.dll也从  被注入的目标.exe 中消失了
那怎么样才可以 关了安装钩子.exe  DLL.dll 还是在 被注入的目标.exe 的程序中呢~ 

解决方案 »

  1.   

    void CEXEDlg::OnBtn_Hook() 
    {
    // TODO: Add your control notification handler code here
    HWND hWnd = ::FindWindow(NULL,"Target");
    if( hWnd == 0 ){
            AfxMessageBox("error");
    }
    else{
    DWORD dwThreadID = GetWindowThreadProcessId(hWnd,NULL);
    StartHook( dwThreadID );//打开钩子
        }

    }extern "C" BOOL WINAPI StartHook( DWORD dwThreadID )
    {
    g_hHook = SetWindowsHookEx( WH_GETMESSAGE, keybordProc, g_hInstance, dwThreadID );
    if ( g_hHook != NULL)
    {
    return TRUE;

    else
    {
    return FALSE;
    }
    }
      

  2.   

    问题二:: 我把 安装钩子.exe 关了 DLL.dll也从  被注入的目标.exe 中消失了 
    那怎么样才可以 关了安装钩子.exe  DLL.dll 还是在 被注入的目标.exe 的程序中呢~ 
    =========
    问题不清楚,但是问题二这样是正常的,安装钩子的程序退出了,钩子也就退出了.
      

  3.   

    钩子我不懂,但我知道如何能让注入程序关闭后,DLL还在被注入的程序中。
    你可以上百度搜“汪普振”这个名字,有一篇文章写的“远程线程注入技术的研究与实现”
      

  4.   

    HOOK像窗口一样是属于一个创建它的线程的,如果线程退出,这个钩子会被系统自动卸载。