注入(4)--消息钩子注入(SetWindowsHookEX)
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)相关推荐
- Anti 消息钩子注入
MSDN上对消息钩子的描述: The SetWindowsHookEx function installs an application-defined hook procedure into a h ...
- 注入技术--消息hook注入
1.简介 消息钩子注入. 对有窗口的进程. 容易被检测 SetWindowsHookExW的参数1如果空,则卸载钩子 2.代码 HHOOK hook = 0; DWORD msgInject(WCHA ...
- redistemplate注入为null_Windows DLL 注入技术
Windows DLL 注入技术 本文主要介绍四种常见的 Windows DLL 注入技术. 分别为全局钩子.远线程钩子.突破 SESSION 0 隔离的远线程注入和 APC 注入. 全局钩子注入 W ...
- 消息钩子与定时器(VC_Win32)
目录 消息钩子 定时器 (本章节中例子都是用 VS2005 编译调试的) 消息钩子 [概述][相关函数][编写消息钩子] 概述 钩子过程 操作系统在传递消息时,将我们感兴趣的消息先传递给HOOK过程, ...
- 安装全局消息钩子实现dll窗体程序注入
说明{ 通过设置全局消息钩子来实现dll注入,然后窗体有相关消息请求的时候就会自动加载注入dll, 然后在入口处做处理就可以了.注入方式简单很多,比代码注入和lsp等注入都简单,就不解释了. ...
- 关于dll注入方式的学习(全局钩子注入)
何为dll注入 DLL注入技术,一般来讲是向一个正在运行的进程插入/注入代码的过程.我们注入的代码以动态链接库(DLL)的形式存在.DLL文件在运行时将按需加载(类似于UNIX系统中的共享库(shar ...
- Win32环境下代码注入与API钩子的实现
Win32环境下代码注入与API钩子的实现 本文详细的介绍了在Visual Studio(以下简称VS)下实现API钩子的编程方法,阅读本文需要基础:有操作系统的基本知识(进程管理,内存管理),会在V ...
- 关于Windows消息钩子的理解与测试项目
前奏 近来一直在自学Windows Hook相关的知识,已经尝试多种注入方式.尤其对消息钩子方式很感兴趣,因为看到Spy++能够截获系统中绝大多数应用的消息流,就很想知道它的工作原理,打算制作属于自己 ...
- 计算机病毒对消息钩子的利用与对抗
作 者: dncwbc 时 间: 2011-10-07,23:57:15 链 接: http://bbs.pediy.com/showthread.php?t=141059 一.消息钩子的概念 ...
最新文章
- 有关IList 、List 使用Contains的问题
- 基于免费人脸识别的闸机开发及源码分享
- 基于visual Studio2013解决算法导论之012计数排序
- 如何用C语言编写PHP扩展的详解
- matlab循环矢量化 嵌套,在Matlab中对for循环进行矢量化,得到不同结果的看似等效的代码...
- Java的组合排列问题
- 兄dei,Python数据竞赛和5万现金奖励了解一下
- linux内核字符驱动设备,Linux学习笔记——linux内核字符设备驱动-Go语言中文社区...
- 【推荐实践】推荐系统中模型训练及使用流程的标准化
- 《程序员修炼之道》读后感02
- 如何搭建apache+tomcat集群
- 开源内容管理系统Drupal 修复信息泄露和 XSS 漏洞
- SSH端口转发的理解(精华)
- 寄云PaaS平台荣获“优秀创新项目奖”
- 表情识别(六)--局部特征学习和Handcrafted特征结合
- 【Rust学习笔记】Rust生命周期参数的详细阐述
- 计算机c盘满了怎么搬家,c盘满了怎么办 c盘怎么搬家【搬家步骤】
- LED字体下载,可视化大屏,数据可视化必备
- 【期末不挂】离散数学 · 常考题型你都会了叭~
- 影响虚拟主机访问速度的因素,主要有哪些?