驱动保护中的ObjectType_Callback探索
当前环境:VM中的win7 32 保护程序是某游戏的驱动保护。
具体现象是:在用PCHunter工具查看object钩子时发现如下的信息:
疑问点1:在HOOK列显示的是ObjectType_Callback,以前只听说过ObjectType HOOK没听说过这个呀,这个是什么呢?
疑问点2:Object类型列显示的是“Process” 查阅了《windows内核原理与实现》的55页WRK中的全局类型对象变量,发现不是系统创建的类型,难道这个对象类型是自己创建的?或者说是PCHunter大牛对这类HOOK的一种描述?
疑问点3:就是这种类型的HOOK是怎么注册的呢,又应该怎么卸载了。
带着几个疑问搜索了下ObjectType_Callback 没有发现相关信息,所以决定自己探索一下。
首先来确定疑问点2,这个思路是:对比有HOOK和无HOOK的情况下 查看win7中的ObTypeIndexTable表,看元素是否有增加,如果是自创类型的,在这个表中,应该有增加一项。
这里顺便提一下ObTypeIndexTable表,是从WIN7(具体什么时候新增的我也不知道,总之XP没有)开始新增加的,存放的是对象类型,可以在windbg查看,具体信息原理可以百度搜索“Win7 OBJECT_HEADER之TypeIndex解析”得到解答。
当前有HOOK的情况下WINDBG中显示如下:
其中为了验证,取第三项86a4e7c8来看,可以发现的确是存放的对象类型,前两项是无效。
然后我重启WIN7 在没有HOOK的情况下显示如图:
可以看出数量是没有变化的,从而可以推断疑问2这个HOOK不是新增加对象类型来完成的,只是软件作者对其一种描述吧,那这个东西到底是什么呢?
重新运行游戏以后,HOOK又出现了:
接着解决疑问1,思路是:断点其中的函数,看函数什么时候被调用,看看栈回溯,具体在分析下经历过的函数。
首先反汇编下这两个地址,第一个如下:
第二个函数如下:
第一个函数是空的,第二个函数有内容,断点第二个函数,然后运行,很快断下来了,查看栈回溯如图:
可以看到调用NtOpenProcess的时候就会调用到他,这正起到了保护作用,其中最接近他的ObpCallPreOperationCallbacks函数和ObpPreInterceptHandleCreate函数在WRK中都没有,只有ObpCreateHandle在WRK中可以查到,这个函数解释为:This function creates a new handle to an existing object。相当于为了引用一个对象,新建一个句柄,这个句柄就是这个对象的引用方式。至此我们知道了,是引用一个对象的时候才会触发到这个保护函数,看来PCHunter大牛还是很强大的,把它分到了object钩子这类里边很精确。
由于WRK(假想为XP)中没有这两个函数,所以为了弄清楚什么时候调用的他必须要反汇编以上两个函数,由于才入此道功力尚浅用WINDBG看着费力,所以改为IDA反汇编看,IDA打开内核文件ntkrnlpa.exe 在左侧列表中搜索ObpPreInterceptHandleCreate函数反汇编如图:
引入眼帘的就是对象类型表ObTypeIndexTable,想象一下对象类型的HOOK,看来还是还对象类型有关。再往下看记录找到调用ObpCallPreOperationCallbacks函数的地方
可以看到在开头不远处,发现这个函数代码量也很小,继续跟进这个函数,定位CALL相关的代码,寻找保护函数调用点,一直往下都是系统调用直到这里:
在WINDBG中栈回溯显示的是
9d158758 840df832 xxxx!SampleDouble+0xcdf8
9d1587a0 840dfa1f nt!ObpCallPreOperationCallbacks+0x163
9d1587e8 8402dbfb nt!ObpPreInterceptHandleCreate+0x6f
对比下代码看看是不是这个地方,也可以计算下位置看看是不是这个地方,我比较懒就直接对比下吧,如图:
看来应该这就是调用点,再从CALL EAX中的EAX反推回去,看看怎么来的。通过IDA的鼠标点击变量寄存器变色可以轻松定位出以下过程EAX-》
006D581F mov eax, [edi+18h]-》
006D572C mov edi, [eax]-》
006D5729 mov eax, [ebp+var_C]-》
006D56E7 mov [ebp+var_C], eax-》
006D56DF lea eax, [edi+80h]-》
006D56DD mov edi, eax
说明在这个函数调用时 EAX就是关键所在了,分析上一个函数入调用点
通过前边的截图可以看到 EAX-》
006D5A12 mov eax, edx-》
006D59C0 mov edx, _ObTypeIndexTable[eax*4]
看来一切原因都来自于对象类型。
006D5A12位置的EAX是一个_OBJECT_TYPE WINDBG中看看WIN7中的结构成员
可以推测006D56DF中的EAX就是一个CallbackList了,看看这个名字再看看PCHunter中的ObjectType_Callback真是完全一样啊,回想先前也看了下_OBJECT_TYPE结构但是没注意到这个成员,想必一定是他保存了回调,这是一个双链表。现在就来看看这个对象类型里边的具体内容,想必就应该可以找到保护函数的地址了。
通过前边的分析可以知道再调用ObpCallPreOperationCallbacks函数时的EAX就是当前对象类型的地址,所以在这里设置断点,当然也有可能是其它的函数调用它,虽然知道不正确但是也只有赌一把了,具体操作如下:
可以看到名称是Process这和工具里边显示的是一样,感觉应该就是它了,在具体查看一下CallbackList 看看链表的内容
第一项链表头节点指向首节点a83175f8,首节点也指向首节点86ad3f30,看来只有双向链表中只有一项,查看内容发现红框处就是保护函数的地址,双链表结构也说明还可以增加其他的callback函数。
整体回顾一下 当NtOpenProcess被调用时就会调用到保护函数,这个函数是放在进程对象类型中的CallbackList中的,系统会调用它,且这个结构是双链表,还可以增加其他函数,至此疑问1基本就解决了。
接着来看疑问3,既然知道系统有这么一个机制,肯定应该有相应的系统函数吧,总不可能手工来添加删除吧,既然知道了这个新成员名称就应该搜索下,看看有什么信息 GOOGLE搜索下发现有以下内容
再翻译了下大致就是说ObRegisterCallbacks函数来注册的回调,MSDN搜索发现有这样的解释:The ObRegisterCallbacks routine registers a list of callback routines for thread and process handle operations.
这和我们遇到的情况一样,看来保护函数就是用这个函数来添加的了,怎么卸载呢?看看MSDN的左侧栏
发现一个对应的UN函数 点击查看解释:The ObUnRegisterCallbacks routine unregisters a set of callback routines that were registered with the ObRegisterCallbacks routine.
看来就是它了,两个函数的参数和进程创建卸载的系统回调差不多,具体可以参考《教你在64位Win7系统下使用ObRegisterCallbacks内核函数来实现进程保护》http://bbs.pediy.com/showthread.php?t=168023
到此这几个疑问就解决了,至于后边的是删除还是修改保护函数就看到自己的想法了。
jpg 转 rar
驱动保护中的ObjectType_Callback探索的更多相关文章
- INLINE HOOK过简单驱动保护的理论知识和大概思路
这里的简单驱动保护就是简单的HOOK掉内核API的现象 找到被HOOK的函数的当前地址在此地址处先修改页面保护属性然后写入5个字节.5个字节就是一个简单的JMP指令.这里说一下JMP指令,如下: 00 ...
- 过 DNF TP 驱动保护(二)
过 DNF TP 驱动保护(二) 文章目录: 01. 博文简介: 02. 环境及工具准备: 03. 分析 TP 所做的保护: 04. 干掉 NtOpenProc ...
- 过 DNF TP 驱动保护(一)
过 DNF TP 驱动保护(一) 文章目录: 01. 博文简介: 02. 环境及工具准备: 03. 分析 TP 所做的保护: 04. 干掉 NtOpenProc ...
- FPGA中计数器设计探索
FPGA中计数器设计探索,以计数器为32位为例: 第一种方式,直接定义32位计数器. reg [31:0]count; quartus ii 下的编译,资源消耗情况. 85C模型下的时钟频率. 0C模 ...
- Linux驱动设备中的并发控制
一.基本概念 二.中断屏蔽 三.原子操作 四.自旋锁 五.信号量 六.互斥体 七.自旋锁与信号量的比较 Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态,即使 ...
- VS中Qt的探索02
边看C++ GUI QT4教程,边在VS2010中进行编程学习探索. 在使用Qt设计师时,其中每一个对象的ObjectName属性是非常重要的,在程序功能的实现过程中,需要不断的使用该变量名. 当所有 ...
- Linux设备驱动编程中的中断与定时器处理
所谓中断是指CPU在执行过程中,出现某些突发时间急待处理,CPU必须暂停执行当前的程序,转去处理突发事件,处理完毕后CPU又返回原程序被中断的位置并继续执行. 中断分为(根据中断源来分): 内部中断 ...
- 【原创】驱动开发中Memory read error导致的蓝屏问题
最近在看着<windows驱动开发技术详解>这本书,模仿着敲了第七章中的模拟文件读写部分.在Debug过程中,蓝屏了好多次并出现了各种奇葩的问题.在调了快两天之后,问题终于解决了!现在在这 ...
- 通过修改CR0寄存器绕过SSDT驱动保护
为了安全起见,Windows XP及其以后的系统将一些重要的内存页设置为只读属性,这样就算有权力访问该表也不能随意对其修改,例如SSDT.IDT等.但这种方法很容易被绕过,我们只要将这些部分修改为可写 ...
随机推荐
- android WiFi ASSOC_REJECT 流程跟踪
Android设备在于AP关联时,如果AP返回关联拒绝帧,Android设别会把AP加入黑名单中. 黑名单中的设备将会在扫描时,延时一段时间放在后面处理. 代码以及log基于SDM450, Andro ...
- e740. 向标签中加入一个图标
This example creates a JLabel component with an icon. // Fetch icon Icon icon = new ImageIcon(" ...
- python获取代码行号
获取行号: def get_file(): print("文件名 :",__file__,sys._getframe().f_lineno) print("函数名: &q ...
- Android多国语言的value文件夹命名方式
在res目錄下建立不同名稱的values文件來調用不同的語言包Values文件匯總如下:中文(中國):values-zh-rCN中文(台灣):values-zh-rTW中文(香港):values-zh ...
- python调用ansible接口API执行命令
python版本:Python 2.6.6 ansible版本:ansible 2.3.1.0 下载地址:https://releases.ansible.com/ansible/ 调用脚本 ...
- Linux下的rename命令
Dos/Windows下,对文件改名用rename.而书上说,Linux下对文件或目录改名该用mv.我一直也是这样做的,却忽略了Linux下也有个叫rename的命令.都是rename,但功能上就有点 ...
- .net framework 4.0上跑webapi 1.0
public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web AP ...
- SOAP消息头的处理
SOAP消息头的处理 WebService学习总结(四)——调用第三方提供的webService服务 SOAP中 RPC/ENC 为啥被抛弃
- linux任务计划 chkconfig工具 systemd管理服务 unit介绍 target介绍
linux任务计划 任务计划:特定时间备份数据,重启服务,shell脚本,单独的命令等等. 任务计划配置文件:cat /etc/crontab [root@centos7 ~]# cat /etc/c ...
- go语言中文网中的资源
https://studygolang.com/subject/2 Go 系列教程 https://studygolang.com/subject/74 Go 语言机制 https://s ...