首页
社区
课程
招聘
[求助]inline hook 蓝屏(求助啊大侠)
发表于: 2009-12-7 01:56 5354

[求助]inline hook 蓝屏(求助啊大侠)

2009-12-7 01:56
5354
大哥们,我照着竹君的代码敲的!
蓝屏了,怎么搞的,大侠们帮我看看吧!谢谢了! 后面有源码和sys
http://bbs.pediy.com/showthread.php?t=98493
#include "Driver.h"
typedef  UCHAR   BYTE, *PBYTE;
ULONG CROVALUE;
BYTE OriginalBytes[5] = {0};
BYTE JmpAddress[5] = {0xE9,0,0,0,0};
POBJECT_TYPE *PsProcesType;
//extern  POBJECT_TYPE *PsProcesType;
//VOID   ObDereferenceObject( IN PVOID  Object);
NTKERNELAPI NTSTATUS ObReferenceObjectByHandle(
	IN HANDLE Handle,
	IN ACCESS_MASK DesiredAccess,
	IN POBJECT_TYPE ObjectType OPTIONAL,
	IN KPROCESSOR_MODE AccessMode,
	OUT PVOID *Object,
	OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
	);
NTSTATUS DetourMyObReferenceObjectByHandle(
	IN HANDLE Handle,
	IN ACCESS_MASK DesiredAccess,
	IN POBJECT_TYPE ObjectType OPTIONAL,
	IN KPROCESSOR_MODE AccessMode,
	OUT PVOID *Object,
	OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
	);
VOID HookObReferenceObjectByHandle()
{
	KIRQL Irql;
	KdPrint(("ObReferenceObjectByHandle:0x%x\n",ObReferenceObjectByHandle));
	RtlCopyMemory(OriginalBytes,(BYTE *)ObReferenceObjectByHandle,5);
	*(ULONG *)(JmpAddress+1) = (ULONG)DetourMyObReferenceObjectByHandle-((ULONG)ObReferenceObjectByHandle+5);
	__asm
	{
		push eax
		mov eax,cr0
		mov CROVALUE,eax
		and eax,0fffeffffh
		mov cr0,eax
		pop eax
	}
	Irql = KeRaiseIrqlToDpcLevel();
	RtlCopyMemory((BYTE*)ObReferenceObjectByHandle,JmpAddress,5);
	KeLowerIrql(Irql);
	__asm
	{
		push eax
		mov eax,CROVALUE
		mov cr0,eax
		pop eax
	}

}
__declspec(naked) NTSTATUS OriginalObReferenceObjectByHandle(
	       IN HANDLE Handle,
	       IN ACCESS_MASK DesiredAccess,
	       IN POBJECT_TYPE ObjectType OPTIONAL,
	       IN KPROCESSOR_MODE AccessMode,
	       OUT PVOID *Object,
	       OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
	)
{
	__asm 
	{
		mov edi,edi
		push ebp
		mov ebp,esp
		mov eax,ObReferenceObjectByHandle
		add eax,5
		jmp eax
	}
}

NTSTATUS DetourMyObReferenceObjectByHandle(
	IN HANDLE Handle,
	IN ACCESS_MASK DesiredAccess,
	IN POBJECT_TYPE ObjectType OPTIONAL,
	IN KPROCESSOR_MODE AccessMode,
	OUT PVOID *Object,
	OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
	)
{	NTSTATUS status;
	status = OriginalObReferenceObjectByHandle(Handle,DesiredAccess,ObjectType,AccessMode,Object,HandleInformation);
	if((status == STATUS_SUCCESS) && (DesiredAccess ==1))
	{
		if(ObjectType == *PsProcesType)
		{
			if(_stricmp((char *)((ULONG)(*Object) + 0x174), "notepad.exe") == 0)
			{
				ObDereferenceObject(*Object);
				return STATUS_INVALID_HANDLE;
			}
		}
	}
	return status;
}
VOID UnHookObReferenceObjectByHandle()
{
	KIRQL Irql;
	__asm
	{
		push eax
		mov eax,cr0
		mov CROVALUE,eax
		and eax,0fffeffffh
		mov cr0,eax
		pop eax
	}
	Irql = KeRaiseIrqlToDpcLevel();
	RtlCopyMemory((BYTE *)ObReferenceObjectByHandle,OriginalBytes,5);
	KeLowerIrql(Irql);
	__asm
	{
		push eax
		mov eax,CROVALUE
		mov cr0,eax
		pop eax
	}
}

#pragma INITCODE
extern "C" NTSTATUS DriverEntry (
			IN PDRIVER_OBJECT pDriverObject,
			IN PUNICODE_STRING pRegistryPath	) 
{
	NTSTATUS status;
	KdPrint(("Enter DriverEntry\n"));

	
	pDriverObject->DriverUnload = HelloDDKUnload;
	pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
	pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
	pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
	pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;
	
	
	status = CreateDevice(pDriverObject);

	HookObReferenceObjectByHandle();	

	KdPrint(("DriverEntry end\n"));
	return status;
}

#pragma INITCODE
NTSTATUS CreateDevice (
		IN PDRIVER_OBJECT	pDriverObject) 
{
	NTSTATUS status;
	PDEVICE_OBJECT pDevObj;
	PDEVICE_EXTENSION pDevExt;
	
	
	UNICODE_STRING devName;
	RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice");
	
	
	status = IoCreateDevice( pDriverObject,
						sizeof(DEVICE_EXTENSION),
						&(UNICODE_STRING)devName,
						FILE_DEVICE_UNKNOWN,
						0, TRUE,
						&pDevObj );
	if (!NT_SUCCESS(status))
		return status;

	pDevObj->Flags |= DO_BUFFERED_IO;
	pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
	pDevExt->pDevice = pDevObj;
	pDevExt->ustrDeviceName = devName;
	
	UNICODE_STRING symLinkName;
	RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK");
	pDevExt->ustrSymLinkName = symLinkName;
	status = IoCreateSymbolicLink( &symLinkName,&devName );
	if (!NT_SUCCESS(status)) 
	{
		IoDeleteDevice( pDevObj );
		return status;
	}

	return STATUS_SUCCESS;
}

#pragma PAGEDCODE
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject) 
{
	PDEVICE_OBJECT	pNextObj;
	KdPrint(("Enter DriverUnload\n"));
	pNextObj = pDriverObject->DeviceObject;
	while (pNextObj != NULL) 
	{
		PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
			pNextObj->DeviceExtension;

		
		UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
		IoDeleteSymbolicLink(&pLinkName);
		pNextObj = pNextObj->NextDevice;
		IoDeleteDevice( pDevExt->pDevice );
	}
	UnHookObReferenceObjectByHandle();
}

#pragma PAGEDCODE
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
								 IN PIRP pIrp) 
{
	KdPrint(("Enter HelloDDKDispatchRoutine\n"));
	NTSTATUS status = STATUS_SUCCESS;
	
	pIrp->IoStatus.Status = status;
	pIrp->IoStatus.Information = 0;	
	IoCompleteRequest( pIrp, IO_NO_INCREMENT );
	KdPrint(("Leave HelloDDKDispatchRoutine\n"));
	return status;
}


inlinehook.rar

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
2
这样写看下:

抱歉,虚拟机没序列号,不过我估计问题在这个函数里面

NTSTATUS DetourMyObReferenceObjectByHandle(
        IN HANDLE Handle,
        IN ACCESS_MASK DesiredAccess,
        IN POBJECT_TYPE ObjectType OPTIONAL,
        IN KPROCESSOR_MODE AccessMode,
        OUT PVOID *Object,
        OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
        )
{        NTSTATUS status;
    PVOID pObject;
        status = OriginalObReferenceObjectByHandle(Handle,DesiredAccess,ObjectType,AccessMode,&pObject,HandleInformation);
        if((status == STATUS_SUCCESS) && (DesiredAccess ==1))
        {
                if(ObjectType == *PsProcesType)
                {
                        if(!_strnicmp((char *)((ULONG)(pObject) + 0x174), "notepad",sizeof((char *)((ULONG)(pObject) + 0x174))))
                        {
                                ObDereferenceObject(pObject);
                                *Object = NULL;
                                return STATUS_INVALID_HANDLE;
                        }
                }else
                {
                        *Object = pObject;
                        return status;
                }
        }
        return status;
}
2009-12-7 02:46
0
雪    币: 245
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3

照样蓝屏啊!不行!
2009-12-7 03:29
0
雪    币: 612
活跃值: (961)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
蓝在这一句,if(ObjectType == *PsProcesType),指向PsProcesType为无效地址!
2009-12-7 04:04
0
雪    币: 245
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
那怎么改呢!谢谢 ,太菜了我 msdn 上是这的说的!
IN POBJECT_TYPE  ObjectType  OPTIONAL,

This parameter can also be NULL if AccessMode is KernelMode
2009-12-7 05:18
0
雪    币: 245
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
希望大牛指点一下啊!!
2009-12-7 10:04
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
7
你要检查的是  pObject的type,而不是 ObjectType
2009-12-7 15:53
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
8
竹君的原文:
extern POBJECT_TYPE *PsProcessType;

你的代码:
POBJECT_TYPE *PsProcesType;
if(ObjectType == *PsProcesType)

是PsProcessType不是PsProcesType好不好,这个名字不是随意的,是必须和ntoskrnl.exe导出的名字一致的,这样的拼写错误,真是无语了。
2009-12-7 16:21
0
雪    币: 245
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
我已经知道了!不过还是谢谢轩辕小聪(偶像级别的人物啊)!
导出变量,很少了解!原来,是很重要的啊!
achillis 原话,解答全在帖子中!(http://bbs.pediy.com/showthread.php?t=65731&highlight=inline+hook&page=2)
PsProcess已经导出了,所以只需声明一下就可以了,就像搞SSDT时需要声明KeServiceDescriptorTable一样。顺便再把此帖顶出来,楼主闭关许久,现在功力大增啊
2009-12-7 17:31
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
10
http://bbs.pediy.com/showthread.php?t=95029&highlight=
这个函数是HOOK例子很多  论坛 N多例子 我这个效率还是不错的
2009-12-7 19:01
0
雪    币: 245
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
原创来了,哈哈!我是山寨的!
2009-12-7 20:58
0
雪    币: 245
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
inlinehook.obj() : error LNK2001: unresolved external symbol "struct _OBJECT_TYP
E * * PsProcessType" (?PsProcessType@@3PAPAU_OBJECT_TYPE@@A)
什么错误啊?
2009-12-7 21:08
0
雪    币: 245
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
extern POBJECT_TYPE *PsProcessType;  报上面的错!

inlinehook.obj() : error LNK2001: unresolved external symbol "struct _OBJECT_TYP
E * * PsProcessType" (?PsProcessType@@3PAPAU_OBJECT_TYPE@@A)

extern POBJECT_TYPE * PsProcessType = NULL;又蓝了!
救命啊!
2009-12-7 21:25
0
雪    币: 245
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
加句extern "C"就可以了!哎~
我还以为是没有 #pragma comment(lib,"ntoskrnl.lib")
2009-12-7 21:33
0
游客
登录 | 注册 方可回帖
返回
//