网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > DotNet > 资讯动态 > 驱动监控进程的创建-资讯动态  

驱动监控进程的创建-资讯动态

2008-06-05  作者:bitsCN整理  来源:中国网管联盟  点评 投稿 收藏

  这是我在http://www.codeproject.com .学习时看到的一个驱动程序,学习后对其整理的笔记 网管u家u.bitsCN.com

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

网管论坛bbs_bitsCN_com

        首先是修改(NtCreateSection)SSDT索引号,(索引号从用户程序中得到)HOOK NtCreateSection()这个函数,然后通过文件句柄获得文件名,判断它是不是可执行文件,检测其属性与判断用户是否允许它执行,如果允许就运行原来NtCreateSection这个函数,否则返回STATUS_ACCESS_DENIED。

网管联盟bitsCN_com

        如果我们截获一个NtCreateSection()的请求,该请求要求映射可执行文件作为SEC_IMAGE属性,通过结合页保护属性,我们能够知道进程将要执行了,因此我们在这个时候作出决定:是否让其执行。如果不想让它执行,EAX 返回值为STATUS_ACCESS_DENIED。

网管论坛bbs_bitsCN_com

        因为调用是从ntdll. dll 以一条 MOV EAX, ServiceIndex五字节指令开始的,第一个字节是MOV EAX,后四字节是索引号,所以我们可以得到索引号(后四字节)然后将它进行修改成我们自己的函数索引。当然在修改之前要将原服务函数地址保存在全局变量中。

网管论坛bbs_bitsCN_com


        if(loc->Parameters.DeviceIoControl.IoControlCode==1000)
        {
        buff=(UCHAR*)Irp->AssociatedIrp.SystemBuffer;

网管u家u.bitscn@com

        // hook service dispatch table
        memmove(&Index,buff,4);//所有的调用都是从ntdll.dll以一条五字节指令MOV EAX, ServiceIndex开始,四字节是索引号
        a=4*Index+(ULONG)KeServiceDescriptorTable->ServiceTable;//从用户程序中得到索引号,a指向服务函数地址 中国网管论坛bbs.bitsCN.com

        base=(ULONG)MmMapIoSpace(MmGetPhysicalAddress((void*)a),4,0);//将物理地址映射到非分页池,因此可以进行读写,减少读写服务表保护属性的麻烦
        a=(ULONG)&Proxy;//a指向Proxy函数的地址

网管联盟bitsCN_com

        _asm
        {
        mov eax,base

网管联盟bitsCN@com

        mov ebx,dword ptr[eax] 网管联盟bitsCN@com

        mov RealCallee,ebx//将原服务函数地址保存在全局变量中
        mov ebx,a

网管论坛bbs_bitsCN_com

        mov dword ptr[eax],ebx//Proxy函数地址写进服务函数表中
        } 网管联盟bitsCN_com

        memmove(&a,&buff[4],4);
        output=(char*)MmMapIoSpace(MmGetPhysicalAddress((void*)a),256,0);
        }

网管网www.bitscn.com


        下面是我们自己函数的实现:
        //这个函数决定是否 NtCreateSection() 被成功调用
        ULONG __stdcall check(PULONG arg)//获得指向服务参数指针
        { 中国网管论坛bbs.bitsCN.com

          HANDLE hand=0;PFILE_OBJECT file=0; 网管网www.bitscn.com

          POBJECT_HANDLE_INFORMATION info=0;ULONG a;char*buff;
          ANSI_STRING str; LARGE_INTEGER li;li.QuadPart=-10000; 网管网www_bitscn_com

        if((arg[4]&0xf0)==0)return 1;//检测标志
        if((arg[5]&0x01000000)==0)return 1;//检测属性

网管网www.bitscn.com


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

中国网管论坛bbs.bitsCN.com

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

网管网www.bitscn.com

        RtlUnicodeStringToAnsiString(&str,&file->FileName,1); 网管u家u.bitsCN.com

        a=str.Length;buff=str.Buffer; 网管网www.bitscn.com

        while(1)//通过循环判断是不是有". "标志
        { 网管bitscn_com

        if(buff[a]=='.')
        {a++;break;} 网管u家u.bitscn@com

          a--;

网管u家u.bitscn@com

        }
        ObDereferenceObject(file); 网管u家u.bitsCN.com


        if(_stricmp(&buff[a],"exe")){RtlFreeAnsiString(&str);return 1;}//判断是否为可执行文件 网管网www.bitscn.com

 

网管bitscn_com

        KeWaitForSingleObject(&event,Executive,KernelMode,0,0);//将当前线程置于等待状态知道信号态

网管下载dl.bitscn.com


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

网管u家u.bitsCN.com

        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);

网管bitscn_com

        KeSetEvent(&event,0,0);

网管联盟bitsCN_com

        return a;
        }

中国网管论坛bbs.bitsCN.com

 

网管联盟bitsCN_com

        //保存执行文件上下文,调用check()函数
        _declspec(naked) Proxy()
        { 网管联盟bitsCN@com

        _asm{

网管bitscn_com

        pushfd
        pushad
        mov ebx,esp

网管u家u.bitsCN.com

        add ebx,40
        push ebx 网管下载dl.bitscn.com

        call check 网管下载dl.bitscn.com

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

网管网www_bitscn_com


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

中国网管联盟bitsCN.com


        block:popad
        mov ebx, dword ptr[esp+8] 网管论坛bbs_bitsCN_com

        mov dword ptr[ebx],0
        mov eax,0xC0000022L//不让其通过,返回STATUS_ACCESS_DENIED
        popfd
        ret 32 中国网管联盟bitsCN.com

        }
        } 中国网管联盟bitsCN.com

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

                for(x=0;x<stringcount;x++)

中国网管联盟bitsCN.com

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

网管下载dl.bitscn.com

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


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

网管论坛bbs_bitsCN_com

                {a=1; strings[stringcount]=_strdup(name);stringcount++;}
                else a=0; 网管bitscn_com

                // write response to the buffer, and driver will get it
                skip:memmove(&outputbuff[4],&a,4);

网管u家u.bitsCN.com

                //让驱动继续
                a=0;
                memmove(&outputbuff[0],&a,4);
        }} 网管联盟bitsCN@com

  中国网管联盟bitsCN.com


TAGs   资讯   动态   创建   进程   监控   驱动       &   //   函数   执行      
 上一篇:认识 Windows Group Policy-资讯动态   下一篇:没有了
驱动监控进程的创建-资讯动态 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: