HookAPI通信

来源:互联网 发布:js创建表格 编辑:程序博客网 时间:2024/05/16 23:52

这段时间学习驱动,到了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);}


0 0
原创粉丝点击