记事本键盘消息Hooking练习与调试

一、记事本键盘钩取

钩子程序包含两个文件:HookMain.exe和KeyHook.dll文件

运行HookMain.exe程序,出现运行窗口和提示信息

Win+R输入notepad打开记事本程序,输入任意字符发现无法显示出来

打开ProcessExplorer程序,查看notepad.exe中,可以看到加载的KeyHook.dll

可以搜索下注入KeyHook.dll的所有进程

按q停止HookMain.exe,此时notepad可以输入字符,相关进程将KeyHook.dll卸载

二、HookMain.cpp源码

#include "stdio.h"
#include "conio.h"
#include "windows.h"

#define	DEF_DLL_NAME		"KeyHook.dll"
#define	DEF_HOOKSTART		"HookStart"
#define	DEF_HOOKSTOP		"HookStop"

typedef void (*PFN_HOOKSTART)();
typedef void (*PFN_HOOKSTOP)();

void main()
{
	HMODULE			hDll = NULL;
	PFN_HOOKSTART	HookStart = NULL;
	PFN_HOOKSTOP	HookStop = NULL;
	char			ch = 0;

    // KeyHook.dll 加载 
	hDll = LoadLibraryA(DEF_DLL_NAME);
    if( hDll == NULL )
    {
        printf("LoadLibrary(%s) failed!!! [%d]", DEF_DLL_NAME, GetLastError());
        return;
    }

    // 获取导出函数地址 
	HookStart = (PFN_HOOKSTART)GetProcAddress(hDll, DEF_HOOKSTART);
	HookStop = (PFN_HOOKSTOP)GetProcAddress(hDll, DEF_HOOKSTOP);

    // 开始钩取 
	HookStart();

    // 输入q退出 
	printf("press 'q' to quit!\n");
	while( _getch() != 'q' )	;

    // 停止钩取 
	HookStop();
	
    // KeyHook.dll 卸载
	FreeLibrary(hDll);
}

三、HookMain.exe调试

1、载入OD,查找关键字符串

2、找到HookMain.exe主程序,在调用开头设置断点

3、F8调试找到HookStart()函数

4、F7跟进分析

根据SetWindowsHookExW()函数 参数定义 知道钩子过程的地址为10001020

四、调试Notepad.exe进程中的KeyHook.dll

1、OD载入notepad.exe程序并运行

2、在OD中设置:选项 — 调试设置 — 事件 — 中断于新模块dll 勾选

3、在notepad中输入字符触发调试选项断点,弹出Executable Modules,找到KeyHook.dll

4、双击来到汇编界面

在汇编命令窗口找到之前分析的钩子过程地址10001020,设置断点,设置调试选项取消dll中断,此时运行程序触发钩子时会中断在10001020断点处

您可能还喜欢...