龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

VC驱动监控进程的创建

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
下面这个驱动程序的作用:监控准备运行的可执行文件。(由用户决定是不是让它运行)所以我们要做以下工作: 首先是修改(NtCreateSection)SSDT索引号,(索引号从用户程序中得到)

下面这个驱动程序的作用:监控准备运行的可执行文件。(由用户决定是不是让它运行)所以我们要做以下工作:

首先是修改(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],ebx//Proxy函数地址写进服务函数表中
}

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]&0x01000000)==0)return 1;//检测属性

收藏文章
表情删除后不可恢复,是否删除
取消
确定
图片正在上传,请稍后...
评论内容为空!
还没有评论,快来抢沙发吧!
按钮 内容不能为空!
立刻说两句吧! 查看0条评论
精彩图集

赞助商链接