VC驱动监控进程的创建

2016-02-19 21:05 68 1 收藏

get新技能是需要付出行动的,即使看得再多也还是要动手试一试。今天图老师小编跟大家分享的是VC驱动监控进程的创建,一起来学习了解下吧!

【 tulaoshi.com - 编程语言 】

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

首先是修改(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;//检测属性

//通过文件句柄获得文件名
hand=(HANDLE)arg[6];//获得执行文件句柄

ObReferenceObjectByHandle(hand,0,0,KernelMode,&file,info);//&file获得对象体指针
if(!file)return 1;

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

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;}//判断是否为可执行文件
 
KeWaitForSingleObject(&event,Executive,KernelMode,0,0);//将当前线程置于等待状态知道信号态

strcpy(&output[8],buff);//将string复制进buff
RtlFreeAnsiString(&str);

a=1;//用户的决定通过a的制来反映
memmove(&output[0],&a,4);
while(1)
{
KeDelayExecutionThread(KernelMode,0,&li);//在一个固定时间间隔内当前线程处于等待状态
memmove(&a,&output[0],4);
if(!a)break;
}
memmove(&a,&output[4],4);

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

KeSetEvent(&event,0,0);

return a;
}

//保存执行文件上下文,调用check()函数
_declspec(naked) Proxy()
{

_asm{

pushfd
pushad
mov ebx,esp

add ebx,40
push ebx

call check

cmp eax,1//由check()的返回值判断是否让可执行文件继续执行
jne block


popad
popfd
jmp RealCallee//通过,调用ntcreatesection


block:popad
mov ebx, dword ptr[esp+8]

mov dword ptr[ebx],0
mov eax,0xC0000022L//不让其通过,返回STATUS_ACCESS_DENIED
popfd
ret 32

}
}

到此,驱动程序的工作基本完成,所以在用户程序中用到一个线程来等待驱动的判断结果。
 char*name=(char*)&outputbuff[8];

        for(x=0;xstringcount;x++)

        {
            if(!stricmp(name,strings[x])){a=1;goto skip;}

        }
        strcpy(msgbuff, "Do you want to run ");
        strcat(msgbuff,&outputbuff[8]);

       
        if(IDYES==MessageBox(0, msgbuff,"WARNING",
           MB_YESNO|MB_ICONQUESTION|0x00200000L))

        {a=1; strings[stringcount]=_strdup(name);stringcount++;}
        else a=0;
   
        // write response to the buffer, and driver will get it
        skip:memmove(&outputbuff[4],&a,4);

        //让驱动继续
        a=0;
        memmove(&outputbuff[0],&a,4);
}}

来源:https://www.tulaoshi.com/n/20160219/1625245.html

延伸阅读
标签: 操作系统
教你在Win7上创建驱动器 1.在桌面上的计算机图标,鼠标右键,打开的菜单点击“管理”命令 2.弹出计算机管理窗口,在左侧窗口点击“存储”下的“磁盘管理” 3.出来的界面右击“未分配”的本地磁盘,弹出的菜单点击“新建简单卷” 4.进入新建简单卷向导,单击“下一步”继续 5....
ActiveX控件是微软公司提供的功能强大的程序设计和开发技术,是COM组件开发技术的重要组成部分。它是OLE的第三个版本,对原先OLE控件的最大扩展是增加了Internet功能,它不仅可以在支持OLE控件的容器中使用,更可以作为一个Internet控件,直接成为网页的一部分。另外,ActiveX控件作为一种可重用的组件,相当于一个封装好的代码模块,它是...
进程通常被定义为一个正在运行的程序的实例,它由两个部分组成: 一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方 另一个是地址空间,它包含所有的可执行模块或DLL模块的代码和数据。它还包含动态分配的空间。如线程堆栈和堆分配空间。每个进程被赋予它自己的虚拟地址空间,当进程中的...
ado技术目前已经成为连接数据库的主流技术,下面介绍如何使用ado来动态创建access数据库。 为了使用ado,必须引入微软的两个动态连接库msadox.dll和msado15.dll: #pragma warning (disable: 4146) #import "c:Program FilesCommon Filessystemadomsadox.dll" #import "c:Program FilesCommon Filessystemadomsado15.dll" no_namespace ren...
用VC++创建自定义向导程序 作者:毛翔 网站:esword.onchina.net 下载本文源代码 向导是一种用来简化用户操作的程序。在Microsoft 的所有产品中都存在向导,如Office2000 中的Web 页向导就是一个十分典型的向 导(如下图所示),还有常用的VC++向导。 一个基本的向导程序应该包...

经验教程

35

收藏

43
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部