DLL注入之windows消息钩取

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!\n");

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.exeKeyHook.dll放到一个盘目录下,HookMain用管理员方式打开。下面我们使用打开指定的被监听的程序notepad.exe,并用ProcessExpoler来查看的notepad.exe是否被注入。

图一:

 

图二:

 

 

图一是没有在natepad.exe中使用键盘的情况。图二是使用键盘的情况。我们可以看到图二中KeyHook.dll已经注入了notepad.exe进程中。(PS:本来今天晚上完成三种注入方式的,但是没办法,要准备该死的信息论了。所以今天只能草草写一个了。)

posted @ 2018-11-13 19:07  2f28  阅读(994)  评论(0编辑  收藏  举报