DLL注入之windows消息钩取
0x00 通过Windows消息的钩取
通过Windows消息钩取可以使用SetWindowsHookEx。该函数的原型如下:
SetWindowsHookEx(
__in int idHook, \钩子类型
__in HOOKPROC lpfn, \回调函数地址
__in HINSTANCE hMod, \实例句柄
__in DWORD dwThreadId); \线程ID
)。
我们通过一个HookMain.exe实现对将要注入的dll的控制。HookMain源码如下:
#include "pch.h"
#include <iostream>
#include<Windows.h>
#include<conio.h>
using namespace std;
#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);
//获取导出函数
HookStart = (PFN_HOOKSTART)GetProcAddress(hDll, DEF_HOOKSTART);
HookStop = (PFN_HOOKSTOP)GetProcAddress(hDll, DEF_HOOKSTOP);
//开始钩取
HookStart();
//等待知道用户输入“q”
printf("press 'q'to quite! ");
while (_getch() != 'q');
//终止钩取
HookStop();
//卸载KeyHook.dll
FreeLibrary(hDll);
}
下面是监听键盘的钩子KeyHook的源码:
// KeyHook.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "Windows.h"
#define DEF_PROCESS_NAME "notepad.exe"
HINSTANCE g_hInstance = NULL;
HWND g_hwnd = NULL;
HHOOK g_hHook = NULL;
BOOL WINAPI DllMain(HINSTANCE hinstdll, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
g_hInstance = hinstdll;
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
char szPath[MAX_PATH] = { 0 , };//,
char *p = NULL;
if (nCode >= 0)
{
//0=key press,1=key release 当nCode=0是为键盘按下去,当nCode=1时表示键盘松开
if (!(lParam & 0x80000000))//释放键盘
{
GetModuleFileNameA(NULL, szPath, MAX_PATH);//函数GetModuleFileNameA的返回值会传给szPath
p = strrchr(szPath, '\');//strrchr函数比较szPath中出现‘\’的位置,并返回指针
//比较两个进程名称,若为notepad.exe则消息不回传递给应用(或者下一个钩子)
if (!_stricmp(p + 1, DEF_PROCESS_NAME))//strtcmp函数是比较两个字符串是否相等
return 1;
}
}
//若非notePad.exe,则调用CallNextHookEx()函数,将消息传递给应用程序(或者下一个钩子)
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
/*
下面这段是用C代替c++
*/
#ifdef __cplusplus//c++
extern "C" {
#endif
__declspec(dllexport) void HookStart()
{
g_hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInstance, 0);
}
__declspec(dllexport) void HookStop()
{
if (g_hHook)
{
UnhookWindowsHookEx(g_hHook);
g_hHook = NULL;
}
}
#ifdef __cplusplus
}
#endif
打开分别生成的Released文件,记住Hookmain.exe和KeyHook.dll放到一个盘目录下,HookMain用管理员方式打开。下面我们使用打开指定的被监听的程序notepad.exe,并用ProcessExpoler来查看的notepad.exe是否被注入。
图一:
图二:
图一是没有在natepad.exe中使用键盘的情况。图二是使用键盘的情况。我们可以看到图二中KeyHook.dll已经注入了notepad.exe进程中。(PS:本来今天晚上完成三种注入方式的,但是没办法,要准备该死的信息论了。所以今天只能草草写一个了。)