网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
利用钩子技术控制进程创建(附源代码)
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式
 正如你所见,这里没有什么特别的-我们只是通过MmMapIoSpace()来把交换缓冲区映射到内核中,另外把我们的代理函数的地址写到服务表(当然,我们这是在把实际的服务执行的地址保存到全局变量RealCallee以后这样做的)。为了改写服务表的适当入口,我们通过MmMapIoSpace()来映射目标地址。为什么我们要这样做?不管怎么说,我们已经可以存取服务表了,不是吗?问题是,服务表可能驻留在一段只读内存中。因此,我们必须检查一下是否我们有对目标空间写的权限,而如果我们没有这个权限,那么在改写服务表之前,我们必须改变页面保护。你不认为这样以来工作太多了吗?因此,我们仅用MmMapIoSpace()来映射我们的目标地址,这样以来,我们就不必担心任何的页面保护问题了-从现在开始,我们假定已有到目标页面写的权限了。现在让我们看一下我们的代理函数:

//这个函数用来确定是否我们应该允许NtCreateSection()调用成功
ULONG __stdcall check(PULONG arg)
{
 HANDLE hand=0;PFILE_OBJECT file=0;
 POBJECT_HANDLE_INFORMATION info;ULONG a;char*buff;
 ANSI_STRING str; LARGE_INTEGER li;li.QuadPart=-10000;
 //检查标志。如果所要求的存取方式不是PAGE_EXECUTE,
 //这并不要紧
 if((arg&0xf0)==0)return 1;
 if((arg&0x01000000)==0)return 1;
 //经由文件句柄得到文件名
 hand=(HANDLE)arg;
 ObReferenceObjectByHandle(hand,0,0,KernelMode,&file,&info);
 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);
  //如果它是不可执行的,这也不要紧
  //返回1
  if(_stricmp(&buff[a],"exe")){RtlFreeAnsiString(&str);return 1;}
   //现在,我们要询问用户的选择。
   //把文件名写入缓冲区,并等待直到用户显示响应
   //(第一个DWORD为1意味着我们可以继续)
   //同步存取该缓冲区
   KeWaitForSingleObject(&event,Executive,KernelMode,0,0);
   //把缓冲区的前两个DWORD置为0,
   //把字符串复制到该缓冲区中,并循环下去,直到用户把每一个
   //DWORD置为1.
   //第二个DWORD的值指明用户的响应
  strcpy(&output,buff);
  RtlFreeAnsiString(&str);
  a=1;
  memmove(&output[0],&a,4);
  while(1)
  {
   KeDelayExecutionThread(KernelMode,0,&li);
   memmove(&a,&output[0],4);
   if(!a)break;
  }
  memmove(&a,&output,4);
  KeSetEvent(&event,0,0);
  return a;
 }
 //仅保存执行上下文并调用check()
 _declspec(naked) Proxy()
 {
  _asm{
   //保存执行上下文并调用check()
   //-后面的依赖于check()所返回的值
   // 如果返回值是1,继续实际的调用。
   //否则,返回STATUS_ACCESS_DENIED
   pushfd
   pushad
   mov ebx,esp
   add ebx,40
   push ebx
   call check
   cmp eax,1
   jne block
   //继续实际的调用
   popad
   popfd
   jmp RealCallee
   //返回STATUS_ACCESS_DENIED
   block:popad
   mov ebx, dword ptr[esp+8]
   mov dword ptr[ebx],0
   mov eax,0xC0000022L
   popfd
   ret 32
  }
 }

  Proxy()保存寄存器和标志,把一个指向服务参数的指针压入栈中并调用check()。其它的依赖于check()所返回的值。如果check()返回TRUE(也就是,我们想要继续请求),那么,Proxy()将恢复寄存器和标志,并且把控制权交给服务实现部分。否则,Proxy

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号