首页
社区
课程
招聘
[求助]大家帮我,inline hook NtOpenProcess
发表于: 2010-10-9 21:10 4704

[求助]大家帮我,inline hook NtOpenProcess

2010-10-9 21:10
4704
下面代码是inline hook NtOpenProcess
不是从函数开头开始的,是从开头开始第六个字节开始hook的
这只是一个空架子,也就是hook了,但没做任何事。
我想让它能保护pid为1234的一个进程,应该怎么办啊?
谢谢大家~~

下面是代码:

#include <NTDDK.h>
ULONG TestFunctionAddr=0;
ULONG TestFunctionAddrNew=0;
UCHAR SoureCode[5]={0x68,0xc4,0x00,0x00,0x00};

VOID WPOFF(VOID)
{
__asm
{
cli
mov eax,cr0
and eax,not 10000h
mov cr0,eax
}
}

VOID WPON(VOID)
{
__asm
{
mov eax,cr0
or eax,10000h
mov cr0,eax
sti
}
}

VOID MyFunction()
{
KdPrint(("NtOpenProcessing"));
}

NTSTATUS _declspec(naked) MyNtOpenProcess( OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId OPTIONAL )
{
__asm
{
PUSH 0x4130D8
call MyFunction
mov eax,TestFunctionAddrNew
add eax,5
jmp eax
}
}

VOID StartInLineHook()
{
ULONG JmpOffset;
UCHAR JmpCode[5]={0xe9,0x00,0x00,0x00,0x00};

if (TestFunctionAddrNew==0)
{
KdPrint(("函数地址未找到"));
return;
}
KdPrint(("NtOpenProcess的地址是:%08X",TestFunctionAddrNew));
KdPrint(("MyNtOpenProcess的地址是:%08X",MyNtOpenProcess));
JmpOffset=(PCHAR)MyNtOpenProcess-(PCHAR)TestFunctionAddrNew-5;

KdPrint(("JmpOffset的值是:%08X",JmpOffset));
RtlCopyMemory(JmpCode+1,&JmpOffset,4);
WPOFF();
RtlCopyMemory((PVOID)TestFunctionAddrNew,(PVOID)JmpCode,5);
WPON();
}

VOID DriverUnload (PDRIVER_OBJECT pDriverObject)
{
WPOFF();
RtlCopyMemory((PVOID)TestFunctionAddrNew,SoureCode,5);
WPON();
KdPrint(("InLine HOOK已恢复!!!\n驱动服务已卸载\n"));
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegistryPath)
{

UNICODE_STRING FunctionName;
KdPrint(("进入驱动入口\n"));
pDriverObject->DriverUnload =DriverUnload;
RtlInitUnicodeString(&FunctionName,L"NtOpenProcess");
TestFunctionAddr=(ULONG)MmGetSystemRoutineAddress(&FunctionName);
TestFunctionAddrNew=TestFunctionAddr+0x5;
KdPrint(("NtOpenProcessDE的地址是:%08X",TestFunctionAddr));
KdPrint(("NtOpenProcessDE的地址是:%08X",TestFunctionAddrNew));
StartInLineHook();
return STATUS_SUCCESS;

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 14
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
NtOpenProcess
typedef	NTSTATUS(NTAPI*DefNtOpenProcess)(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES,PCLIENT_ID);

DefNtOpenProcess	OrgOpenProcess;

NTSTATUS
NTAPI
OnNtOpenProcess (
			   OUT PHANDLE ProcessHandle,
			   IN ACCESS_MASK DesiredAccess,
			   IN POBJECT_ATTRIBUTES ObjectAttributes,
			   IN PCLIENT_ID ClientId OPTIONAL
			   )
{
	HANDLE		ProctectPID =(HANDLE) 1234;
	
	if(ClientId && ClientId->UniqueProcess == ProctectPID) //有人打开 Pid = 1234 的进程。
	{
		KdPrint(("使其打开失败\n"));
		return	STATUS_UNSUCCESSFUL;
	}

	return	OrgOpenProcess(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId);
}

DriverEntry
#pragma		INITCODE
extern "C"
NTSTATUS
DriverEntry (
			 IN PDRIVER_OBJECT pDriverObject,
			 IN PUNICODE_STRING pRegistryPath) 
{
	NTSTATUS status=STATUS_SUCCESS;
	pDriverObject->DriverUnload = Unload;
	KdPrint(("DriverEntry!.\n"));

	//
	//InlineHook NtOpenProcess
	//

	OrgOpenProcess = (DefNtOpenProcess) InlineHook((PVOID)NtOpenProcess,(PVOID)OnNtOpenProcess);

	return status;
}

VOID	Unload(IN PDRIVER_OBJECT pDriverObject)
{
	//
	//UnInlineHook
	//
	UnInlineHook(OrgOpenProcess);
	KdPrint(("Unload.\n"));
		
}

2010-10-10 13:09
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
首先谢谢ls兄弟,
兄弟的代码和我的合在一起,就蓝屏
不知道为什么~~
2010-10-10 13:59
0
雪    币: 14
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你的hook不对吧,调试下hook后的情况。

你可以到网上找个RING0的APIHook库看看
2010-10-10 18:27
0
游客
登录 | 注册 方可回帖
返回
//