SetWindowsHookEx函数是微软提供给程序开发人员进行消息拦截的一个API。不过,他的功能不仅可以用作消息拦截,还可以进行DLL注入。
SetWindowsHookEx原型声明如下:

WINUSERAPI
HHOOK
WINAPI
SetWindowsHookExW(_In_ int idHook,_In_ HOOKPROC lpfn,_In_opt_ HINSTANCE hmod,_In_ DWORD dwThreadId);

idHook:指示将要安装的挂钩处理过程的类型。例如,idHook为“WH_CALLWNDPROC”时代表安装一个挂钩处理过程,在系统将消息发送至目标窗口处理过程之前对该消息进行监视。
lpfn:指向相应的挂钩处理过程。
hmod:指示了一个DLL句柄。该DLL包含参数lpfn所指向的挂钩处理过程
dwThreadId:指示了一个线程标示符,挂钩处理过程与线程相关。若此参数值为0,则该挂钩处理过程与所有现存的线程相关。
如果去掉消息钩子,可以用UnhookWindowsHookEx函数

Windows消息处理流程:

插入SetWindowsHookEx之后流程:

下面来看代码:

// MessageHook.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <Windows.h>
#include <Tlhelp32.h>BOOL SetWinHookInject(WCHAR * wzDllPath, WCHAR * wzProcessName);
UINT32 GetTargetThreadIdFromProcessName(WCHAR *ProcessName);
int main()
{WCHAR wzProcessName[0x20] = L"Target.exe";WCHAR wzDllFullPath[0x20] = L"MessageHookDll.dll";if (!SetWinHookInject(wzDllFullPath, wzProcessName)){OutputDebugString(L"Set Hook Unsuccess!\r\n");return 0;}OutputDebugString(L"Inject Success!\r\n");return 0;
}//
//利用Windows API SetWindowsHookEx实现注入DLL
//
BOOL SetWinHookInject(WCHAR * wzDllPath, WCHAR * wzProcessName)
{HMODULE ModuleHandle = NULL;BOOL    bOk = FALSE;DWORD   FunctionAddress = NULL;UINT32  dwThreadId = 0;HHOOK   g_hHook = NULL;PVOID   pShareM = NULL;OutputDebugString(L"[+] SetWinHKInject Enter!\n");ModuleHandle = LoadLibrary(wzDllPath);if (!ModuleHandle){OutputDebugString(L"[+] LoadLibrary error!\n");goto Exit;}FunctionAddress = (DWORD)GetProcAddress(ModuleHandle, "MyMessageProc");if (!FunctionAddress){OutputDebugString(L"[+] GetProcAddress error!\n");goto Exit;}dwThreadId = GetTargetThreadIdFromProcessName(wzProcessName);if (!dwThreadId)goto Exit;//设消息钩子g_hHook = SetWindowsHookEx(WH_GETMESSAGE,//WH_KEYBOARD,//WH_CALLWNDPROC,(HOOKPROC)FunctionAddress,ModuleHandle,dwThreadId);if (!g_hHook){OutputDebugString(L"[-] SetWindowsHookEx error !\n");goto Exit;}OutputDebugString(L"[!] SetWinHKInject Exit!\n");bOk = TRUE;
Exit:if (ModuleHandle)FreeLibrary(ModuleHandle);return bOk;}//通过进程名获得线程ID
UINT32 GetTargetThreadIdFromProcessName(WCHAR *ProcessName)
{PROCESSENTRY32 pe;HANDLE SnapshotHandle = NULL;HANDLE ProcessHandle = NULL;BOOL Return, ProcessFound = FALSE;UINT32 pTID, ThreadID;SnapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (SnapshotHandle == INVALID_HANDLE_VALUE){MessageBox(NULL, L"Error: unable to create toolhelp snapshot", L"Loader", NULL);return FALSE;}pe.dwSize = sizeof(PROCESSENTRY32);Return = Process32First(SnapshotHandle, &pe);while (Return){if (_wcsicmp(pe.szExeFile, ProcessName) == 0){ProcessFound = TRUE;break;}Return = Process32Next(SnapshotHandle, &pe);pe.dwSize = sizeof(PROCESSENTRY32);}CloseHandle(SnapshotHandle);//通过fs寄存器获取TID_asm {mov eax, fs:[0x18]add eax, 36mov[pTID], eax}ProcessHandle = OpenProcess(PROCESS_VM_READ, FALSE, pe.th32ProcessID);ReadProcessMemory(ProcessHandle,(LPCVOID)pTID, &ThreadID, 4, NULL);CloseHandle(ProcessHandle);return ThreadID;
}
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
#include <Windows.h>#pragma data_seg(SHARD_SEG_NAME)
static HHOOK g_hHook;
#pragma data_seg()BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:{////加入你想在目标进程空间HOOK的代码//MessageBox(NULL, L"Inject Success!", L"Message", 0);}case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}__declspec(dllexport)LRESULT MyMessageProcess(int Code, WPARAM wParam, LPARAM lParam)
{////你自己对消息的处理//return CallNextHookEx(g_hHook, Code, wParam, lParam);
}

注入(4)--消息钩子注入(SetWindowsHookEX)相关推荐

  1. Anti 消息钩子注入

    MSDN上对消息钩子的描述: The SetWindowsHookEx function installs an application-defined hook procedure into a h ...

  2. 注入技术--消息hook注入

    1.简介 消息钩子注入. 对有窗口的进程. 容易被检测 SetWindowsHookExW的参数1如果空,则卸载钩子 2.代码 HHOOK hook = 0; DWORD msgInject(WCHA ...

  3. redistemplate注入为null_Windows DLL 注入技术

    Windows DLL 注入技术 本文主要介绍四种常见的 Windows DLL 注入技术. 分别为全局钩子.远线程钩子.突破 SESSION 0 隔离的远线程注入和 APC 注入. 全局钩子注入 W ...

  4. 消息钩子与定时器(VC_Win32)

    目录 消息钩子 定时器 (本章节中例子都是用 VS2005 编译调试的) 消息钩子 [概述][相关函数][编写消息钩子] 概述 钩子过程 操作系统在传递消息时,将我们感兴趣的消息先传递给HOOK过程, ...

  5. 安装全局消息钩子实现dll窗体程序注入

    说明{      通过设置全局消息钩子来实现dll注入,然后窗体有相关消息请求的时候就会自动加载注入dll, 然后在入口处做处理就可以了.注入方式简单很多,比代码注入和lsp等注入都简单,就不解释了. ...

  6. 关于dll注入方式的学习(全局钩子注入)

    何为dll注入 DLL注入技术,一般来讲是向一个正在运行的进程插入/注入代码的过程.我们注入的代码以动态链接库(DLL)的形式存在.DLL文件在运行时将按需加载(类似于UNIX系统中的共享库(shar ...

  7. Win32环境下代码注入与API钩子的实现

    Win32环境下代码注入与API钩子的实现 本文详细的介绍了在Visual Studio(以下简称VS)下实现API钩子的编程方法,阅读本文需要基础:有操作系统的基本知识(进程管理,内存管理),会在V ...

  8. 关于Windows消息钩子的理解与测试项目

    前奏 近来一直在自学Windows Hook相关的知识,已经尝试多种注入方式.尤其对消息钩子方式很感兴趣,因为看到Spy++能够截获系统中绝大多数应用的消息流,就很想知道它的工作原理,打算制作属于自己 ...

  9. 计算机病毒对消息钩子的利用与对抗

    作 者: dncwbc 时 间: 2011-10-07,23:57:15 链 接: http://bbs.pediy.com/showthread.php?t=141059 一.消息钩子的概念     ...

最新文章

  1. 有关IList 、List 使用Contains的问题
  2. 基于免费人脸识别的闸机开发及源码分享
  3. 基于visual Studio2013解决算法导论之012计数排序
  4. 如何用C语言编写PHP扩展的详解
  5. matlab循环矢量化 嵌套,在Matlab中对for循环进行矢量化,得到不同结果的看似等效的代码...
  6. Java的组合排列问题
  7. 兄dei,Python数据竞赛和5万现金奖励了解一下
  8. linux内核字符驱动设备,Linux学习笔记——linux内核字符设备驱动-Go语言中文社区...
  9. 【推荐实践】推荐系统中模型训练及使用流程的标准化
  10. 《程序员修炼之道》读后感02
  11. 如何搭建apache+tomcat集群
  12. 开源内容管理系统Drupal 修复信息泄露和 XSS 漏洞
  13. SSH端口转发的理解(精华)
  14. 寄云PaaS平台荣获“优秀创新项目奖”
  15. 表情识别(六)--局部特征学习和Handcrafted特征结合
  16. 【Rust学习笔记】Rust生命周期参数的详细阐述
  17. 计算机c盘满了怎么搬家,c盘满了怎么办 c盘怎么搬家【搬家步骤】
  18. LED字体下载,可视化大屏,数据可视化必备
  19. 【期末不挂】离散数学 · 常考题型你都会了叭~
  20. 影响虚拟主机访问速度的因素,主要有哪些?

热门文章

  1. oracle增加字段失败,oracle添加字段引起的问题
  2. 低代码,怎么秃然就火了?
  3. 华为gauss数据库常见的13种数据类型介绍
  4. 你在生活中有哪些观人术和识人技巧
  5. 1027-特色酒店后台管理系统servlet
  6. navicat 怎么调试存储过程_mysql如何调试存储过程
  7. linux同步两台服务器时间,同步两台linux服务器时间同步方案
  8. java遍历文件夹下的_Java遍历文件夹下的所以文件
  9. Redis大量数据插入
  10. IGD+-EMOA:基于IGD+的多目标进化算法