ring3 & ring0 通用InlineHook代码

Win64 驱动内核编程-23.Ring0 InLineHook 和UnHook Ring0InLineHook和UnHook 如果是要在R0里hook,作者的建议是InLineHOOK,毕竟SSDTHOOK和SHADOWSSDTHOOK比较麻烦,不好修改。目前R3的InLineHOOK我比较喜欢的是MINIHOOKENGINE,但是今天要解决的是R0的InLineHOOK问题。 下面说下InLineHOOK的思路: 一、实现... 阅读详情
 作者: cooldiyer

一晚上的战绩, 希望尊重版权, 写一个ring3下的例子,ring0下就不写了,很简单
复制内容到剪贴板
代码:
#include <stdio.h>
#include "InlineHook.h"

typedef void (__stdcall *__Sleep)(DWORD);
__Sleep realSleep = NULL;

VOID
__stdcall
MySleep(
IN DWORD dwMilliseconds
)
{
printf("Sleep(%d) Called/n", dwMilliseconds);
return realSleep(dwMilliseconds);
}

int main(int argc, char* argv[])
{
InlineHook(Sleep, MySleep, &realSleep);
Sleep(10);
UnInlineHook(Sleep, realSleep);
return 0;
}
主文件代码如下

[Copy to clipboard] [ - ]CODE:
/*++
Copyright (c) 2008/08/27 By CoolDiyer
Abstract:
Ring3 & Ring0 all-purpose inline hook module

--*/
#if !defined(AFX_INLINEHOOK_H_INCLUDED)
#define AFX_INLINEHOOK_H_INCLUDED
#ifdef WIN32
#include <windows.h>
#define JMP_SIZE 5
#else
#include <windef.h>
#define JMP_SIZE 7
#endif

#include "LDasm.h"

BOOL
GetPatchSize(
IN void *Proc, /* 需要Hook的函数地址 */
IN DWORD dwNeedSize, /* Hook函数头部占用的字节大小 */
OUT LPDWORD lpPatchSize /* 返回根据函数头分析需要修补的大小 */
)
/*++
计算函数头需要Patch的大小
--*/
{
DWORD Length;
PUCHAR pOpcode;
DWORD PatchSize = 0;
if (!Proc || !lpPatchSize)
{
return FALSE;
}
do
{
Length = SizeOfCode(Proc, &pOpcode);
if ((Length == 1) && (*pOpcode == 0xC3)) break;
if ((Length == 3) && (*pOpcode == 0xC2)) break;
Proc = (PVOID)((DWORD)Proc + Length);
PatchSize += Length;
if (PatchSize >= dwNeedSize)
{
break;
}
} while (Length);
*lpPatchSize = PatchSize;
return TRUE;
}
BOOL
InlineHook(
IN void *OrgProc, /* 需要Hook的函数地址 */
IN void *NewProc, /* 代替被Hook函数的地址 */
OUT void **RealProc /* 返回原始函数的入口地址 */
)
/*++
对函数进行Inline Hook
--*/
{
DWORD dwPatchSize; // 得到需要patch的字节大小
DWORD dwOldProtect;
LPVOID lpHookFunc; // 分配的Hook函数的内存
DWORD dwBytesNeed; // 分配的Hook函数的大小
LPBYTE MappedProc = NULL;
#ifndef WIN32
PMDL pMdlSystemCall = NULL;
#endif
if (!OrgProc || !NewProc || !RealProc)
{
return FALSE;
}
// 得到需要patch的字节大小
if (!GetPatchSize(OrgProc, JMP_SIZE, &dwPatchSize))
{
return FALSE;
}
/*
0x00000800 0x00000800 sizeof(DWORD) // dwPatchSize
JMP / FAR 0xAABBCCDD E9 DDCCBBAA JMP_SIZE
... ... dwPatchSize // Backup instruction
JMP / FAR 0xAABBCCDD E9 DDCCBBAA JMP_SIZE
*/
dwBytesNeed = sizeof(DWORD) + JMP_SIZE + dwPatchSize + JMP_SIZE;
#ifdef WIN32
MappedProc = OrgProc;
// 使前几个字节的内存可写
VirtualProtect(MappedProc, dwPatchSize, PAGE_EXECUTE_READWRITE, &dwOldProtect);
lpHookFunc = VirtualAlloc(NULL, dwBytesNeed, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
#else
pMdlSystemCall = IoAllocateMdl(
OrgProc,
dwPatchSize,
0,
0,
NULL
);
if(!pMdlSystemCall)
return FALSE;
MmBuildMdlForNonPagedPool(pMdlSystemCall);
MappedProc = (LPBYTE)MmMapLockedPages(pMdlSystemCall, KernelMode);
lpHookFunc = ExAllocatePool(NonPagedPool, dwBytesNeed);
#endif

*(DWORD *)lpHookFunc = dwPatchSize;
// 跳过开头的4个字节
lpHookFunc = (LPVOID)((DWORD)lpHookFunc + sizeof(DWORD));

// 开始Patch函数开头的字节
// 备份dwPatchSize到lpHookFunc
memcpy((BYTE *)lpHookFunc + JMP_SIZE, OrgProc, dwPatchSize);
// NOP填充
memset(MappedProc, 0x90, dwPatchSize);
#ifdef WIN32
// jmp
*(BYTE *)MappedProc = 0xE9;
// 注意计算长度的时候得用OrgProc
*(DWORD*)(MappedProc + 1) = (DWORD)lpHookFunc - (DWORD)OrgProc - JMP_SIZE;
// jmp到Hook
*(BYTE *)lpHookFunc = 0xE9;
*(DWORD*)((DWORD)lpHookFunc + 1) = (DWORD)NewProc - (DWORD)lpHookFunc - JMP_SIZE;
// 跳回原始
*(BYTE *)((DWORD)lpHookFunc + 5 + dwPatchSize) = 0xE9;
*(DWORD*)((DWORD)lpHookFunc + 5 + dwPatchSize + 1) = ((DWORD)OrgProc + dwPatchSize) - ((DWORD)lpHookFunc + JMP_SIZE + dwPatchSize) - JMP_SIZE;

#else
// jmp far
*(BYTE *)MappedProc = 0xEA;

// 注意计算长度的时候得用OrgProc
*(DWORD*)(MappedProc + 1) = (DWORD)lpHookFunc;
*(WORD*)(MappedProc + 5) = 0x08;


// jmp到Hook
*(BYTE *)lpHookFunc = 0xEA;
*(DWORD*)((DWORD)lpHookFunc + 1) = (DWORD)NewProc;
*(WORD*)((DWORD)lpHookFunc + 5) = 0x08;

// 跳回原始
*(BYTE *)((DWORD)lpHookFunc + JMP_SIZE + dwPatchSize) = 0xEA;
*(DWORD*)((DWORD)lpHookFunc + JMP_SIZE + dwPatchSize + 1) = ((DWORD)OrgProc + dwPatchSize);
*(WORD*)((DWORD)lpHookFunc + JMP_SIZE + dwPatchSize + 5) = 0x08;
#endif

#ifdef WIN32
// 恢复对内存的设置
VirtualProtect(MappedProc, dwPatchSize, dwOldProtect, &dwOldProtect);
#else
MmUnmapLockedPages(MappedProc, pMdlSystemCall);
IoFreeMdl(pMdlSystemCall);
#endif

*RealProc = (DWORD)lpHookFunc + JMP_SIZE;
return TRUE;
}
void UnInlineHook(
void *OrgProc, /* 需要恢复Hook的函数地址 */
void *RealProc /* 原始函数的入口地址 */
)
/*++
恢复对函数进行的Inline Hook
--*/
{
DWORD dwPatchSize;
DWORD dwOldProtect;
LPBYTE lpBuffer;
LPBYTE MappedProc = NULL;
#ifndef WIN32
PMDL pMdlSystemCall = NULL;
#endif

// 找到分配的空间
lpBuffer = (DWORD)RealProc - (sizeof(DWORD) + JMP_SIZE);
// 得到dwPatchSize
dwPatchSize = *(DWORD *)lpBuffer;
#ifdef WIN32
MappedProc = OrgProc;
VirtualProtect(MappedProc, dwPatchSize, PAGE_EXECUTE_READWRITE, &dwOldProtect);
// 恢复函数头
memcpy(MappedProc, RealProc, dwPatchSize);
VirtualProtect(MappedProc, dwPatchSize, dwOldProtect, &dwOldProtect);
// 释放分配的空间
VirtualFree(lpBuffer, 0, MEM_RELEASE);
#else
pMdlSystemCall = IoAllocateMdl(
OrgProc,
dwPatchSize,
0,
0,
NULL
);
if(!pMdlSystemCall)
return FALSE;

MmBuildMdlForNonPagedPool(pMdlSystemCall);
MappedProc = (LPBYTE)MmMapLockedPages(pMdlSystemCall, KernelMode);

memcpy(MappedProc, RealProc, dwPatchSize);
MmUnmapLockedPages(MappedProc, pMdlSystemCall);
IoFreeMdl(pMdlSystemCall);
ExFreePool(lpBuffer);
#endif
}
#endif // !defined(AFX_INLINEHOOK_H_INCLUDED)
(滴水中期练习)通过InlineHook NtReadFile实现R3到R0的通信 用ida查看NtReadFile的汇编代码 //参数注释 PAGE:0049D117 var_78 = dword ptr -78h PAGE:0049D117 var_74 = dword ptr -74h PAGE:0049D117 var_70 = dword ptr -70h PAGE:0049D117 var_6C = dword ptr -6Ch PAGE:0049D117 Irp = dword 阅读详情

相关推荐

InlineHook--Ring3

实现思路: 使用GetProcAddress得到函数地址,将函数入口点的前5字节进行替换,使用e9指令进行跳转到Fake函数的地址,然后去执行挂钩函数。 在程序的实现过程中注意的问题有两个: 保存源函数实现的前5字节指令,为了恢复钩子。 e9指令后4字节的偏移计算 //e9指令后面的数据计算,就是跳转到当前地址加5字节偏移,加e9后面的偏移地址 //例如:00DB15E6 E9 A5 3B...

KOOKNUT的博客 620

XML Downloader BY CoolDiyer

XML Downloader BY CoolDiyer // xml.cpp : By CoolDiyer 2008/4/9 14:03//#pragma comment(linker, “/subsystem:windows /FILEALIGN:0×200 /opt:nowin98“) #include &amp;lt;windows.h&amp;gt;#include &amp;lt;atlbase.h&amp;gt...

爱.NET 193

完美支持64&amp;32位InlineHook,C语言,C++类 都有

Windows 64位和32位Inline Hook的例子。包括C语言代码,和封装好的C++类,绝对超值,超简单实用的例子,可以直接运行,用了绝对说好!

通用Inline Hook代码收藏

#include "inlinehook.h"typedef struct _INLINE_HOOK_ITEM{ PBYTE HookAddress; //inlinehook 的位置 DWORD OrgBytesSize; // //PBYTE OrgBytes;

大浪淘沙的专栏 1090

远程监控软件NetKey(含源码)

readme.txt关于源程序: 任何下载本程序的人都有权修改,但本软件作者徐长友拥有最终解释权,保留本软件所有权利 server目录 :服务端 client目录 :客户端 screen目录 :载取远程屏幕的例子供大家参考声明: 本软件为免费软件,主要用途是配合网管进行远程监控,作者允许并鼓励自由传播,但禁止用于商业用途或在传播的过程中以任何理由收取费用。同时,作者不对本软件做任何担保,不对因本软件导致的系统错误、数据丢失,以及由此引发的感情纠葛直至法律纠纷承担责任,凡使用本软件恶意入侵他人电脑或网络者,后果自负。 源程序仅供参考,帮助大家全面了解特洛伊木马等网络程序,绝对不是要大家写木马程序,源程序是以前写的,很多地方能否用,我本人没有一一试过,整个源程序是可以在D4,D5中编译的。新版Netkey本人暂不公开。请关注!

CoolDiyer&#39;s Blog 个人博客系统 1.0

CoolDiyer&#39;s Blog是一简单个人博客系统,功能如下: 1.HTML+JavaScript+CSS+ASP+Access+NotePad 设计完成, 支持IE &amp; FireFox 2.添加、修改、删除、排序、隐藏类别, 支持外部连接 3.添加、修改、删除、排序、隐藏友情链接, 支持图片链接 4.添加、修改、删除、搜索文章 5.查看、删除留言, 限制5条/IP (呢称、Emial、时间、IP) 6.计数器功能 系统状态统计 7.文章按标题自动着色 8.界面简洁, 操作方便 9.初始用户名和密码为admin

Inline Hook 之(监视任意函数)

前面已经写过两次inline hook的博文了,第一篇为:《C/C++ HOOK API(原理深入剖析之-LoadLibraryA)》,这篇博文的方法是通过修改任意函数的前面N个字节,实现跳转并进入到我们自定义的hook函数里,执行完毕我们的hook函数之后,再直接调用被hook的函数。第一篇的方法没有考虑多线程的情况,所以在多线程环境下会有问题。第二篇为:《Inline HOOK API 改进版(hot-patching)》,这篇的初衷是为了解决多线程的问题,因为这种方式是一直hook的,直到程序结束。

技术思行 4万+

国内不错的远程控制代码大全

pcshare 2006的代码,值得学习

基于Windows Socket 的网络通信中的心跳机制原理

引言     在采用TCP 连接的C/S 结构的系统中,当通信的一方正常关闭或退出时,另一方能收到相应的连接引言 在采用TCP 连接的C/S 结构的系统中,当通信的一方正常关闭或退出时,另一方能收到相应的连接 断开的通知,然后进行必要的处理;但如果任意一方发生所谓的“非优雅断开”,如:意外崩溃、死机、 拔掉网线或路由器故障时,另一方无法得知TCP 连接已经失效,除非继续在此连接上不

如果爱下去的专栏 3328

tcmalloc(高并发内存池)简化版讲解-项目

高清发不上去,私我发高清,项目完整代码@我。

2201_75352618的博客 911

从动态规划到最优控制:Hamilton-Jacobi-Bellman (HJB) 方程的核心思想与应用

本文深入解析了Hamilton-Jacobi-Bellman (HJB) 方程的核心思想与应用,从动态规划到最优控制的演变过程。通过实际案例展示了HJB方程在机器人路径规划、工业机械臂优化等领域的实践价值,并探讨了数值求解方法和深度学习结合的神经HJB前沿进展。

weixin_28700411的博客 458

xp下双开3389源码_陕南赤子_新浪博客

作者:cooldiyer 来源:红狼 很早时候写的,方便大家用,百度丢不了源文件,大家可以百度到 编译后,直接运行,XP的终端自动开启激活guest,密码为cooldiyer,加管理员组 并且可以多用户登录 声明,原创.................... // xp3389.cpp : XP下双开3389的工具 Code By CoolDiyer...

allen88的专栏 131

免费测试国外大模型Claude 3.7 Sonnet API:无需api key(秘钥)

Claude 3.7 Sonnet是Anthropic公司推出的第三代Claude系列AI模型中的中规模版本(2024年发布),在性能与效率间实现平衡。该模型基于改进的Transformer架构,支持128K上下文窗口,擅长复杂推理、数学计算和创意写作,在GSM8K数学基准测试中准确率达92%。其采用"宪法AI"伦理框架,通过多轮对抗训练减少有害输出,同时新增多模态理解能力(可解析图片/图表内容)。Claude 3.7 Sonnet是Anthropic推出的高效轻量级大模型,主打快速响应与成本优化。

Explinks的博客 1499

c++注入思路inlink hook,ring3和ring 0

注入DLL的思路步骤: 1. 在目标进程中申请一块内存空间(使用VirtualAllocEx函数) 存放DLL的路径,方便后续执行LoadLibraryA 2. 将DLL路线写入到目标进程(使用WriteProcessMemory函数) 3. 获取LoadLibraryA函数地址(使用GetProcAddress),将其做为线程的回调函数 4. 在目标进程 创建线程并执行(使用CreateRemoteThread) std::string temp = W2Astring(strDllPath); in

qq_35490522的博客 1992

VLA强化学习训练:π0到π0.5的技术优化与实现

视觉语言动作模型(VLA)作为多模态强化学习的重要分支,通过融合视觉、语言和环境状态数据实现智能决策。其核心技术在于多模态特征融合与动作空间设计,其中PPO算法因其出色的训练稳定性成为首选方案。在工程实践中,延迟补偿机制和课程学习设计能显著提升模型性能,如在四足机器人项目中使避障成功率提升47%。针对实际部署中的性能下降问题,需要特别关注硬件量化参数和控制频率一致性等关键因素。本文通过π0与π0.5版本的对比实验,详细解析了VLA模型在机械臂控制等具身智能场景中的优化路径。

weixin_29041767的博客 247

C# Log4Net不输出日志的解决方法

log4net是一个流行的 .NET 日志框架,用于记录应用程序的日志信息。如果你在使用log4net。

精通搬砖,资深技术砖家,在软件开发,人工智能,设备开发等领域都有研究。商业合作&交流学习可私信联系。 1264

Ring3下Inline Hook API

用CreateFile为例子,讲解一下Ring3下的Inline Hook API,基本原理很简单1、获取CreateFile函数的地址2、读取CreateFile函数的前8个字节3、将CreateFile函数的前8个字节,修改成mov eax,我的函数地址  jmp eax4、

十年磨一剑,霜刃未曾试! 4223

GEE必须会教程——一文教会你研究区域分块计算与合并

一整块算不是挺好的吗?emmmm,用过的人都知道,GEE好比幼年期的“紫妍”,要用“丹药”来养的,除非你是萧炎小友,到哪都有人给爆金币。我们今天想做的是计算2020年夏季西藏自治区的植被覆盖度(FVC),FVC的估算需要使用归一化植被指数(NDVI数据),这里我们用到的产品是MODIS的相关数据产品,该产品的分辨率是25 0m。下载好的结果毕竟是一块一块的,怎么对下载好的结果进行拼接,变成一张大图呢,别急,接下来,我们上科研小霸王——R语言。此处,我们通过省份数据,按照属性筛选,得到西藏自治区的行政边界。

Promising_GEO的博客 2513

【梅哥的Ring0湿润插入教程】重磅第三课:Ring0下的PE Loader及重加载内核秒杀一切内核级钩子(上篇)...

【梅哥的Ring0湿润插入教程】Email:mlkui@163.com 转载请注明出处,谢绝喷子记者等,如引起各类不适请自觉滚J8蛋!第三课:Ring0下PE Loader及重加载内核绕过一切内核级钩子(上篇) 随着驱动保护技术的逐步成熟,诸如网络游戏公司等越来越多的商业软件公司开始使用Ring0级保护技术保护自己的产品,以起到反用户级调试、反RootKit、反各类钩子、反各...

aejtu5698的博客 1622

CloudCompare 和 PCL:点云网格化分析与处理

点云网格化是将点云数据转化为规则网格的过程,其主要思想是将离散的点云投影到一个平面上,然后对该平面进行划分,形成一系列小区域。在点云网格化方面,PCL 提供了各种算法和工具,可以实现高效的点云网格化操作。以上示例代码中,首先加载了输入的点云数据,然后通过设置合适的网格化算法参数,如搜索半径和最大三角形边长等,执行了网格化操作,最后将网格化结果保存到输出文件中。以上示例代码中,首先加载了输入的点云数据,然后通过设置合适的网格化参数,如分辨率等,执行了网格化操作,最后将网格化结果保存到输出文件中。

TechPulseZ的博客 1293

华为数字化转型之道 方法篇 第五章 视IT为投资,用产品思维管理IT

比较传统信息化和数字化转型下的IT系统特征,我们发现业务环境、IT能力、业务和IT的关系都发生了巨大的变化(见图5-1)从“管理系统”到“作业平台”。企业通常的做法是将线下的文档、流程线上化,IT系统是作为管理系统而存在的。而面向数字化,企业的业务作业、业务运营和决策、团队协同等业务动作已经和IT系统集成,IT系统逐步转变为作业系统。从“功能优先”到“体验优先”,如果要整体完成一项工作往往需要用户在不同系统间切换,费时费力。

沧海之巅的专栏 1095

浅谈inline HOOk之ring0下的进程保护

浅谈inline HOOk之ring0下的进程保护 在上一篇中说了一下ring3下简单的inline HOOK,写函数开头的方法还是比较通用的,而Call钩子虽然有隐蔽的优点,却需要对目标函数进行反汇编,都不适合大规模使用,还有push 、ret的方法,熟习的API的压栈原理,就很简单的,这些问题以后再讨论,这次我将上一篇文章里的代码移植到了ring0下,用来实现进程保护,rin

linuxheik的专栏 2499

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ring3 inline hook例子

ring3 inline hook例子 #include #include #include //修改API入口为mov eax,00400000; jmp eax 跳转到自己的函数 BYTE NewBytes[8] = {0xB8,0x0,0x0,0x40,0x0,0xFF,0xE0,0x0}; BYTE OldBytes[8] = {0}; FARPROC Crea

yxuenong的专栏 819

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Ring0 inline hook For Delphi.

内嵌钩子呀内嵌钩子呀...一般两种方法...[1]jmp0.获取一个足够的长度...Copy原来的数据保存到一个地方1.jmp 长跳转到HookProc部分2.处理完毕后跳转到...会原来抽取的代码...3.执行完毕后再jmp回到原有指令[2]返回地址...push xxx+ret[3]这个是为了bypass某些检测工具---小跳一下...然后大跳一下(抱歉不是CS)[4]其他跳转法...你喜欢玩

2203

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Ring3下Inline Hook MessageBox

 这是学习Ring3 下Inline Hook 的代码,写的很菜,部分代码参考了邪8中“我非我”的代码,在此表示感谢。原文中有二处错误,后面好多人都说运行不成功,不知道原作者是怎样编译成功的,原代码参见ring3 inline hook demo由于在邪8中等级太低,不能发贴,借用宝地说明下提前声明下,我调试的VC++为6.0的,在VC++编译器生成EXE中,函数也像API一样进行了中间跳转如

1120
上一篇: Download and execute file under any process
下一篇: 游戏加速外挂分析以及制作
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值