首页
社区
课程
招聘
键盘线程钩子安装成功但是总是无法实现注入?
发表于: 2013-6-1 19:18 7140

键盘线程钩子安装成功但是总是无法实现注入?

2013-6-1 19:18
7140
以下是DLL中的代码:

DxfWGDlg *pGameDlg = NULL;

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{        
        AFX_MANAGE_STATE(AfxGetStaticModuleState());  
        if(wParam == VK_HOME && ((lParam&(1<<31))==0))  
        {
                ::AfxMessageBox("Home按下");  
                if (pGameDlg == NULL)
                {       
                        pGameDlg = new DxfWGDlg();
                        pGameDlg->Create(IDD_DIALOG1);
                        pGameDlg->ShowWindow(SW_SHOW);
                }
        }
        return ::CallNextHookEx(g_hhook, nCode, wParam ,lParam);
}  

HMODULE WINAPI ModuleFromAddress(PVOID pv)  
{  
    MEMORY_BASIC_INFORMATION mbi;  
    if(::VirtualQuery(pv,&mbi,sizeof(mbi))!=0)  
        return (HMODULE)mbi.AllocationBase;  
    else  
        return NULL;  
}  

bool ThreadList(DWORD Pid)
{
        HANDLE hThreadSnap;
        THREADENTRY32 th32;
        hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,NULL);
        DWORD index = 0;

        bool bFound = false;
        if (hThreadSnap == INVALID_HANDLE_VALUE)
        {
                return false;
        }
        th32.dwSize = sizeof(THREADENTRY32);
        if (!Thread32First(hThreadSnap, &th32))
        {
                CloseHandle(hThreadSnap);
                return false;
        }
        do
        {
                if ( Pid == th32.th32OwnerProcessID)
                {
                        if(!bFound )bFound=true;
                        if(!(g_hhook = ::SetWindowsHookEx(WH_KEYBOARD, KeyboardProc,ModuleFromAddress(KeyboardProc),th32.th32ThreadID)))
                        {
                                bFound = false;
                                break;
                        }
                }

        }while(Thread32Next(hThreadSnap, &th32));
        CloseHandle(hThreadSnap);

        return bFound;
}

bool SetHook()
{
        AFX_MANAGE_STATE(AfxGetStaticModuleState());  
        if (g_hhook == NULL)
        {       
                DWORD Pid,ThreadId;
                ThreadId = GetWindowThreadProcessId(::FindWindow(NULL,"计算器"),&Pid);  
                if(Pid == 0)  
                {  
                        AfxMessageBox("获取进程失败");  
                        return FALSE;
                }  
                ThreadList(Pid);
                //ThreadId = GetWindowThreadProcessId(::FindWindow(NULL,"计算器"),NULL);  
                //原先这里用的这种方式但是不行,后来在在网上搜了下改成现在的遍历线程的方法还是失败
                if (g_hhook != NULL)
                {
                        return TRUE;
                }
        }
        return FALSE;
}

最后发现其实钩子函数根本执行不进去的,很困扰啊,求教解决方法!!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你把SetWindowsHookEx最后一个参数设置成0,测试下看看
2013-6-1 19:36
0
雪    币: 169
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我没说用全局钩子啊,那个本来是可以的
2013-6-1 19:47
0
雪    币: 59
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
在哪弄来的代码?
2013-6-1 20:45
0
雪    币: 169
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
如果把最后一个参数设为0的话,在线程里调用SetHook就会失败,不再线程里调用就成功了。很不解。用线程钩子的话都不会成功
2013-6-1 20:56
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
http://bbs.csdn.net/topics/390040504 这个帖子的倒数两个回帖别人写了个dll,一个exe,代码也很清晰,你拿这个测试下
2013-6-1 23:13
0
游客
登录 | 注册 方可回帖
返回
//