首页
论坛
专栏
课程

[原创]win7 x64 下的Object Hook

2015-9-1 04:07 9364

[原创]win7 x64 下的Object Hook

2015-9-1 04:07
9364
x86下Object Hook很简单,后来到了x64,发现Hook蓝屏,于是自己动手研究了下,发现PspProcessOpen是下是mov rcx,qword ptr [rsp+28h]得出至少9个参数
于是开始敲代码呗,不知道的全部用int64替换掉,重要的几个参数通过逆向得到了,
直接上码吧 不需要过PG
上个图

#include "ntddk.h"

typedef NTSTATUS (*PSPPROCESSOPEN)(unsigned __int64 arg1,unsigned __int64 arg2,IN PEPROCESS Process OPTIONAL,IN PVOID Object,unsigned __int64 arg5,
								   unsigned __int64 arg6,unsigned __int64 arg7,unsigned __int64 arg8,unsigned __int64 arg9);

//g
ULONG	  IsHook = 1;
ULONGLONG oldOpenProcedure;


NTSTATUS MyOpenProcedure(unsigned __int64 arg1,unsigned __int64 arg2,IN PEPROCESS Process OPTIONAL,IN PVOID Object,unsigned __int64 arg5,
									unsigned __int64 arg6,unsigned __int64 arg7,unsigned __int64 arg8,unsigned __int64 arg9)
{
	if(strstr((char*)Object+0x2e0,"calc.exe")!=0)
	{
		if(strstr((char*)Process+0x2e0,"explorer.exe")!=0)//过滤explorer.exe
		{
			return ((PSPPROCESSOPEN)oldOpenProcedure)(arg1,arg2,Process,Object,arg5,arg6,arg7,arg8,arg9);
		}
		KdPrint(("%s OpenProcess %s",(char*)Process+0x2e0,(char*)Object+0x2e0));//不是2d8 ???;
		return STATUS_UNSUCCESSFUL;
	}
		
		
	return ((PSPPROCESSOPEN)oldOpenProcedure)(arg1,arg2,Process,Object,arg5,arg6,arg7,arg8,arg9);
}

void SetObjectHook()
{
	oldOpenProcedure = *(ULONGLONG*)((ULONGLONG)*PsProcessType+0x78);
	if(oldOpenProcedure ==0)
	{
		KdPrint(("OpenProcedure is NULL;"));
		IsHook =0;
		return;//如果是NULL 说明系统没有这个回调 返回;
	}
	*(ULONGLONG*)((ULONGLONG)*PsProcessType+0x78) = (ULONGLONG)MyOpenProcedure;
}

void ResObjectHook()
{
	if(IsHook==1)
	{
		*(ULONGLONG*)((ULONGLONG)*PsProcessType+0x78) = oldOpenProcedure;
	}
}

void DriverUnload(PDRIVER_OBJECT pDriverObject)
{
	ResObjectHook();
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pUnicodeString)
{
	SetObjectHook();
	pDriverObject->DriverUnload = DriverUnload;
	return STATUS_SUCCESS;
}


[公告]LV6级以上的看雪会员可以免费获得《2019安全开发者峰会》门票一张!!

上传的附件:
最新回复 (13)
kz丶cn 2015-9-1 04:12
2
0
代码写的不好,只是测试用的...
GeekCheng 2 2015-9-1 07:45
3
0
好东西啊,X64的 object钩子
啤酒肚 2015-9-1 08:30
4
0
你对PG理解,太少了。不是简单的改函数,改参数就ok的。你这个是可以运行了,但是过半个小时就会蓝屏。
木瓜枫叶 2 2015-9-1 08:58
5
0
是啊,PG 还是会检测到的,老师,pass pg 不现实啊,客户知道的话不会同意的,有啥好办法没
还有,win64 下 有没有好的隐藏dll 的办法呢,求老师指教
影子不寂寞 2015-9-1 09:26
6
0
楼主辛苦了,那么晚还在发技术帖。
viphack 4 2015-9-1 11:03
7
0
10个参数才对
z许 2015-9-1 14:10
8
0
你这个。要是打开权限之类的话,为嘛要用obj hook,直接用obj回调哇。

ObRegisterCallbacks

http://bbs.pediy.com/showthread.php?t=168023
kz丶cn 2015-9-1 20:38
9
0
我测试没蓝
kz丶cn 2015-9-1 20:40
10
0
貌似对openProcess的处理不太好..
啤酒肚 2015-9-2 06:27
11
0
如果这条路能走通,x64早就大批hook出现了。
KiDebug 4 2015-9-2 21:32
12
0
win7 x64 objecthook 不会蓝屏。从win8开始会,所以还是ObRegisterCallbacks吧
xmlpull 2015-9-3 12:56
13
0
学习了。
老坛酸菜TM 2018-7-17 16:18
14
0
不是有现成的ObRegisterCallbacks吗,你还这么折腾干什么!
NTSTATUS ObProtectProcess(BOOLEAN Enable)
{
       PAGED_CODE();
       if (Enable == TRUE)
       {
               NTSTATUS obst1 = 0, obst2 = 0;
               OB_CALLBACK_REGISTRATION obReg, obReg2;
               OB_OPERATION_REGISTRATION opReg, opReg2;

               //reg ob callback 1
               memset(&obReg, 0, sizeof(obReg));
               obReg.Version = ObGetFilterVersion();
               obReg.OperationRegistrationCount = 1;
               obReg.RegistrationContext = NULL;
               RtlInitUnicodeString(&obReg.Altitude, L"321124");
               obReg.OperationRegistration = &opReg;
               memset(&opReg, 0, sizeof(opReg));
               opReg.ObjectType = PsProcessType;
               opReg.Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;
               opReg.PreOperation = (POB_PRE_OPERATION_CALLBACK)&preCall;
               obst1 = ObRegisterCallbacks(&obReg, &obHandle);

               //reg ob callback 2
               memset(&obReg2, 0, sizeof(obReg2));
               obReg2.Version = ObGetFilterVersion();
               obReg2.OperationRegistrationCount = 1;
               obReg2.RegistrationContext = NULL;
               RtlInitUnicodeString(&obReg2.Altitude, L"321125");
               obReg2.OperationRegistration = &opReg2;
               memset(&opReg2, 0, sizeof(opReg2));
               opReg2.ObjectType = PsThreadType;
               opReg2.Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;
               opReg2.PreOperation = (POB_PRE_OPERATION_CALLBACK)&preCall2;
               obst1 = ObRegisterCallbacks(&obReg2, &obHandle2);
               
               return NT_SUCCESS(obst1) & NT_SUCCESS(obst2);
       }
       else
       {
               if (obHandle != NULL)
                       ObUnRegisterCallbacks(obHandle);
               if (obHandle2 != NULL)
                       ObUnRegisterCallbacks(obHandle2);
               return TRUE;
       }
}
游客
登录 | 注册 方可回帖
返回