jmp address windows hook

2023-11-17

以下代码是sysnap早期发表的inlinehook ObReferenceObjectByHandle()的代码。大部分看懂了,但是有些看不懂,google也查了,qq群也问了。哪位高手有时间给科普下哈~ 可怜下偶们菜鸟吧。。。

__declspec(naked) T_ObReferenceObjectByHandle(
IN HANDLE Handle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_TYPE ObjectType OPTIONAL,
IN KPROCESSOR_MODE AccessMode,
OUT PVOID *Object,
OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
)
{
_asm
{
mov edi,edi //执行被修改的前5个字节
push ebp
mov ebp,esp

push [ebp+0x1c] //参数压栈
push [ebp+0x18]
push [ebp+0x14]
push [ebp+0x10]
push [ebp+0xc]
push [ebp+8] //this parameter is object handle

call MyObReferenceObjectByHandle //调用我们的功能函数 
cmp eax,1 
jz end

mov eax,ObReferenceObjectByHandle //正常运行原来的函数
add eax,5 
jmp eax 

end:
mov [ebp+8],-1 //如果不想让这个函数正常运行..无效句柄就可以
mov eax,ObReferenceObjectByHandle 
add eax,5 //protected the function can success runing 
jmp eax //start run ObReferenceObjectByHandle
}

//对原来函数是否要让其正常运行的判断由MyObReferenceObjectByHandle完成
int MyObReferenceObjectByHandle(
IN HANDLE Handle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_TYPE ObjectType OPTIONAL,
IN KPROCESSOR_MODE AccessMode,
OUT PVOID *Object,
OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
)
{
PEPROCESS Process;
KIRQL oldIrql;
int JmpOffSet;
unsigned char Code[5]={0x8b,0xff,0x55,0x8b,0xec}; //mov edi,edi push ebp mov ebp,esp
unsigned char JmpCode[5] = { 0xe9, 0x00, 0x00, 0x00, 0x00 }; //jmp address

if(*PsProcessType == ObjectType) //判断句柄所属对象类型是不是*PsProcessType
{
oldIrql = KeRaiseIrqlToDpcLevel();

__asm
{
CLI 
MOV eax, CR0 
AND eax, NOT 10000H 
MOV CR0, eax
}

RtlCopyMemory(ObReferenceObjectByHandle,Code,5);//恢复inline hook以便正确调用ObReferenceObjectByHandle 
ObReferenceObjectByHandle(Handle,DesiredAccess,ObjectType,AccessMode,&Process,NULL);

//Procee + 0x174 is this process file name
//this file is im protected
if(_stricmp((char*)((char*)Process+0x174), ProtectName) == 0 )//判断是不是我们要保护的进程
{
//JmpOffset is int type
//JmpOffset Pointer the function qian 5 byte
JmpOffSet = (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;

//get jmp address to jmp+1 - jmp+4
RtlCopyMemory ( JmpCode+1, &JmpOffSet, 4 );
RtlCopyMemory ( ObReferenceObjectByHandle, JmpCode, 5 );

__asm
{
MOV eax, CR0
OR eax, 10000H
MOV CR0, eax
STI
}

KeLowerIrql(oldIrql);
return 1;
}

//否则再次HOOK这个函数
JmpOffSet= (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
RtlCopyMemory ( JmpCode+1, &JmpOffSet, 4 );
RtlCopyMemory ( ObReferenceObjectByHandle, JmpCode, 5 );

__asm
{
MOV eax, CR0
OR eax, 10000H
MOV CR0, eax
STI
}

KeLowerIrql(oldIrql);

return 0;
}



PsProcessType
这个是什么,在哪定义?一般是用来做什么的。。。

oldIrql = KeRaiseIrqlToDpcLevel();
这条语句做什么的?并且返回值oldIrql是什么啊?

__asm
{
CLI 
MOV eax, CR0 
AND eax, NOT 10000H 
MOV CR0, eax
}



__asm
{
MOV eax, CR0
OR eax, 10000H
MOV CR0, eax
STI
}

是什么意思,大概在google上查了下,貌似和打开/管理 中断请求有关系。。。

JmpOffSet = (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
为什么最后还要减5呀?
sudami
2009-07-13, 23:27:18
多打基础,就会懂了. 比如你不清楚-5的意思,需要了解Intel指令相关...
不要一口吃个胖子. :3:
emc
2009-07-14, 00:51:49
to sudami:

好吧,我在看看,但是,希望你能帮我解释下,我提出的问题 谢谢。
xacker
2009-07-14, 14:00:47
代码写的有点复杂 中间还夹带了一些汇编 对于新手 确实不大容易理解 
建议LZ 去网上找个C写的R3的detours HOOK 单步调试一下就知道了
六月
2009-07-14, 18:26:22
PsProcessType
这个是什么,在哪定义?一般是用来做什么的。。。

进程类型咯..一般用0就行了.我也不是很清楚这个意思,你参考下就好
-------------------------------------------------------------------------------
oldIrql = KeRaiseIrqlToDpcLevel();
这条语句做什么的?并且返回值oldIrql是什么啊?

保存当前IRQL级别并提高IRQL级别,就是为了不让其他线程调度进来用的...就是提高IRQL中断级别,防止其他线程调度而产生的中断.不过我也不太明白,他这里用了cli关中断了,为什么还要提高IRQL的权限,不太明白,cli关中断的原理不太明白.他这里的IRQL提权是关了软中断,我想cli也是这个意思吧..

-------------------------------------------------------------------------
JmpOffSet = (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
为什么最后还要减5呀? 

这个我也不知道怎么解释了,自己HOOK一下,算一下应该就明白了!
轩辕小聪
2009-07-14, 18:35:08
如果楼主从没接触过inline hook,那么就如4楼所说应该从Ring3的inline hook开始学,而不是Ring0。
楼主的疑问,并不只是对怎样进行inline hook的疑问,还有一些是不熟悉驱动编程导致的。

PsProcessType是ObReferenceObjectByHandle传入的ObjectType参数,在得到进程的Object的时候使用,楼主参考DDK中关于ObReferenceObjectByHandle的描述,就会知道它是怎么回事了。

oldIrql = KeRaiseIrqlToDpcLevel();
同样参考DDK就会知道这个函数的作用,以及它的返回值(旧的IRQL)

操作CR0的那段则是暂时禁用写保护。

JmpOffSet = (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
为什么减5,这涉及到机器码jmp命令的偏移是怎么计算的,这是inline hook的基础,楼主如果搞不清楚这个,可以说楼主根本没接触过inline hook。

另外这一段代码也做得并不是很好,因为需要在替代函数中反复HOOK和UNHOOK,这是比较容易出问题的一种方式,不是inline hook提倡的方式。
emc
2009-07-14, 21:34:22
谢谢4喽和5喽的解释。

to 轩辕小聪:

我之前学习驱动,只是看了“楚狂人”所写的“windows驱动编程基础教程”,并且调试了helloworld和ioctrl的那2个代码。
之前我有参考ddk document中的ObReferenceObjectByHandle()中,但是没有找到"PsProcessType"的解释,而且参看sysnap的代码中并没有定义和解释PsProcessType,现在我只是知道用它来判断一个对象是不是一个进程。
不过谢谢大家的解释了,我自己在google下吧。
achillis
2009-07-14, 22:17:11
Hook完全可以在ring3下练习~
emc
2009-07-14, 23:05:29
to achillis:

inline hook 可以在ring3写练习?
hatling
2009-07-15, 00:20:22
to achillis:

inline hook 可以在ring3写练习?

看来你还没明白什么是inline
radarhp
2009-07-15, 00:45:44
-5 不就是因为写入了5个字节长度的跳转指令呗。。。
一个比一个神秘
六月
2009-07-15, 10:57:36
to achillis:

inline hook 可以在ring3写练习?

inline hook意思就是在函数体内hook 进入到过滤函数,比如可以通过jmp ,call,push等.实现转入过滤函数(就是你写的判断函数)...这就是inline hook 和R0 R3没关系,只是一种方式而已...

inline反正意思就是在函数体内挂钩..
achillis
2009-07-15, 17:53:03
那么多的hook教程,似乎没有一篇足够凝炼~
emc
2009-07-16, 09:09:13
to 13#:

貌似那些hook教程都直接是code....
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jmp address windows hook 的相关文章

  • xunit 添加信息到输出

    有谁知道如何在运行 xUnit 测试时向输出控制台添加附加信息 我正在使用 testdriven net 但我不认为这就是我的答案所在 我正在使用一个IUseFixture 实际上IClassFixture从 2 0 开始 在测试之间维护数
  • IOS越狱如何拦截短信/短信

    我目前正在尝试编写一个应用程序来拦截文本消息并根据该消息的内容做出反应 我试图挂钩 receivedMessage struct CKSMSRecord message replace BOOL replaceCKSMSService 类中
  • Git hooks - 如何仅处理属于存储库内特定文件夹的文件?

    我对 git 有点陌生 对 bash 不太擅长 我有一个存储库 如果重要的话 在 Bitbucket 中 它只包含两个文件夹 我已经有一个钩子 用 bash 编写 可以触发 Jenkins 作业 现在我想更改它 因此它将仅针对提交到其中一个
  • Windows 8 Metro 风格应用程序和窗口挂钩

    我对 window hooks 和 Windows 8 Metro 应用程序都很陌生 我想开发一个后台服务 流程 检查用户刚刚点击启动的 Metro 应用程序的 属性 例如播放音乐的应用程序 文本文档创建应用程序 根据找到的属性 激活其他应
  • WPF 中的全局鼠标挂钩

    我需要获取鼠标在屏幕上的位置NOT在我的应用程序中 我用过全局鼠标和键盘钩子here http www codeproject com Articles 7294 Processing Global Mouse and Keyboard H
  • BitBucket WebHook 詹金斯

    我想配置 bitbucket 来触发 jenkins 构建 我花了一些时间研究这个问题 所有答案都来自几年前 但没有找到任何指南 因为从那以后事情似乎发生了变化 我正在尝试做的事情 将位桶推送到特定分支会触发构建 我有什么 Bitbucke
  • pthread_create 的钩子

    是否有 在 glibc 2 5 及更新版本中 为 pthread create 定义钩子的方法 有很多二进制应用程序 我想编写一个动态库通过 LD PRELOAD 加载 我可以在 main 属性构造函数 的入口处添加钩子 但是如何强制我的代
  • Swift 能抵抗 hooking 吗?

    Cycript 是一个基于控制台的应用程序 它是 Objective C 和 JavaScript 的混合体 Cycript 对于 iOS 应用程序的动态分析非常有用 如果您使用 Swift 编写任何方法或完整的 ipa 是否仍然可以在越狱
  • 基于Git的网站部署工作流程

    在我的服务器上 我有两个用户 www data 由 nginx 使用 和git The git用户拥有一个包含我网站代码的存储库 并且www data用户拥有该存储库的克隆 用作 nginx 的 Webroot 我想建立一个工作流程 以便推
  • Outlook 对象模型 - 连接到对话清理功能

    Outlook 2010 有一个功能称为对话清理 http office microsoft com en us outlook help use conversation clean up to eliminate redundant m
  • Pagedown markdown 脚本插入图像 url 一次

    我有一个修改后的 pagedown markdown 标记脚本 用于将图像 url 插入编辑器 但它仅在第一次起作用 我已经用注释解释了我的代码
  • PyInstaller 2.1导入自定义包

    我有一个脚本正在尝试使用 Python 2 7 使用 PyInstaller 2 1 进行编译 该脚本使用我编写的名为 auto common 的自定义包 在脚本中 我使用以下命令导入它 sys path append path to pa
  • LD_PRELOAD 和 strace 有什么区别?

    这两种方法都用于收集系统调用及其参数和返回值 当我们更愿意LD PRELOAD为什么 也许我们可以说我们只能通过以下方式收集系统调用strace但我们可以收集图书馆的电话LD PRELOAD诡计 然而 还有另一个库的跟踪器 其名称是ltra
  • 键盘挂钩获取组合键(WPF)

    我尝试在这里使用这篇文章 在 WPF C 中使用全局键盘钩子 WH KEYBOARD LL https stackoverflow com questions 1639331 using global keyboard hook wh ke
  • 低级挂钩/SetWindowsHookEx lParam 自动重复?

    在这里阅读 Windows PC 上如何实现键盘自动重复 https stackoverflow com questions 876852 how is keyboard auto repeat implemented on a windo
  • Git Hook - 在我推送到 github 后让服务器拉取

    我有一个本地存储库 并且我在实时服务器上设置了另一个存储库 www site com projects ProjectA 我想要实现的目标非常简单 在我推送到 GitHub 后 我想要存储库位于www site com projects P
  • 是否有 Subversion Checkout Hook 或类似的东西?

    我正在使用 subversion 存储库 并且我想知道何时有人要求我的存储库签出 就像 svn co 或 svn up 每当有人从我的 svn 服务器请求信息时 是否可以使用挂钩或其他方法来运行脚本或发送电子邮件 如何在不依赖 apache
  • 动态组装 Python 模块,动态导入

    我正在努力让自己熟悉importlib钩子 我想实现直接导入用其他语言编写的非Python文件并维护源映射的能力 因此提高SyntaxError带有行号的 s 仍然会给出有意义的堆栈跟踪 我加载外部文件的方法是组装 Pythonic 源代码
  • Gradle 的钩子何时添加到构建生命周期中?

    Gradle 中有很多 hooks 但我无法准确理解它们何时应用 从文档中我找到了用于构建和项目的钩子 添加监听器 监听器 项目结束后 关闭 项目之前 关闭 构建完成 关闭 设置已评估 关闭 任务图 whenReady 项目已加载 对于项目
  • Windows C++ 中的键盘钩子还是什么?

    我希望构建自己的应用程序 它可以将键盘命令 消息 发送到 Windows 操作系统 例如 当我按下组合键 ctrl shift n 时 我希望启动 notepad exe 我怎样才能做到这一点 您对所使用的概念有什么建议吗 我读过 何时使用

随机推荐

  • 从浏览器输入网址到显示页面之间发生了什么

    好久没有更博了 最近一直忙于春招实习应聘 似乎有些打乱了我的节奏 我觉得还是应该把重心放在学习和记录上 不管有没有实习或者有没有拿到offer 我都一直stand by 言归正传 当你输入一个网址到页面显示在你眼前到底发生了什么 这其实是个
  • ESP8266 教程3 — 通过TCP组建局域网并通信

    目录 1 ESP8266 的 AP 模式 1 1 查询 ESP8266 的wifi应用模式 1 2 设置 ESP8266 模块的wifi信息 1 3 查询已经接入的设备 2 ESP8266 的Station 模式 2 1 设置ESP8266
  • FusionCompute8.0.0实验(1)CNA及VRM安装

    准备 1 老旧华硕笔记本电脑用于安装CNA 内存8G 硬盘1T 24G固态 i7 4500u 2核4线程 2 USB光驱 电脑上的光驱坏了 CNA不支持U盘安装 5V2A外接适配器 不能用快充 3 ultroISO破解版 4 办公笔记本 1
  • 阿里云服务器包年包月、按量和抢占式实例怎么选?区别是什么?

    阿里云服务器ECS付费类型包年包月 按量付费和抢占式实例有什么区别 包年包月先付费后使用 最低购买一个月时长 平均下来成本较低 按量付费先使用后付费 按小时结算费用 适合短期使用 平均下来费用要比包年包月贵一些 抢占式实例和按量付费相类似
  • 网站前台技术

    一 HTML5 1 历史 2 应用 html5语法 1 标签不区分大小写2 允许属性值不使用引号3 允许部分属性值的属性省略 html标记 带有 lt gt 符号的元素被称为HTML标记 也称为HTML标签或HTML元素 例如 都是HTML
  • Android选择本地视频和照片上传到服务器

    目录 照片photo 将http 本地存放照片数据库电脑ip 端口号 fileaddress png转image 一 后台发送来的数据转换Bitmap的方法 用法 二 将第一针显示出来方法 用法 视频vedio 使用选择器获取的 conte
  • rpm打包流程步骤

    rpm打包流程步骤 一 RPM简介 1 1 优点 1 2 缺点 二 前期准备 三 文件结构 3 1 各文件作用 四 打包步骤及SPEC文件的编辑 4 1 步骤 4 1 1 前期准备 4 1 2 建立相应的文件 4 1 3 将源码包放入SOU
  • 2.微服务架构组件分析

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 该系列文章来源于 学习 极客时间 从0开始学习微服务 分享之后笔记载录和读后感 作者胡忠想 微博技术专家 从 2012 年加入微博到现在 从 2012 年加入微博到现在 我
  • blender的下载安装和配置中文环境

    引言 在3D建模和动画设计领域 Blender 作为一款强大且免费的开源软件 一直以优秀的性能和对众多技术的支持赢得了大批用户的喜爱 然而 对于刚接触这款软件的用户而言 其安装和配置过程可能会带来一定困扰 尤其是在设置中文环境方面 因此 本
  • Python 爬虫初学者实战

    1 手写第一个 python 爬虫 爬虫 用程序来获取网站上的资源 常用 encoding utf 8 encoding gbk 1 导入 urllib request urlopen from urllib request import
  • Swiper 显示多行多列

    new Swiper popularity container speed 1600 autoHeight true observer true observeParents true spaceBetween 20 slidesPerVi
  • YOLOv1,v2,v3学习笔记

    YOLO学习笔记 首先我们这篇文章只写yolov1 v2 v3 至于v4我会另起一篇博文的 因为v4中用到了很多的trick和介绍了很多trick 所以我想详细介绍一下 照例 先放大佬的链接 https zhuanlan zhihu com
  • 【数字电路基础】三态门

    目录 前言 三态门 经典问题 前言 文主要讲解三态门 三态门 其模型为 其实际电路为 其真值表为 B A C 0 0 Z 0 1 Z 1 0 0 1 1 1 注意 Z是高阻 不代表没有电压 而是电压不确定 受自身 旁边cell的影响 经典问
  • multi-head attention理解加代码

    multi head attention 用于CNN相关理解 饭前小菜 在早期的Machine Translation 机器翻译 中 Attention机制与RNN的结合 机器翻译解决的是输入是一串在某种语言中的一句话 输出是目标语言相对应
  • python通过多进程加快预处理数据集的速度

    问题背景 imageNet数据集有1000个文件夹 每个文件夹是同一类的图片 大概一两千张 需要对每张图片进行预处理 把图片变成224 224像素的 这样可以加速后续程序的IO速度 同时也方便了数据集的移动 因为更小了 但是图片数量很大 全
  • 工具功能加强-对ARL的改造

    这一阵挖了不少的洞 学习到了很多的姿势 对ARL 玩的也明白了些 下面给大家介绍下如何加强你的ARL 首先不熟悉ARL的可以访问ARL的地址 GitHub TophantTechnology ARL ARL Asset Reconnaiss
  • 嘉兴职业技术学校2019分数线计算机,嘉兴职业技术学院

    序号 入围专业 分数线 1 园艺技术 131 43 2 应用电子技术 航空电子方向 130 00 3 无人机应用技术 125 14 4 物流管理 航空物流方向 133 14 5 旅游管理 文化创意与策划方向 129 14 6 酒店管理 休闲
  • Ubuntu apt update 报错APT::Update::

    E Problem executing scripts APT Update Post Invoke Success if usr bin test w var cache app info a e usr bin appstreamcli
  • 2021年开始,Adobe Flash Player 不能用了?

    WeChat 网管小贾 www sysadm cc 我们都知道 Adobe Flash Player 以下简称 Flash 是比较古老的程序了 在80 90后一代的记忆中 Flash 曾经可是火得一塌糊涂 而炙手可热的 Flash 很多人都
  • jmp address windows hook

    以下代码是sysnap早期发表的inlinehook ObReferenceObjectByHandle 的代码 大部分看懂了 但是有些看不懂 google也查了 qq群也问了 哪位高手有时间给科普下哈 可怜下偶们菜鸟吧 declspec