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