一个简单的Object Hook的例子(win7 32bit)
Object Hook简单的来说就是Hook对象,这里拿看雪上的一个例子,因为是在win7 32位上的,有些地方做了些修改。
_OBJECT_HEADER:
kd> dt _OBJECT_HEADER
nt!_OBJECT_HEADER
+0×000 PointerCount : Int4B
+0×004 HandleCount : Int4B
+0×004 NextToFree : Ptr32 Void
+0×008 Lock : _EX_PUSH_LOCK
+0x00c TypeIndex : UChar
+0x00d TraceFlags : UChar
+0x00e InfoMask : UChar
+0x00f Flags : UChar
+0×010 ObjectCreateInfo : Ptr32 _OBJECT_CREATE_INFORMATION
+0×010 QuotaBlockCharged : Ptr32 Void
+0×014 SecurityDescriptor : Ptr32 Void
+0×018 Body : _QUAD
在Win7 Object_Header之TypeIndex解析已经说了怎么通过TypeIndex得到对象类型:
_OBJECT_TYPE:
kd> dt _OBJECT_TYPE
nt!_OBJECT_TYPE
+0×000 TypeList : _LIST_ENTRY
+0×008 Name : _UNICODE_STRING
+0×010 DefaultObject : Ptr32 Void
+0×014 Index : UChar
+0×018 TotalNumberOfObjects : Uint4B
+0x01c TotalNumberOfHandles : Uint4B
+0×020 HighWaterNumberOfObjects : Uint4B
+0×024 HighWaterNumberOfHandles : Uint4B
+0×028 TypeInfo : _OBJECT_TYPE_INITIALIZER
+0×078 TypeLock : _EX_PUSH_LOCK
+0x07c Key : Uint4B
+0×080 CallbackList : _LIST_ENTRY
对象类型结构主要是创建对象类型,比如*IoFileObjectType, *PsProcessType, *PsThreadType 这些。
系统初始化的时候第一个创建的对象类型结构就是TYPE结构,生成对象目录\ObjectTypes 其后面的对象类型直接挂在这个目录上
比如对象类型 \ObjectTypes\File 或者设备类型 \ObjectTypes\Device
最重要的是下面这个结构:
kd> dt _OBJECT_TYPE_INITIALIZER
nt!_OBJECT_TYPE_INITIALIZER
+0×000 Length : Uint2B
+0×002 ObjectTypeFlags : UChar
+0×002 CaseInsensitive : Pos 0, 1 Bit
+0×002 UnnamedObjectsOnly : Pos 1, 1 Bit
+0×002 UseDefaultObject : Pos 2, 1 Bit
+0×002 SecurityRequired : Pos 3, 1 Bit
+0×002 MaintainHandleCount : Pos 4, 1 Bit
+0×002 MaintainTypeList : Pos 5, 1 Bit
+0×002 SupportsObjectCallbacks : Pos 6, 1 Bit
+0×004 ObjectTypeCode : Uint4B
+0×008 InvalidAttributes : Uint4B
+0x00c GenericMapping : _GENERIC_MAPPING
+0x01c ValidAccessMask : Uint4B
+0×020 RetainAccess : Uint4B
+0×024 PoolType : _POOL_TYPE
+0×028 DefaultPagedPoolCharge : Uint4B
+0x02c DefaultNonPagedPoolCharge : Uint4B
+0×030 DumpProcedure : Ptr32 void
+0×034 OpenProcedure : Ptr32 long
+0×038 CloseProcedure : Ptr32 void
+0x03c DeleteProcedure : Ptr32 void
+0×040 ParseProcedure : Ptr32 long
+0×044 SecurityProcedure : Ptr32 long
+0×048 QueryNameProcedure : Ptr32 long
+0x04c OkayToCloseProcedure : Ptr32 unsigned char
后面这几个函数决定对象的一些操作,例如 打开、创建、删除,不同对象类型(OBJECT_TYPE)的操作也不同,所以要清楚知道对象是什么类型。
当你调用NtCreateFile->IoCreateFile->ObOpenObjectByName->ObpLookupObjectName->IopParseFile->IopParseDevice
IopParseFile最终也会调用IopParseDevice
ObjectHook其实就是比如你要HOOK 创建打开就是OBJECT_TYPE_INITIALIZER->ParseProcedure。
代码如下:
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
#include <ntddk.h>
typedef PULONG (NTAPI *OBGETOBJECTTYPE)(PVOID); typedef struct _OBJECT_TYPE_INITIALIZER { POBJECT_TYPE pType = NULL; NTSTATUS NewParseProcedure(IN PVOID ParseObject, KdPrint(("pType is %08X\n",pType)); pType->TypeInfo.ParseProcedure = NewParseProcedure;//hook 因为object原本就是是可写的,所以不用特意去除内存保护 NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath) |
效果:
![]()
![]()
本文链接:http://www.blogfshare.com/object-hook.html
object_header地址=_EPROCESS地址
jpg 改 rar
一个简单的Object Hook的例子(win7 32bit)的更多相关文章
- 一个简单的Spring测试的例子
在做测试的时候我们用到Junit Case,当我们的项目中使用了Sring的时候,我们应该怎么使用spring容器去管理我的测试用例呢?现在我们用一个简单的例子来展示这个过程. 1 首先我们新建一个普 ...
- CSS布局中一个简单的应用BFC的例子
什么是BFC BFC(Block Formatting Context),简单讲,它是提供了一个独立布局的环境,每个BFC都遵守同一套布局规则.例如,在同一个BFC内,盒子会一个挨着一个的排,相邻盒子 ...
- Oracle学习笔记:一个简单的行转列例子
一个简单的行列转换例子,原始数据. create table temp_cwh_student ( name ), subject ), score ) ) select * from temp_cw ...
- [原][译][lua][luabridge]一个简单的luabridge与c++例子结合例子
参考:https://eliasdaler.wordpress.com/tag/luabridge/ https://eliasdaler.wordpress.com/2015/08/10/using ...
- 一个简单的 ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript 。
前言 TypeScript 是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架 ...
- 一个简单的Springmvc应用开发例子
SpringMVC应用的配置步骤: 1,将所有的jar包导入到lib文件夹下: jar在spring框架包-->libs-->所有的 ...
- shiro的基本认识及做一个简单的授权登陆的例子
先推荐一个网站,无意中发现的.感觉蛮好的. 推荐一套完整的Shiro Demo,免费的.Shiro Demo:http://www.sojson.com/shiroDemo已经部署到线上,地址是htt ...
- 一个简单的Spring的AOP例子
目标对象的接口:IStudent.java 1 /** 2 * 3 */ 4 package com.dragon.study; 5 6 /** 7 * @author ...
- 7.qfilesystemmodel rowcount 为什么为0? 一个简单的model类的例子
任务: 1.新建一个空的mainwindow项目 2.debug下编译得到一个文件夹,应用程序输出这个文件夹中的文件(不显示文件夹中的文件夹) 3.使用QFileSystemModel完成. 本例显示 ...
随机推荐
- android通过BitmapFactory.decodeFile获取图片bitmap报内存溢出的解决办法
android通过BitmapFactory.decodeFile获取图片bitmap报内存溢出的解决办法 原方法: public static Bitmap getSmallBitmap(Strin ...
- NGUI Table页(UIToggle和UIToggledObjects)
1.添加两个按钮Btn1和Btn2.添加2个Spr1和Spr2 2.给每个Btn添加两个脚本UIToggle和UIToggledObjects 3.将每个UIToggle的Group设置个非0的值 4 ...
- redis与memcache区别总结
2015年9月2日 14:04:19 总会被问到两者的区别, 在这里总结下: redis 有内置的多种数据结构, list(可用于实现小型队列), hash, set, zset...; memcac ...
- Java for LeetCode 206 Reverse Linked List
Reverse a singly linked list. 解题思路: 用Stack实现,JAVA实现如下: public ListNode reverseList(ListNode head) { ...
- 【leetcode】Reorder List (middle)
Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do thi ...
- 【XLL API 函数】 xlGetInst
返回正在调用 DLL 的 Excel 实例的实例句柄. 原型 Excel4(xlGetInst, LPXLOPER pxRes, 0); /* returns low part only */ Exc ...
- September 29th 2016 Week 40th Thursday
Prosperity discovers vice, adversity virtue. 得意时露瑕疵,逆境中见品质. I wish I would have someone like you, fr ...
- oracle sqlplus存储过程控制台输出信息
如果你是使用PL/sql工具,在command 窗口下执行set serveroutput on 然后exec sp;可以看到了或者在sqlplus 中执行上面的代码
- 模拟赛1031d1
NP(np)Time Limit:1000ms Memory Limit:64MB题目描述LYK 喜欢研究一些比较困难的问题,比如 np 问题.这次它又遇到一个棘手的 np 问题.问题是这个样子的:有 ...
- spring中scope作用域(转)
今天研究了一下scope的作用域.默认是单例模式,即scope="singleton".另外scope还有prototype.request.session.global sess ...