- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
项目工程类经典参考学习文献
项目工程类经典参考学习文献
标题:【原创】驱动监控进程的创建
作者:hljleo
时间:2008-05-31,12:32
链接::showthread.php?t=65772
这是我在:.?.学习时看到的一个驱动程序,学习后对其整理的笔记
下面这个驱动程序的作用:监控准备运行的可执行文件。(由用户决定是不是让它运行)所以我们要做以下工作:
首先是修改(NtCreateSection)SSDT索引号,(索引号从用户程序中得到)HOOK?NtCreateSection()这个函数,然后通过文件句柄获得文件名,判断它是不是可执行文件,检测其属性与判断用户是否允许它执行,如果允许就运行原来NtCreateSection这个函数,否则返回STATUS_ACCESS_DENIED。
如果我们截获一个NtCreateSection()的请求,该请求要求映射可执行文件作为SEC_IMAGE属性,通过结合页保护属性,我们能够知道进程将要执行了,因此我们在这个时候作出决定:是否让其执行。如果不想让它执行,EAX?返回值为STATUS_ACCESS_DENIED。
因为调用是从ntdll.?dll?以一条?MOV?EAX,?ServiceIndex五字节指令开始的,第一个字节是MOV?EAX,后四字节是索引号,所以我们可以得到索引号(后四字节)然后将它进行修改成我们自己的函数索引。当然在修改之前要将原服务函数地址保存在全局变量中。
if(loc-Parameters.DeviceIoControl.IoControlCode==1000)
{
buff=(UCHAR*)Irp-AssociatedIrp.SystemBuffer;
?hook?service?dispatch?table
memmove(Index,buff,4);所有的调用都是从ntdll.dll以一条五字节指令MOV?EAX,?ServiceIndex开始,四字节是索引号
a=4*Index+(ULONG)KeServiceDescriptorTable-ServiceTable;从用户程序中得到索引号,a指向服务函数地址
base=(ULONG)MmMapIoSpace(MmGetPhysicalAddress((void*)a),4,0);将物理地址映射到非分页池,因此可以进行读写,减少读写服务表保护属性的麻烦
a=(ULONG)Proxy;a指向Proxy函数的地址
_asm
{
mov?eax,base
mov?ebx,dword?ptr[eax]
mov?RealCallee,ebx将原服务函数地址保存在全局变量中
mov?ebx,a
mov?dword?ptr[eax],ebxProxy函数地址写进服务函数表中
}
memmove(a,buff[4],4);
output=(char*)MmMapIoSpace(MmGetPhysicalAddress((void*)a),256,0);
}
下面是我们自己函数的实现:
这个函数决定是否?NtCreateSection()?被成功调用
ULONG?__stdcall?check(PULONG?arg)获得指向服务参数指针
{
??HANDLE?hand=0;PFILE_OBJECT?file=0;
??POBJECT_HANDLE_INFORMATION?info=0;ULONG?a;char*buff;
??ANSI_STRING?str;?LARGE_INTEGER?li;li.QuadPart=-10000;
if((arg[4]0xf0)==0)return?1;检测标志
if((arg[5]0==0)return?1;检测属性
通过文件句柄获得文件名
hand=(HANDLE)arg[6];获得执行文件句柄
ObReferenceObjectByHandle(hand,0,0,KernelMode,file,info);file获得对象体指针
if(!file)return?1;
RtlUnicodeStringToAnsiString(str,file-FileName,1);
a=str.Length;buff=str.Buffer;
while(1)通过循环判断是不是有.?标志
{
??
if(buff[a]==.)
{a++;break;}
??a--;
}
ObDereferenceObject(file);
if(_stricmp(buff[a],exe)){RtlFreeAnsiString(str);return?1;}判断是否
原创力文档


文档评论(0)