inline hook 驱动框架

inline hook 驱动框架

ID:37492975

大小:38.00 KB

页数:7页

时间:2019-05-24

inline hook 驱动框架_第1页
inline hook 驱动框架_第2页
inline hook 驱动框架_第3页
inline hook 驱动框架_第4页
inline hook 驱动框架_第5页
资源描述:

《inline hook 驱动框架》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、这段代码是针对KiInsertQueueApc函数。那么inlinehook的流程是什么呢?我们知道,inlinehook的目的就是修改内核函数的代码。为什么要修改呢?因为原始函数的代码我不是很满意,或者说不符合我的想法。我们还知道,函数的代码的处理对象其实就是传进来的参数。如果说我修改KiInsertQueueApc函数的开头几个字节,使其原来的代码变成一个跳转指令,跳到我自己的函数地址上并且执行我自己构建的函数,执行完成之后再跳回到原函数代码的下条指令。那么inlinehook技术就实现了。而我自己构建的函数就可以事先验证参数信息。举个例子或许就非常容易理解。

2、现在很多杀毒软件具有自我保护能力(比如保护自身进程),他会inlinehookNtTerminateProcess()。具体原理是一样的,杀毒软件会修改这个函数开头的几个字节使其变为一个跳转指令,跳到杀毒软件作者自己写的函数地址上,之后这个自定义函数开始分析传进来的参数,如果发现是自己进程,那么返回失败,如果是其他进程,那么不做任何反映直接跳回去执行原始函数以后的代码。这样杀毒软件的进程就不会被关闭。现在分析代码。一开始肯定是驱动程序的入口函数NTSTATUSDriverEntry(INPDRIVER_OBJECTtheDriverObject,INPUNICOD

3、E_STRINGtheRegistryPath){DbgPrint("MyDriverLoaded!");theDriverObject->DriverUnload=OnUnload;g_KiInsertQueueApc=FindKiInsertQueueApcAddress();DetourFunctionKiInsertQueueApc();returnSTATUS_SUCCESS;}没啥特别的地方,和普通的驱动程序一样。由于不用处理IRP,那么分发函数就没有必要去定义。需要注意的是,驱动程序不一定必须要创建设备。你可以发现,这个驱动程序就没有创建设备对象,因

4、为此驱动程序不跟应用程序打交道。读者要正确理解驱动程序的概念我们来看看FindKiInsertQueueApcAddress();ULONGFindKiInsertQueueApcAddress(){char*Addr_KeInsertQueueApc=0;(1)inti=0;charFindcode[]={0xE8,0xcc,0x29,0x00,0x00};(2)ULONGAddr_KiInsertQueueApc=0;Addr_KeInsertQueueApc=(char*)GetFunctionAddr(L"KeInsertQueueApc");(3)for

5、(i=0;i<100;i++)(4){if(Addr_KeInsertQueueApc==Findcode[0]&&Addr_KeInsertQueueApc[i+1]==Findcode[1]&&Addr_KeInsertQueueApc[i+2]==Findcode[2]&&Addr_KeInsertQueueApc[i+3]==Findcode[3]&&Addr_KeInsertQueueApc[i+4]==Findcode[4]){Addr_KiInsertQueueApc=(ULONG)&Addr_KeInsertQueueApc+0x29cc+5;(5

6、)break;}}returnAddr_KiInsertQueueApc;}具体分析:这个函数的作用是找到KiInsertQueueApc()的首地址。具体看代码:(1)定义一个指针变量。此指针的跳跃数为1字节。(2)你必须用windbg分析KeInsertQueueApc()函数,由于这个函数必定调用KiInsertQueueApc(),那么“调用代码”必定会出现在函数中。那么我们选出这个“调用代码”作为特征值就可以定位到KiInsertQueueApc()的首地址。具体是这样的:{0xE8,0xcc,0x29,0x00,0x00}这是在内存中的样子。而从程序的

7、角度来讲是:000029ccE8,那么这样的机器码对应的汇编代码是ADDBYTEPTRDS:[EAX],ALSUBESP,ECXCALLCALL对应的机器码是0xE8.那么既然CALL出现了,后面跟的东西肯定为一个地址值。通过用windbg分析可知,这个地址就是KiInsertQueueApc()的首地址。不过需要注意的是,汇编代码和机器码并不是呆板的一一对应的关系,这点千万要注意!!(3)调用一个自定义函数。ULONGGetFunctionAddr(INPCWSTRFunctionName){UNICODE_STRINGUniCodeFunctionName;R

8、tlIni

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。