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

图一:

图二:

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

最新文章

  1. [.NET领域驱动设计实战系列]专题十一:.NET 领域驱动设计实战系列总结
  2. ubuntu系统下的防火墙使用
  3. 【bzoj3624】【apio2008】免费道路
  4. Python之路-python数据类型(列表、字典、字符串、元祖)操作
  5. Mysql:Error Code 1235,This version of MySQL doesn’t yet support ‘LIMIT &amp; IN/ALL/ANY/SOME 错误解决
  6. SNF开发平台WinForm之七-单据打印和使用说明-SNF快速开发平台3.3-Spring.Net.Framework
  7. spoj 338
  8. 最常用的 Eclipse 快捷键总结
  9. Paths on a Grid
  10. checkbox 与JS的应用
  11. poj 1459 (最大流)
  12. 第十七章——配置SQLServer(1)——为SQLServer配置更多的处理器
  13. bzoj 2243 [SDOI2011]染色(树链剖分+线段树合并)
  14. View的放大-&gt;旋转-&gt;还原动画
  15. python3全栈开发- 元类metaclass(面试必考题)
  16. Vuex学习笔记(-)安装vuex
  17. java框架之springmvc
  18. kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries. 最无语的配置
  19. 用python实现websocket请求遇到的问题及解决方法。
  20. OAuth : open Authorization 开发授权

热门文章

  1. oracle使用+简写左关联出现的结果集不一致问题
  2. 拉勾网 + selenium
  3. mysql常见聚合函数
  4. error: RPC failed; curl 18 transfer closed with outstanding read data remaining的解决
  5. Dedecms 修改当前位置样式
  6. 轻量级进度条 – Nprogress.js
  7. Python爬虫小白入门(七)爬取豆瓣音乐top250
  8. Docker镜像与容器的常用操作
  9. Linux下常用命令(持续更新)
  10. Windows程序设计(2) - API-02 文件系统