当前位置: 首页 > news >正文

C++ Windows Hook使用

GitHub - microsoft/Detours: Detours is a software package for monitoring and instrumenting API calls on Windows. It is distributed in source code form.

/*挂载钩子 setdll /d:C:\Users\g\source\repos\LotTest\Release\lotDll.dll C:\Users\g\source\repos\LotTest\bin\x86\Release\net6.0-windows\LotTest.exe
卸载钩子 setdll /r C:\Users\g\source\repos\LotTest\bin\x86\Release\net6.0-windows\LotTest.exe
*/#include <Windows.h>
#include "detours/detours.h"//真实的调用函数,函数原型必须和真实API一致。部分类型如果无法声明可以用void *替代
static int (WINAPI* REALMessageBox) (HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) = MessageBox;
//伪造的调用函数,也就是我们的钩子,参数类型和返回值必须和真实的一样,
static int WINAPI MYMessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
{//在这里可以任意发挥~~~//在函数末尾调用真正的API来返回return  REALMessageBox(NULL, "MyHook!! MessageBoxCRACK!!", "Please", MB_OK);
}void StartHook()
{long err;DetourRestoreAfterWith();//开始事务DetourTransactionBegin();//更新线程信息  DetourUpdateThread(GetCurrentThread());//将拦截的函数附加到原函数的地址上DetourAttach(&(PVOID&)REALMessageBox, MYMessageBox);//结束事务err = DetourTransactionCommit();
}//解除钩子
void EndHook()
{//开始事务DetourTransactionBegin();//更新线程信息 DetourUpdateThread(GetCurrentThread());//将拦截的函数从原函数的地址上解除DetourDetach(&(PVOID&)REALMessageBox, MYMessageBox);//结束事务DetourTransactionCommit();
}/*
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include "framework.h"extern void StartHook();//新增//新增一个导出函数,这个可以随便写,但必须至少有一个导出函数才能使用setdll远程注入
VOID __declspec(dllexport) test()
{OutputDebugString(L"__declspec(dllexport) test() \r\n");
}BOOL APIENTRY DllMain(HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved
)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:{ StartHook(); } //新增case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}
*/void injectProcess() {HANDLE hProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ,FALSE, pid);if (hProcess != NULL){TRACE("InjectHook \n");HANDLE hThread;char   szLibPath[_MAX_PATH];void* pLibRemote = 0;DWORD  hLibModule = 0;HMODULE hKernel32 = ::GetModuleHandle("Kernel32");if (!::GetSystemDirectory(szLibPath, _MAX_PATH))return;strcat(szLibPath, "C:\\windows\\HookDll.dll");pLibRemote = ::VirtualAllocEx(hProcess, NULL, sizeof(szLibPath), MEM_COMMIT, PAGE_READWRITE);if (pLibRemote == NULL)return;::WriteProcessMemory(hProcess, pLibRemote, (void*)szLibPath, sizeof(szLibPath), NULL);hThread = ::CreateRemoteThread(hProcess, NULL, 0,(LPTHREAD_START_ROUTINE) ::GetProcAddress(hKernel32, "LoadLibraryA"),pLibRemote, 0, NULL);if (hThread != NULL){::WaitForSingleObject(hThread, INFINITE);::GetExitCodeThread(hThread, &hLibModule);::CloseHandle(hThread);}}
}void test() {StartHook();PVOID g_pOldMessageBoxW = NULL;PVOID g_pOldMessageBoxA = NULL;g_pOldMessageBoxA = DetourFindFunction("User32.dll", "MessageBoxA");MessageBox(0, "test", "test", 0);EndHook();
}


创作不易,小小的支持一下吧!

相关文章:

  • 人机交互的AB面
  • 网络校时服务器:铁路对时有妙招
  • 基于Pytorch框架的深度学习Swin-Transformer神经网络食物分类系统源码
  • 微信小程序录音和头像上传
  • 学懂C#编程:常用高级技术【元组的详细使用(二)】——元组的概念及使用
  • 昇思25天学习打卡营第1天|基本介绍及快速入门
  • vivo手机录屏教程,这些方法你get到了吗?
  • Selenium屏幕截图技巧:实现自动化截屏并按日期时间格式保存图片
  • Java学习 (二)关键字、标识符、数组
  • 【归并排序】| 详解归并排序 力扣912
  • python调用chatgpt
  • 使用npm发布自己的插件包
  • C#.Net筑基-类型系统②常见类型
  • Python中的TXT文档处理:导出与读取
  • Ubuntu22.04之去除文件结尾的^M符号(二百五十三)
  • 10个最佳ES6特性 ES7与ES8的特性
  • ESLint简单操作
  • javascript 总结(常用工具类的封装)
  • js操作时间(持续更新)
  • JS题目及答案整理
  • leetcode46 Permutation 排列组合
  • MySQL几个简单SQL的优化
  • MySQL主从复制读写分离及奇怪的问题
  • Puppeteer:浏览器控制器
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 从零开始的无人驾驶 1
  • 基于游标的分页接口实现
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何实现 font-size 的响应式
  • 三栏布局总结
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (LeetCode C++)盛最多水的容器
  • (纯JS)图片裁剪
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (四)React组件、useState、组件样式
  • (算法)硬币问题
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • .config、Kconfig、***_defconfig之间的关系和工作原理
  • .net 流——流的类型体系简单介绍
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .net6Api后台+uniapp导出Excel
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • [ solr入门 ] - 利用solrJ进行检索
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [2010-8-30]