HookAPI通信

发布时间:2016-12-10 13:03:02 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"HookAPI通信",主要涉及到HookAPI通信方面的内容,对于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); }

上一篇:黑马程序员----Java编程基础
下一篇:github访问速度慢,样式加载不完全解决

相关文章

关键词: HookAPI通信

相关评论