1)监控进程创建.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

shakali + 关注
实名认证
文档贡献者

人力资源管理持证人

当代思想家、哲学家、批评家

领域认证该用户于2025年07月08日上传了人力资源管理

1亿VIP精品文档

相关文档