HookAPI通信

这段时间学习驱动,到了HookAPI通信这部分,简单记录一下。

HookAPI通信:在Ring3与Ring0之间进行数据交互,我们都知道,在调用一个函数时,该函数会调用内核中对应的函数来实现相应的功能,在这里,我们选择一个具有缓冲区的函数来传输我们自己的数据,在这个函数调用内核层对应的函数时,我们对其Hook,然后取出相应数据。

做个不是太恰当的比喻,就像一个马帮,从A地(Ring3)到向B地(Ring0)运输盐,而在A地的时候,我们将运输的盐替换成我们的大烟,然后,再刚进行B地时,我们把大烟取出,这样就不需要我们亲自去运输了。

在Hook的时候,可以使用SSDTHook或InlineHook。

Ring3函数:

ReadFile((HANDLE)FUNC_ADDRESS_INFO, FuncAddressInfo, (sizeof(WIN32KFUNCINFO) + sizeof(KERNELFUNC_ADDRESS_INFORMATION)), &dwReadByte, 0);

FUN_ADDRESS_INFO是判断的标识,FuncAddressInfo为缓冲区,后面为大小。

Ring0函数:

NTSTATUS __stdcall NewNtReadFile(
	__in HANDLE FileHandle,
	__in_opt HANDLE Event,
	__in_opt PIO_APC_ROUTINE ApcRoutine,
	__in_opt PVOID ApcContext,
	__out PIO_STATUS_BLOCK IoStatusBlock,
	__in PVOID Buffer,
	__in ULONG Length,
	__in_opt PLARGE_INTEGER ByteOffset,
	__in_opt PULONG Key
	)
{
	PFUNCINFO FuncAddress;
	int i = 0;

	if(FileHandle == (HANDLE)FUNC_ADDRESS_INFO)
	{
		DbgPrint("FUNC_ADDRESS_INFO\r\n");
		if(Length)
		{
			FuncAddress = (PFUNCINFO)ExAllocatePool(NonPagedPool, Length + 1);
			if(FuncAddress)
			{
				memcpy(FuncAddress, Buffer,	 Length);
				{
					for(i = 0; i < FuncAddress->ulCount; i++)
					{
						DbgPrint("FuncName:%s Address:0x%08X\r\n", FuncAddress->FuncInfo[i].FuncName, FuncAddress->FuncInfo[i].ulAddress);
					}
					ExFreePool(FuncAddress);
				}
			}
		}
	}
	OldNtReadFile = (NTREADFILE)NtReadFileHookZone;
	return OldNtReadFile(FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, Buffer, Length, ByteOffset, Key);
}


你可能感兴趣的:(Ring3,HookApi,RING0)