Dll注入:Windows消息钩子注入
SetWindowsHook() 是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。
钩子机制允许应用程序截获处理window消息或特定事件。
HHOOK WINAPI SetWindowsHookEx(
__in int idHook, \\钩子类型
__in HOOKPROC lpfn, \\回调函数地址
__in HINSTANCE hMod, \\实例句柄
__in DWORD dwThreadId); \\线程ID
使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。 SetWindowsHookEx函数总是在Hook链的开头安装Hook子程。当指定类型的Hook监视的事件发生时,系统就调用与这个Hook关联的 Hook链的开头的Hook子程。每一个Hook链中的Hook子程都决定是否把这个事件传递到下一个Hook子程。Hook子程传递事件到下一个 Hook子程需要调用CallNextHookEx函数。
系统钩子
SetWindowsHookEx()函数的最后一个参数决定了此钩子是系统钩子还是线程钩子。
线程钩子
#include "stdafx.h"
#include <Windows.h>
#include<TlHelp32.h>
#include<iostream> using namespace std; BOOL InjectDllBySetWindowsHook(ULONG32 ulTargetProcessID);
DWORD getThreadID(ULONG32 ulTargetProcessID);
int main()
{ ULONG32 ulTargetProcessID;
cout << "请输入目标进程ID:";
cin >> ulTargetProcessID; if (!InjectDllBySetWindowsHook(ulTargetProcessID))
{
cout << "Set Hook Unsuccess!\r\n" << endl;
return ;
}
cout << "Inject Success!\r\n" << endl;
return ;
return ;
} BOOL InjectDllBySetWindowsHook(ULONG32 ulTargetProcessID)
{
HANDLE TargetProcessHandle = NULL;
TargetProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ulTargetProcessID); if (NULL == TargetProcessHandle)
{
printf("Couldn't get Target Process Handle\r\n");
return FALSE;
} HMODULE DllModule = LoadLibrary(L"Dll.dll"); if (DllModule == NULL)
{
printf("cannt find dll\r\n");
return FALSE;
} //获取Dll中导出的函数的地址
HOOKPROC Sub_1Address = NULL;
Sub_1Address = (HOOKPROC)GetProcAddress(DllModule, "MyMessageProcess");
if (Sub_1Address == NULL)
{
printf("cannt found MyMessageProcess");
return FALSE;
} DWORD ThreadID = getThreadID(ulTargetProcessID); HHOOK Handle = SetWindowsHookEx(WH_KEYBOARD,
Sub_1Address, DllModule, ThreadID); if (Handle == NULL)
{
printf("cannt hook\r\n");
return FALSE;
}
printf("hook success\r\n");
getchar();
getchar();
getchar();
UnhookWindowsHookEx(Handle); FreeLibrary(DllModule);
} DWORD getThreadID(ULONG32 ulTargetProcessID)
{
HANDLE Handle = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, );
if (Handle != INVALID_HANDLE_VALUE)
{
THREADENTRY32 te;
te.dwSize = sizeof(te);
if (Thread32First(Handle, &te))
{
do
{
if (te.dwSize >= FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) + sizeof(te.th32OwnerProcessID))
{
if (te.th32OwnerProcessID == ulTargetProcessID)
{
HANDLE hThread = OpenThread(READ_CONTROL, FALSE, te.th32ThreadID);
if (!hThread)
{
printf("Couldn't get thread handle\r\n");
}
else
{
return te.th32ThreadID;
}
}
}
} while (Thread32Next(Handle, &te));
}
}
CloseHandle(Handle);
return (DWORD);
}
Dll部分:
#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:
{
MessageBox(NULL, L"Inject Success!", L"", );
} case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
} extern "C" __declspec(dllexport)LRESULT MyMessageProcess(int Code, WPARAM wParam, LPARAM lParam)
{
//
//你自己对消息的处理
//
MessageBox(NULL, L"GetMessage!", L"Message", );
return CallNextHookEx(g_hHook, Code, wParam, lParam);
}
可参考百度百科
Dll注入:Windows消息钩子注入的更多相关文章
- windows消息钩子注册底层机制浅析
标 题: [原创]消息钩子注册浅析 作 者: RootSuLe 时 间: 2011-06-18,23:10:34 链 接: http://bbs.pediy.com/showthread.php?t= ...
- windows消息钩子
1.消息钩子的概念: Windows应用程序是基于消息驱动的,不论什么线程仅仅要注冊窗体类都会有一个消息队列用于接收用户输入的消息和系统消息.为了拦截消息,Windows提出了钩子的概念.钩子(Hoo ...
- Dll注入技术之消息钩子
转自:黑客反病毒 DLL注入技术之消息钩子注入 消息钩子注入原理是利用Windows 系统中SetWindowsHookEx()这个API,他可以拦截目标进程的消息到指定的DLL中导出的函数,利用这个 ...
- DLL注入之windows消息钩取
DLL注入之windows消息钩取 0x00 通过Windows消息的钩取 通过Windows消息钩取可以使用SetWindowsHookEx.该函数的原型如下: SetWindowsHookEx( ...
- 安装全局消息钩子实现dll窗体程序注入
说明{ 通过设置全局消息钩子来实现dll注入,然后窗体有相关消息请求的时候就会自动加载注入dll, 然后在入口处做处理就可以了.注入方式简单很多,比代码注入和lsp等注入都简单,就不解释了. ...
- 常见注入手法第四讲,SetWindowsHookEx全局钩子注入.以及注入QQ32位实战.
常见注入手法第四讲,SetWindowsHookEx全局钩子注入.以及注入QQ32位实战. PS:上面是操作.最后是原理 一丶需要了解的API 使用全局钩子注入.我们需要了解几个WindowsAPI. ...
- Win32环境下代码注入与API钩子的实现(转)
本文详细的介绍了在Visual Studio(以下简称VS)下实现API钩子的编程方法,阅读本文需要基础:有操作系统的基本知识(进程管理,内存管理),会在VS下编写和调试Win32应用程序和动态链接库 ...
- Win32环境下代码注入与API钩子的实现
本文详细的介绍了在Visual Studio(以下简称VS)下实现API钩子的编程方法,阅读本文需要基础:有操作系统的基本知识(进程管理,内存管理),会在VS下编写和调试Win32应用程序和动态链接库 ...
- Dll注入:注册表注入
在系统中每一个进程加载User32.dll时,会受到DLL_PROCESS_ATTACH通知,当User32.dll对其进行处理时,会取得注册表键值HKEY_LOCAL_MACHINE\Softwar ...
随机推荐
- myeclipse 不能重新编译 web .classpath文件修改
这个问题困扰我好久了,就是当你从另一个workspace中拷到另一个workspace中,然后在import进myeclipse中就会出现无论你怎么改代码,编译完成后webroot目录下的classe ...
- 经典DP 嵌套矩形 (南洋理工ACM—16)
本来是个很水的DP,结果被自己的代码习惯给打败了 代码: #include<iostream> #include<stdlib.h> #include<string.h& ...
- MATLAB求解非线性方程组
matlab中有专门的solve函数来解决方程组的(a-x)^2+(b-y)^2=e^2(C-x)^2+(D-y)^2=v^2已知a,b,c,d,e,v 值求解 X,Y 请问用 matlab 如何写, ...
- 清北刷题冲刺 10-30 a.m
星空 #include<iostream> #include<cstdio> using namespace std; int n,m; int main(){ freopen ...
- 2017-10-7 清北刷题冲刺班p.m
测试 A 同花顺 文件名 输入文件 输出文件 时间限制 空间限制card.cpp/c/pas card.in card.out 1s 512MB题目描述所谓同花顺,就是指一些扑克牌,它们花色相同,并且 ...
- lynis检测
https://www.cnblogs.com/ssooking/p/6034402.html Usage: lynis command [options] Command: audit audit ...
- js unicode
参考 http://www.ruanyifeng.com/blog/2014/12/unicode.html
- ch8 -- useLK
useLK 光流法跟踪FAST角点 执行 ./useLK ../../data 运行程序. 光流法需要include<opencv2/video/tracking.hpp>,用到列表 ...
- 阿里云服务器 linux 怎么安装php(PHPSTUDY)开发环境
1.首先登录行云管家(https://yun.cloudbility.com/login.html) wget -c http://lamp.phpstudy.NET/phpstudy.bin //下 ...
- LeetCode初级算法(动态规划+设计问题篇)
目录 爬楼梯 买卖股票的最佳时机 最大子序和 打家劫舍 动态规划小结 Shuffle an Array 最小栈 爬楼梯 第一想法自然是递归,而且爬楼梯很明显是一个斐波拉切数列,所以就有了以下代码: c ...