首页
社区
课程
招聘
[求助]全局HOOK不能HOOK,只能在动态装载该DLL的程序中用!
发表于: 2008-5-19 18:59 4994

[求助]全局HOOK不能HOOK,只能在动态装载该DLL的程序中用!

2008-5-19 18:59
4994
附代码:
请教大家问题出在哪?

DLL:
#include "stdafx.h"
#define EXPORT _declspec(dllexport)

#pragma data_seg("shared")
HINSTANCE g_hInst=NULL;
HHOOK g_hKeyboardHook=NULL;
HWND hDlog;
UINT wMessage;
char szAscii[100]={0};
unsigned char szKeyState[256];
#pragma data_seg()
#pragma comment(linker, "/section:shared,rws")

EXPORT LRESULT  CALLBACK  KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam);  

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                         )
{   
        switch(ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        g_hInst=(HINSTANCE)hModule;       
    default:
    return TRUE;
        }
}

extern "C" {

EXPORT BOOL HookAllApp(HWND hDlg,UINT message)
{
        hDlog=hDlg;
        wMessage=message;
        if(g_hKeyboardHook!=NULL) return FALSE;
        g_hKeyboardHook=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,g_hInst,NULL);
        return (g_hKeyboardHook!=NULL);
}

EXPORT BOOL UnHookAllApp()
{
        return UnhookWindowsHookEx(g_hKeyboardHook);
}
   

       
}

EXPORT LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{     
               
    GetKeyboardState(szKeyState);          
    lParam=lParam>>16;
    ToAscii(wParam,lParam,szKeyState,(unsigned short*)szAscii,0);
    PostMessage(hDlog,wMessage,(WPARAM)szAscii[0],NULL);
       
    return CallNextHookEx(g_hKeyboardHook,nCode,wParam,lParam);
}

主程序对话框:
// hookapp.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#define        ICO_MAIN        1000
#define        DLG_MAIN        1001
#define        IDC_TEXT        1002
#define WM_HOOK     WM_USER+1
#pragma comment(lib,"hook.lib")

extern "C" BOOL HookAllApp(HWND hDlg,UINT message);
extern "C" UnHookAllApp();
extern "C" LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam);

HINSTANCE hInstance;
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
                hInstance=GetModuleHandle(NULL);
                DialogBox(hInstance,(LPCTSTR)DLG_MAIN, NULL, (DLGPROC)About);               
                ExitProcess(NULL);

        return 0;
}

LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
        switch (message)
        {
                case WM_INITDIALOG:
                            HookAllApp(hDlg,WM_HOOK);
                                    return TRUE;
                case WM_CLOSE:
                            UnHookAllApp();
                            EndDialog(hDlg,NULL);
                           return TRUE;
                case WM_HOOK:                          
                          
                                       SetDlgItemText(hDlg,IDC_TEXT,(LPCTSTR)&wParam);
                              return TRUE;       
                default:
             break;

        }
        return FALSE;
}

资源就是那个EDIT框 ID=IDC_TEXT。

请大家帮忙看看为什么转其他窗口时就不能HOOK了?

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
2
因为你没有setwindowhookex阿

首先要setwindowhookex安装全局hook 然后dll才会进入所有的进程
2008-5-19 22:02
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
有啊 可能是代码字体小了你没看见吧

EXPORT BOOL HookAllApp(HWND hDlg,UINT message)
{
  hDlog=hDlg;
  wMessage=message;
  if(g_hKeyboardHook!=NULL) return FALSE;
  g_hKeyboardHook=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,g_hInst,NULL);
  return (g_hKeyboardHook!=NULL);
}

可以给我你的QQ么 想和你讨论下啊 我都潜水快2年了 难得第一次发帖啊~
2008-5-19 22:04
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
此问题已经自己解决了 不过还是谢谢zhuwg~
2008-5-20 07:20
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主能解释下自己的解决方法吗,想学习一下。
2008-5-23 14:16
0
游客
登录 | 注册 方可回帖
返回
//