ObCallback回调钩子检测

2013-12-20 Nie.Meining Ring0

在 PatchGuard 的摧残下,通过 ObRegisterCallbacks 函数注册回调钩子已经成了 RK/ARK 中的主流技术之一。注册回调钩子的具体做法可以参考MSDN上的示例代码:http://code.msdn.microsoft.com/windowshardware/ObCallback-Sample-67a47841

今天研究了一下检测这类回调钩子的方法,发出来跟大家分享。本人水平有限,错漏之处还请大家指正。

首先关注的还是注册回调钩子时调用的 ObRegisterCallbacks 函数,MSDN上的函数声明如下:

  1. NTSTATUS ObRegisterCallbacks(
  2. _In_ POB_CALLBACK_REGISTRATION CallBackRegistration,
  3. _Out_ PVOID *RegistrationHandle
  4. );

也就是说调用该函数后,我们会得到一个神奇的 RegistrationHandle 指针,而该指针指向的数据结构必然用于描述本次注册的回调钩子(否则 ObUnRegisterCallbacks 就摘不掉钩子了)。

经过一番逆向和调试,发现这个数据结构由三个部分顺序组织在内存中:

-----------------------------------------------------------------------------------------------------

Part1:

钩子数据结构的头部信息,如版本号,CallbackOperator 个数等

Part2:(这个部分的长度取决于该回调钩子包含多少个CallbackOperator)

钩子数据结构的CallbackOperator1 相关信息

钩子数据结构的CallbackOperator2 相关信息

……

Part3:

钩子数据结构的额外信息,如 Altitude 等

-----------------------------------------------------------------------------------------------------

具体来讲,用 C 语言可以描述如下:

  1. struct CALLBACK_NODE {
  2. // 版本号,目前是 0x100, 可通过 ObGetFilterVersion 获取该值
  3. USHORT usVersion;
  4. // 本节点上有多少个 CallbackOperator,即多少个 CallbackBodies
  5. USHORT usCallbackBodyCount;
  6. // 注册回调时设定的 OB_CALLBACK_REGISTRATION.RegistrationContext
  7. // 即 PreCallbackRoutine 和 PostCallbackRoutine 的参数
  8. PVOID pContext;
  9. // 这里似乎是 0x000C000C/0x00080008 一类的值
  10. ULONG ulXXX_000X000X;
  11. // 指向 Altitude 字符串
  12. // 注意这个字符串因为最大长度是恒定的,所以不一定以 NULL 结尾
  13. PWCHAR wcsAltitude;
  14. // CALLBACK_BODY 数组,其元素个数为 ulCallbackCount
  15. struct CALLBACK_BODY CallbackBodies[1];
  16. //
  17. // CALLBACK_BODY数组后,紧接着 Altitude 字符串和一些其它数据
  18. //
  19. };

其中的 struct CALLBACK_BODY CallbackBodies[] 数组就是描述该 CallbackNode 上的各个 CallbackOperator 的数据结构:

  1. struct CALLBACK_BODY {
  2. // 所有的 CALLBACK_NODE 通过这个链表串在一起
  3. LIST_ENTRY ListEntry;
  4. // 注册回调时设定的 OB_OPERATION_REGISTRATION.Operations,
  5. // 即 OB_OPERATION_HANDLE_CREATE 这些东西
  6. ULONG ulOperations;
  7. // 这里似乎始终是 1
  8. ULONG ulXXX_1;
  9. // 指向该 CallbackBody 对应的 CallbackNode
  10. struct CALLBACK_NODE* pCallbackNode;
  11. // 注册回调时设定的 OB_OPERATION_REGISTRATION.pObjectType
  12. // 即 PsProcessType,PsThreadType 这些东西
  13. PVOID pObjectType;
  14. // 这就是注册回调时设定的 PreCallbackRoutine 函数地址
  15. PVOID pPreCallbackRoutine;
  16. // 这就是注册回调时设定的 PostCallbackRoutine 函数地址
  17. PVOID pPostCallbackRoutine;
  18. // 这里似乎是个引用计数
  19. ULONG ulRefCount;
  20. };

注意这里面的 CALLBACK_BODY.ListEntry 链表很有意思,它将系统中的其它 CALLBACK_NODE.CallbackBodies 都链在了一起。因此我们就可以通过遍历这个链表检测系统中的其它回调钩子。

检测的大致思路是,先自己调用ObRegisterCallbacks注册一个假钩子,这样就得到了一个节点,然后用这个节点开始遍历。

写了一个测试代码,在64位Win8系统上测试截图如下:

图中 CallbackDetect.sys 中钩子是我的检测模块注册的假钩子;bd0001.sys 中的钩子是百度卫士注册的钩子;其它是360注册的钩子。

完整测试代码下载(64位/32位系统通用):CallbackDetect.zip

jpg改rar

 
 

ObCallback回调钩子检测的更多相关文章

  1. 电信NBIOT平台的CA证书上传-消息订阅回调地址检测503错误

    在NBIOT北向开发过程中,遇到消息订阅回调地址检测503错误,经过论坛查询与文档查阅一直都没有解决问题,大多人都说是RESTful地址格式问题,但其实不是.最终发现是我们在电信平台创建应用时,上传C ...

  2. js回调函数,检测这个值是否重复

    //校验提交的数据是否重复 /** * url:后端的查询地址 * filedVal: 要传到后台的值 * ele:要绑定显示的元素,一般就是当前的input就可以,直接在其后边追加显示 * fn:回 ...

  3. Spring-IOC bean 生命周期之 Lifecycle 钩子

    Lifecycle callbacks Initialization callbacks.Destruction callbacks 要与容器的bean生命周期管理交互,即容器在启动后和容器在销毁前对 ...

  4. 常见注入手法第四讲,SetWindowsHookEx全局钩子注入.以及注入QQ32位实战.

    常见注入手法第四讲,SetWindowsHookEx全局钩子注入.以及注入QQ32位实战. PS:上面是操作.最后是原理 一丶需要了解的API 使用全局钩子注入.我们需要了解几个WindowsAPI. ...

  5. 通过TLS回调函数的反调试

    下面是TLS数据结构的定义 typedef struct _IMAGE_TLS_DIRECTORY { DWORD StartAddressOfRawData; DWORD EndAddressOfR ...

  6. Java并发编程-扩展可回调的Future

    前提 最近在看JUC线程池java.util.concurrent.ThreadPoolExecutor的源码实现,其中了解到java.util.concurrent.Future的实现原理.从目前j ...

  7. Deformity PHP Webshell、Webshell Hidden Learning

    目录 . 引言 . webshell原理介绍 . webshell的常见类型以及变种方法 . webshell的检测原理以及检测工具 . webshell隐藏反检测对抗手段 0. 引言 本文旨在研究W ...

  8. PowerTool(杀毒辅助工具) V4.6 中文免费绿色版

    软件名称: PowerTool(杀毒辅助工具)软件语言: 简体中文授权方式: 免费软件运行环境: Win7 / Vista / Win2003 / WinXP 软件大小: 968KB图片预览: 软件简 ...

  9. Spring事务源码阅读笔记

    1. 背景 本文主要介绍Spring声明式事务的实现原理及源码.对一些工作中的案例与事务源码中的参数进行总结. 2. 基本概念 2.1 基本名词解释 名词 概念 PlatformTransaction ...

随机推荐

  1. FASTREPORT 整理 (mtm)

    DELPHI中用FASTREPORT制作报表  1.加载并存储报表 默认情况下,报表窗体同项目窗体构存储在同一个DFM文件中.多数情况下,无须再操作,因而你就不必采用特殊方法加载报表. 如果你决定在文 ...

  2. ffmpeg-20160512-git-bin

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 f ...

  3. Java for LeetCode 213 House Robber II

    Note: This is an extension of House Robber. After robbing those houses on that street, the thief has ...

  4. 比较两个mysql数据库表结构的差异

    需求来源:一个线上系统,一个开发系统,现在要把开发系统更新到线上,但是开发系统的数据库结构与线上的略有差异,所以需要找出两个数据库的表结构差异. 数据库表结构的差异 注:操作均在Linux系统下完成 ...

  5. nyoj17_又做最大递增子序列

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4   输入 ...

  6. Divide and conquer:Sumsets(POJ 2549)

    数集 题目大意:给定一些数的集合,要你求出集合中满足a+b+c=d的最大的d(每个数只能用一次) 这题有两种解法, 第一种就是对分,把a+b的和先求出来,然后再枚举d-c,枚举的时候输入按照降序搜索就 ...

  7. MPAndroidChart 教程

    以前没用过MPAndroidChart,为了方便学习查找,引用下别个大神的笔记. 其余文章索引: MPAndroidChart 教程:概述MPAndroidChart 教程:开始 Getting St ...

  8. php字符串处理函数相关操作

    <?php//获取tech和98426这两个字符串

  9. maven配置httpclient3.X jar包

    <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging& ...

  10. 躲避大龙(codevs 1961)

    题目描述 Description 你早上起来,慢悠悠地来到学校门口,发现已经是八点整了!(这句话里有一个比较重要的条件) 学校共有N个地点,编号为1~N,其中1号为学校门口(也就是你现在所处的位置), ...