ObCallback回调钩子检测
ObCallback回调钩子检测
2013-12-20 Nie.Meining Ring0
在 PatchGuard 的摧残下,通过 ObRegisterCallbacks 函数注册回调钩子已经成了 RK/ARK 中的主流技术之一。注册回调钩子的具体做法可以参考MSDN上的示例代码:http://code.msdn.microsoft.com/windowshardware/ObCallback-Sample-67a47841。
今天研究了一下检测这类回调钩子的方法,发出来跟大家分享。本人水平有限,错漏之处还请大家指正。
首先关注的还是注册回调钩子时调用的 ObRegisterCallbacks 函数,MSDN上的函数声明如下:
- NTSTATUS ObRegisterCallbacks(
- _In_ POB_CALLBACK_REGISTRATION CallBackRegistration,
- _Out_ PVOID *RegistrationHandle
- );
也就是说调用该函数后,我们会得到一个神奇的 RegistrationHandle 指针,而该指针指向的数据结构必然用于描述本次注册的回调钩子(否则 ObUnRegisterCallbacks 就摘不掉钩子了)。
经过一番逆向和调试,发现这个数据结构由三个部分顺序组织在内存中:
-----------------------------------------------------------------------------------------------------
Part1:
钩子数据结构的头部信息,如版本号,CallbackOperator 个数等
Part2:(这个部分的长度取决于该回调钩子包含多少个CallbackOperator)
钩子数据结构的CallbackOperator1 相关信息
钩子数据结构的CallbackOperator2 相关信息
……
Part3:
钩子数据结构的额外信息,如 Altitude 等
-----------------------------------------------------------------------------------------------------
具体来讲,用 C 语言可以描述如下:
- struct CALLBACK_NODE {
- // 版本号,目前是 0x100, 可通过 ObGetFilterVersion 获取该值
- USHORT usVersion;
- // 本节点上有多少个 CallbackOperator,即多少个 CallbackBodies
- USHORT usCallbackBodyCount;
- // 注册回调时设定的 OB_CALLBACK_REGISTRATION.RegistrationContext
- // 即 PreCallbackRoutine 和 PostCallbackRoutine 的参数
- PVOID pContext;
- // 这里似乎是 0x000C000C/0x00080008 一类的值
- ULONG ulXXX_000X000X;
- // 指向 Altitude 字符串
- // 注意这个字符串因为最大长度是恒定的,所以不一定以 NULL 结尾
- PWCHAR wcsAltitude;
- // CALLBACK_BODY 数组,其元素个数为 ulCallbackCount
- struct CALLBACK_BODY CallbackBodies[1];
- //
- // CALLBACK_BODY数组后,紧接着 Altitude 字符串和一些其它数据
- //
- };
其中的 struct CALLBACK_BODY CallbackBodies[] 数组就是描述该 CallbackNode 上的各个 CallbackOperator 的数据结构:
- struct CALLBACK_BODY {
- // 所有的 CALLBACK_NODE 通过这个链表串在一起
- LIST_ENTRY ListEntry;
- // 注册回调时设定的 OB_OPERATION_REGISTRATION.Operations,
- // 即 OB_OPERATION_HANDLE_CREATE 这些东西
- ULONG ulOperations;
- // 这里似乎始终是 1
- ULONG ulXXX_1;
- // 指向该 CallbackBody 对应的 CallbackNode
- struct CALLBACK_NODE* pCallbackNode;
- // 注册回调时设定的 OB_OPERATION_REGISTRATION.pObjectType
- // 即 PsProcessType,PsThreadType 这些东西
- PVOID pObjectType;
- // 这就是注册回调时设定的 PreCallbackRoutine 函数地址
- PVOID pPreCallbackRoutine;
- // 这就是注册回调时设定的 PostCallbackRoutine 函数地址
- PVOID pPostCallbackRoutine;
- // 这里似乎是个引用计数
- ULONG ulRefCount;
- };
注意这里面的 CALLBACK_BODY.ListEntry 链表很有意思,它将系统中的其它 CALLBACK_NODE.CallbackBodies 都链在了一起。因此我们就可以通过遍历这个链表检测系统中的其它回调钩子。
检测的大致思路是,先自己调用ObRegisterCallbacks注册一个假钩子,这样就得到了一个节点,然后用这个节点开始遍历。
写了一个测试代码,在64位Win8系统上测试截图如下:
图中 CallbackDetect.sys 中钩子是我的检测模块注册的假钩子;bd0001.sys 中的钩子是百度卫士注册的钩子;其它是360注册的钩子。
完整测试代码下载(64位/32位系统通用):CallbackDetect.zip
jpg改rar
ObCallback回调钩子检测的更多相关文章
- 电信NBIOT平台的CA证书上传-消息订阅回调地址检测503错误
在NBIOT北向开发过程中,遇到消息订阅回调地址检测503错误,经过论坛查询与文档查阅一直都没有解决问题,大多人都说是RESTful地址格式问题,但其实不是.最终发现是我们在电信平台创建应用时,上传C ...
- js回调函数,检测这个值是否重复
//校验提交的数据是否重复 /** * url:后端的查询地址 * filedVal: 要传到后台的值 * ele:要绑定显示的元素,一般就是当前的input就可以,直接在其后边追加显示 * fn:回 ...
- Spring-IOC bean 生命周期之 Lifecycle 钩子
Lifecycle callbacks Initialization callbacks.Destruction callbacks 要与容器的bean生命周期管理交互,即容器在启动后和容器在销毁前对 ...
- 常见注入手法第四讲,SetWindowsHookEx全局钩子注入.以及注入QQ32位实战.
常见注入手法第四讲,SetWindowsHookEx全局钩子注入.以及注入QQ32位实战. PS:上面是操作.最后是原理 一丶需要了解的API 使用全局钩子注入.我们需要了解几个WindowsAPI. ...
- 通过TLS回调函数的反调试
下面是TLS数据结构的定义 typedef struct _IMAGE_TLS_DIRECTORY { DWORD StartAddressOfRawData; DWORD EndAddressOfR ...
- Java并发编程-扩展可回调的Future
前提 最近在看JUC线程池java.util.concurrent.ThreadPoolExecutor的源码实现,其中了解到java.util.concurrent.Future的实现原理.从目前j ...
- Deformity PHP Webshell、Webshell Hidden Learning
目录 . 引言 . webshell原理介绍 . webshell的常见类型以及变种方法 . webshell的检测原理以及检测工具 . webshell隐藏反检测对抗手段 0. 引言 本文旨在研究W ...
- PowerTool(杀毒辅助工具) V4.6 中文免费绿色版
软件名称: PowerTool(杀毒辅助工具)软件语言: 简体中文授权方式: 免费软件运行环境: Win7 / Vista / Win2003 / WinXP 软件大小: 968KB图片预览: 软件简 ...
- Spring事务源码阅读笔记
1. 背景 本文主要介绍Spring声明式事务的实现原理及源码.对一些工作中的案例与事务源码中的参数进行总结. 2. 基本概念 2.1 基本名词解释 名词 概念 PlatformTransaction ...
随机推荐
- (转)C++0x语言新特性一览
转自:http://blog.csdn.net/zwvista/article/details/2429781 原文请见http://en.wikipedia.org/wiki/C%2B%2B0x. ...
- FASTREPORT 整理 (mtm)
DELPHI中用FASTREPORT制作报表 1.加载并存储报表 默认情况下,报表窗体同项目窗体构存储在同一个DFM文件中.多数情况下,无须再操作,因而你就不必采用特殊方法加载报表. 如果你决定在文 ...
- 如果你修改了ashx.cs的命名空间
如果你修改了ashx.cs的命名空间,记得要同时修改ashx的WebHandler的Class. 在解决方案资源管理器中右键,查看标记
- 服务器×××上的MSDTC不可用解决办法
MSDTC(分布式交易协调器),协调跨多个数据库.消息队列.文件系统等资源管理器的事务.该服务的进程名为Msdtc.exe,该进程调用系统Microsoft Personal Web Server和M ...
- ASM:《X86汇编语言-从实模式到保护模式》第七章应用例:用adc命令计算1到1000的累加
在16位的处理器上,做加法的指令是add,但是他每次只能做8位或者16位的加法,除此之外,还有一个带进位的加法指令adc(Add With Carry),他的指令格式和add一样,目的操作数可以是8位 ...
- HTML DOM scale() 方法
语法 scale(sx, sy) 参数 参数 描述 sx, sy 水平和垂直的缩放因子. 描述 scale() 方法为画布的当前变换矩阵添加一个缩放变换.缩放通过独立的水平和垂直缩放因子来完成.例如, ...
- oracle触发器加条件判断、dblink
--新增基站同步给电池组信息 create or replace trigger a_b_test after insert or update or delete on BJLT.BASESTATI ...
- 如何让数据库在每天的某一个时刻自动执行某一个存储过程或者某一个sql语句
这就要涉及到代理的知识了哦,首先我们要启动代理服务.
- CSS3的新属性的一下总结
阮一峰:http://www.ruanyifeng.com/blog/2014/02/css_transition_and_animation.html 由于自己经常搞混:animation,tran ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(五) 之 加好友,加群流程,消息管理和即时消息提示的实现
前言 前前一篇留了个小问题,在上一篇中忘了写了,就是关于LayIM已经封装好的上传文件或者图片的问题.对接好接口之后,如果上传速度慢,界面就会出现假死情况,虽然文件正在上传.于是我就简单做了个图标替代 ...