穿越号线ltmsg.dll(穿越线路)
feilongw 2025-03-25 19:54 12 浏览
HOOK概述
Hook也就是钩子,在Windows中大部分的应用程序都是基于消息机制,会根据不同的消息使用消息过程函数完成不同的功能。而钩子是一种消息处理机制,它可以比你的应用程序先获得消息,可以用来截获、监视系统的消息,改变执行流程实现特定的功能。对于全局钩子来说,它会影响所有应用程序,所以钩子函数必须在DLL中实现。
函数介绍
SetWindowsHookEx
作用:
将程序定义的钩子函数安装到挂钩链中,安装钩子的程序可以监视系统是否存在某些类型的时间,这些事件与特定线程或调用线程所在的桌面中的所有线程相关联。
函数声明:
HHOOK WINAPI SetWindowsHookEx(
_In_ int idHook,
_In_ HOOKPROC lpfn,
_In_ HINSTANCE hMod,
_In_ DWORD dwThreadId
)
参数:
idHook:
安装的钩子程序的类型,具体值参考官方手册
lpfn:
指向钩子程序过程的指针,若参数dwThreadId为0或者指示了一个其他进程创建的线程之标识符,则参数lpfn必须指向一个动态链接中的挂钩处理过程。否则,参数lpfn可以指向一个与当前进程相关的代码中定义的挂钩处理过程。
hMod:
包含由lpfn参数指向的钩子过程的DLL句柄。
dwThreadId:
与钩子程序关联的线程标识符,如果为0,则钩子过程与系统中所有线程相关联。
返回值:
成功:返回钩子过程句柄
失败:返回NULL
UnhookWindowsHookEx
作用:
卸载钩子
函数声明:
BOOL WINAPI UnsetGlobalHook(
_In_ HHOOK hhk
)
参数:
hhk:
卸载的钩子句柄
实例代码
使用IDE:VS2019
创建一个DLL项目
pch.h:
#include "framework.h"
extern "C" _declspec(dllexport) int SetGlobalHook();
extern "C" _declspec(dllexport) LRESULT GetMsgProc(int code, WPARAM wParam, LPARAM lParam);
extern "C" _declspec(dllexport) BOOL UnsetGlobalHook();
#endif //PCH_H
dllmain.cpp
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
HMODULE g_hDllModule = NULL;
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: {
g_hDllModule = hModule;
break;
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
钩子过程:
SetGlobalHook(): 设置全局钩子,WH_GETMESSAGE为监视发送到消息队列的消息的钩子,第二个参数则为钩子的回调函数。
GetMsgProc(): 钩子的回调函数,CallNextHookEx表示将当前钩子传递给下一个钩子,若返回值为0,表示中断钩子传递,对钩子进行拦截。
UnsetGlobalHook(): 卸载钩子
共享内存: 由于全局钩子是以DLL形式加载到进程中,进程都是独立的,要将进程句柄传递给其他进程,可以使用共享内存突破进程独立性,使用"/SECTION:mydata,RWS"设置为可读可写可共享的数据段。
pch.cpp:
#include "pch.h"
#include #include extern HMODULE g_hDllModule;
// 共享内存
#pragma data_seg("mydata")
HHOOK g_hHook = NULL;
#pragma data_seg()
#pragma comment(linker, "/SECTION:mydata,RWS")
//钩子回调函数
LRESULT GetMsgProc(int code, WPARAM wParam, LPARAM lParam){
return ::CallNextHookEx(g_hHook, code, wParam, lParam);
}
// 设置钩子
BOOL SetGlobalHook() {
g_hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)GetMsgProc, g_hDllModule, 0);
if (NULL == g_hHook) {
return FALSE;
}
return TRUE;
}
// 卸载钩子
BOOL UnsetGlobalHook() {
if (g_hHook) {
UnhookWindowsHookEx(g_hHook);
}
return TRUE;
}
最终生成Dll1.dll
创建c++空项目
编译下面代码,将Dll1.dll放在生成的exe下,运行
hook.cpp:
#include #include typedef BOOL(*PEN_HOOKSTART)();
typedef BOOL(*PEN_HOOKSTOP)();
int main() {
//加载dll
HMODULE hDll = LoadLibrary(L"./Dll1.dll");
if (NULL == hDll)
{
printf("LoadLibrary Error[%d]\n", ::GetLastError());
return 1;
}
BOOL isHook = FALSE;
//导出函数地址
PEN_HOOKSTART SetGlobalHook = (PEN_HOOKSTART)GetProcAddress(hDll, "SetGlobalHook");
if (NULL == SetGlobalHook)
{
printf("SetGlobalHook:GetProcAddress Error[%d]\n", GetLastError());
return 2;
}
PEN_HOOKSTOP UnsetGlobalHook = (PEN_HOOKSTOP)GetProcAddress(hDll, "UnsetGlobalHook");
if (NULL == UnsetGlobalHook)
{
printf("UnsetGlobalHook:GetProcAddress Error[%d]\n", GetLastError());
return 3;
}
isHook=SetGlobalHook();
if (isHook) {
printf("Hook is ok!\n");
}
else {
printf("Hook is error[%d]\n", GetLastError());
}
system("pause");
UnsetGlobalHook();
FreeLibrary(hDll);
return 0;
}
查看效果
使用Process Explorer查看dll:
可以看到已经注入了Dll1.dll
参考文献
【网络安全学习攻略】
相关推荐
- java-verbose是什么意思 java -verbose
-
灵魂拷问:为什么short、byte会被提升为int?boolean到底多大?为什么short、byte会被提升为int?在学习Java语法的时候,知道short、byte、byte类型在做运...
- Android Hanlder 揭密之路- 深入理解异步消息传递机制Looper、Handler、Message三者关系
-
Handler知识点梳理:Handler、Looper以及Message三者之间的关系前言Handler、Looper以及Message之间的关系,概括性来说,Looper负责的是创建一个Me...
- csdn freemarker jquery 预览word
-
高质量人才助推高质量发展——西安市高新区“精益创业带动就业示范行动”系列活动西安市高新区“精益创业带动就业示范行动”系列活动已于8月日在高新区软件新城正式启动。本周五(8月日)上午点分,系列活动之“直...
- android 修改菜单menu背景
-
教你把手机的状态栏和通知栏改造成安卓L风格说道颜值,就得吐槽一下安卓及一下的版本了。原生真的是丑,丑到没朋友。到了安卓,谷歌终于大刀阔斧的对安卓的颜值进行了大动刀。【下拉通知栏】那么,安卓有没有办法搞...
- DCDC架构中 dcdc类型(dcdc的主要作用)
-
DC-DC工作原理,看完你就懂了上篇文章说了LDO的原理,那本篇就来说一下DCDC的工作原理吧。开关电源:是一种高频化电能转换装置,其主要利用电力电子开关器件(如晶体管、MOS管、可控晶闸管等),通过...
- getPath(),getAbsolutePath(),getCanonicalPath() 区别
-
java获取文件路径1.前言Java开发中我们经常要获取文件的路径,比如读取配置文件等等。今天我们就关于文件的路径和如何读取文件简单地探讨一下。2.文件的路径文件的路径通常有相对路径与绝对...
- android 多任务键app后台重新唤起生命周期 安卓任务管理器快捷键
-
好用的备忘录待办提醒APP任务管理工具怎么选?在这个信息高速流通的时代,选择一款合适的任务管理应用变得尤为关键。一个好的任务管理工具不仅能帮助我们更好地规划时间、提升效率,还能在快节奏的生活中保持条...
- android数据包下载地址 数据包apk
-
《地牢猎手5》安卓怎么下载APK数据包下载万众期待的地牢猎手5终于推出啦,此次Gameloft在安卓平台首发推出,不过目前谷歌商店还未提供正式下载数据包,不过不用担心,蚕豆网小编为大家带来了地牢猎手...
- 51c大模型~合集24(c5.0模型)
-
北大校友打造的个智能体「我的世界」,背后原理揭晓了!来源:量子位北大校友打造的个智能体「我的世界」,背后原理揭晓了!团队全新公开页技术报告,详尽解密AI智能体如何产生专业化分工、社交互动、甚至传播虚拟...
- ao3archive of own our如何使用
-
肖战ao3事件始末揭秘ao3是啥意思肖战粉丝举报AO3为什么惹众怒3月4日凌晨2时分,肖战工作室再次发表声明:肖战海外社交账号已无法正常登陆,任何更改均非本人及工作人员操作,后续动作均与肖战本人无关...
- ansible变量运算 ansible查看变量的命令
-
Python中的Ansible库在Python中集成Ansible功能,主要通过以下两种方式实现,结合官方库和核心API可满足不同场景的自动化需求:一、AnsibleRunner库Ansible官方...
- 25个简单shell例子(shell实例讲解)
-
shell编程其实真的很简单(一)如今,不会Linux的程序员都不意思说自己是程序员,而不会shell编程就不能说自己会Linux。说起来似乎shell编程很屌啊,然而不用担心,其实shell编程真的...
- ByConity ELT 测试体验
-
字节跳动开源云原生数仓引擎ByConity技术详解与应用导读本文介绍字节跳动开源的云原生数仓引擎,ByConity。主要包含四个主题:1.ByConity产生背景2.ByConity设计...
- 45个小众而实用的NLP开源字典和工具
-
从算法到产品:NLP技术的应用演变文章回顾了近几年NLP的发展历程,从项目实施的两个阶段中带我们梳理了NLP技术的应用演变。第一个与大家分享的Case,基于NLP展开。分为3个部分,分别是NLP的发展...
- [美国]《速度与激情6》[HD-RMVB.1024x576.中英双字][2013年动作]
-
安利电影。爱情:不良教育里克(费雷o马丁内兹饰)和伊格莱西奥(弗朗西斯科o拜奥拉饰)是教会学校的同学,更是一对同性恋人。学校的莫雷神父以留下恩里克为诱饵占有了伊格莱西奥,但最终恩里克还是离开了教会...
- 一周热门
- 最近发表
-
- java-verbose是什么意思 java -verbose
- Android Hanlder 揭密之路- 深入理解异步消息传递机制Looper、Handler、Message三者关系
- csdn freemarker jquery 预览word
- android 修改菜单menu背景
- DCDC架构中 dcdc类型(dcdc的主要作用)
- getPath(),getAbsolutePath(),getCanonicalPath() 区别
- android 多任务键app后台重新唤起生命周期 安卓任务管理器快捷键
- android数据包下载地址 数据包apk
- 51c大模型~合集24(c5.0模型)
- ao3archive of own our如何使用
- 标签列表
-