首页
社区
课程
招聘
[求助]线程键盘钩子问题
发表于: 2010-5-4 23:32 6688

[求助]线程键盘钩子问题

2010-5-4 23:32
6688
// dlltest.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"

HHOOK  g_hh = 0;
HANDLE g_hm = 0;

char  *szWindowName = "dddtese";

LRESULT CALLBACK KeyboardProc(
                                                          int code,       // hook code
                                                          WPARAM wParam,  // virtual-key code
                                                          LPARAM lParam   // keystroke-message information
                                                          )
{
        OutputDebugStringA("按键\r\n");
        if ((wParam==VK_HOME)&&((lParam&(1<<31))==0))
        {
                OutputDebugStringA("Hmoe\r\n");
        }
        return CallNextHookEx(g_hh,code,wParam,lParam);
}

extern        "C" __declspec(dllexport)void SetHook()
{

        OutputDebugString("注入\r\n");
        HWND hwnd = ::FindWindow(NULL,szWindowName);
        DWORD pid = 0;
        DWORD tid = 0;
        HINSTANCE hmod = NULL;
        if(hwnd)
        {
                OutputDebugStringA("找到窗口\r\n");
                tid = ::GetWindowThreadProcessId(hwnd,NULL);
                g_hh = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,(HINSTANCE)g_hm,tid);
                if(g_hh == NULL)
                        OutputDebugStringA("错误\r\n");
        }

}

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                         )
{
        if(ul_reason_for_call == DLL_PROCESS_ATTACH)
        {
                __asm int 3
                g_hm = hModule;
                SetHook();
        }
    return TRUE;
}

我把这个dll注入到目标进程里面,SetWindowsHookEx成功后按任何键却没有进入KeyboardProc,高手解答一下为什么

[注意]APP应用上架合规检测服务,协助应用顺利上架!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 231
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
明白了,挂钩子后线程不能结束,否则钩子会给回收掉,虽然不大明白原理,总算搞定

// dlldlg.cpp : 定义 DLL 应用程序的入口点。
//

#include "stdafx.h"

HHOOK  g_hh = 0;
HANDLE g_hm = 0;

char  *szWindowName = "dlgtett";

LRESULT CALLBACK KeyboardProc(
                                                          int code,       // hook code
                                                          WPARAM wParam,  // virtual-key code
                                                          LPARAM lParam   // keystroke-message information
                                                          )
{

        OutputDebugStringA("按键\r\n");
        if ((wParam==VK_HOME)&&((lParam&(1<<31))==0))
        {
                OutputDebugStringA("Hmoe\r\n");
        }
        return CallNextHookEx(g_hh,code,wParam,lParam);
}

extern  "C" __declspec(dllexport)void SetHook()
{

        OutputDebugString("注入\r\n");
        HWND hwnd = ::FindWindow(NULL,szWindowName);
        DWORD pid = 0;
        DWORD tid = 0;
        HINSTANCE hmod = NULL;
        if(hwnd)
        {
                OutputDebugStringA("找到窗口\r\n");
                tid = ::GetWindowThreadProcessId(hwnd,NULL);
                g_hh = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,(HINSTANCE)g_hm,tid);
                if(g_hh == NULL)
                        OutputDebugStringA("错误\r\n");
        }

}
DWORD ThreadProc(LPVOID lpParameter)
{
       
        SetHook();
        while(1)
        {
                Sleep(10000);
                continue;
        }

        return 1;

}

BOOL APIENTRY DllMain( HANDLE hModule,
                                          DWORD  ul_reason_for_call,
                                          LPVOID lpReserved
                                          )
{
        if(ul_reason_for_call == DLL_PROCESS_ATTACH)
        {
                __asm int 3
                g_hm = hModule;
                CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc,NULL,0,NULL);
        }
        return TRUE;
}
2010-5-5 11:37
0
雪    币: 75
活跃值: (823)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
明白了,挂钩子后线程不能结束,否则钩子会给回收掉,虽然不大明白原理,总算搞定


可能不是这样的,楼主的这种情况 setwindowshookex()只是在目标线程的本地hook表中添加一个hook项,只要目标线程还在继续运行,在它处理视窗报文时自会调用它本地hook表中的hook函数.感觉跟楼主创建的这个线程是否一直存在没多大关系.
造成楼主开始不能正常hook的原因可能是,调用sethook()的线程不是 目标线程所在进程的线程,导致hook函数没挂上.也就是 此dll的入口代码 不是在目标线程所在进程的线程中执行的.红色部分我还没想太明白,很有可能是错的
楼主能不能放个完整的简化版代码,我也想弄明白这个问题
2010-5-5 12:33
0
雪    币: 75
活跃值: (823)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
楼主把你注入dll的那部分代码也贴出来沙
2010-5-5 13:31
0
雪    币: 231
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
我随便用工具来注入的,没写代码
2010-5-5 15:14
0
雪    币: 231
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
恩,难道入口函数是系统线程在执行
我调试一下看看是那个线程在执行
2010-5-5 15:17
0
雪    币: 231
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
DWORD a = GetCurrentThreadId();
DWORD b = GetCurrentProcessId();
在入口测试一下是在本进程内,内核应该也是投递APC的方法来创建的并进入入口点的吧
2010-5-5 15:23
0
雪    币: 75
活跃值: (823)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
噢,这样啊,如果是那样,就应该不是 非本进程线程不能对本进程插局部hook的问题了
有你那个注入工具下载地址不
进入入口点好像不是通过apc来弄的,
LoadLibrary-〉LdrLoadDll-〉LdrpAttachProcess-〉LdrpCallDllEntry
LdrpCallDllEntry
{
  return  ((PDLLMAIN_FUNC)Module->EntryPoint)(Module->DllBase, dwReason, lpReserved);
}
2010-5-5 19:44
0
雪    币: 207
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
哇,厉害,发一下你的程序,我想测试一下我用的keyscrambler,看看哪个更厉害!
2010-5-6 17:33
0
游客
登录 | 注册 方可回帖
返回
//