网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
利用钩子技术控制进程创建(附源代码)
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式
确信该进程将要被启动。在这一点上,我们是能够作出决定的,并且在我们不想要创建该进程的情况下,让NtCreateSection()返回STATUS_ACCESS_DENIED。因此,为了完全控制目标机器上的进程创建,所有我们要做的是在系统级上钩住NtCreateSection()。

  象来自于ntdll.dll中的任何其它代理一样,NtCreateSection()用服务索引加载EAX,使EDX指向函数参数,并且把执行权传递到KiDispatchService()内核模式例程(这是通过Windows NT/2000中的INT 0x2E指令或者Windows XP下的SYSENTER指令实现的)。在校验完函数参数之后,KiDispatchService()把执行权传递到服务的实际实现部分-它的地址可用于服务描述表(指向这个表的指针由ntoskrnl.exe作为KeServiceDescriptorTable变量所输出,所以它对于内核模式驱动程序是可用的)中。服务描述表通过下列结构所描述:

struct SYS_SERVICE_TABLE {
void **ServiceTable;
unsigned long CounterTable;
unsigned long ServiceLimit;
void **ArgumentsTable;
};

  这个结构中的ServiceTable字段指向一个数组-它拥有所有实现系统服务的函数的地址。因此,为了在系统级上钩住任何本机API函数,所有我们必须做的是把我们的代理函数的地址写入被KeServiceDescriptorTable的ServiceTable字段所指向的数组的第i个入口(i是服务索引)。
至此,看起来我们已了解了在系统级上监视和控制进程创建的一切。现在让我们开始实际的工作。

  三、 控制进程创建

  我们的解决方案由一个内核模式驱动程序和一个用户模式应用程序组成。为了开始监视进程创建,我们的应用程序要把服务索引(相应于NtCreateSection())以及交换缓冲区的地址传递到我们的驱动程序。这是由下列代码所完成的:

//打开设备
device=CreateFile("\\\\.\\PROTECTOR",GENERIC_READ|GENERIC_WRITE,
0,0,OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM,0);
//得到NtCreateSection的索引并把它连同输出缓冲区的地址传递给设备
DWORD * addr=(DWORD *)
(1+(DWORD)GetProcAddress(GetModuleHandle("ntdll.dll"),"NtCreateSection"));
ZeroMemory(outputbuff,256);
controlbuff[0]=addr[0];
controlbuff=(DWORD)&outputbuff[0];
DeviceIoControl(device,1000,controlbuff,256,controlbuff,256,&dw,0);

  此代码是显然的-唯一需要注意的是我们得到服务索引的方式。所有来自于ntdll.dll的代理都从一行代码MOV EAX,ServiceIndex开始-它可以适用于任何版本和风味的Windows NT。这是一条5字节长的指令,以MOV EAX操作码作第一字节,服务索引作为留下的4字节。因此,为了得到相应于一些特别的本机API函数的服务索引,所有你要做的是从该地址读取4个字节,-位于从这个代理开始1字节距离的地方。

  现在让我们看一下我们的驱动程序做什么,当它收到来自我们的应用程序的IOCTL时:

NTSTATUS DrvDispatch(IN PDEVICE_OBJECT device,IN PIRP Irp)
{
 UCHAR*buff=0; ULONG a,base;
 PIO_STACK_LOCATION loc=IoGetCurrentIrpStackLocation(Irp);
 if(loc->Parameters.DeviceIoControl.IoControlCode==1000)
 {
  buff=(UCHAR*)Irp->AssociatedIrp.SystemBuffer;
  //钩住服务调度表
  memmove(&Index,buff,4);
  a=4*Index+(ULONG)KeServiceDescriptorTable->ServiceTable;
  base=(ULONG)MmMapIoSpace(MmGetPhysicalAddress((void*)a),4,0);
  a=(ULONG)&Proxy;
  _asm
  {
   mov eax,base
   mov ebx,dword ptr[eax]
   mov RealCallee,ebx
   mov ebx,a
   mov dword ptr[eax],ebx
  }
  MmUnmapIoSpace(base,4);
  memmove(&a,&buff,4);
  output=(char*)MmMapIoSpace(MmGetPhysicalAddress((void*)a),256,0);
 }
 Irp->IoStatus.Status=0;
 IoCompleteRequest(Irp,IO_NO_INCREMENT);
 return 0;
}

 

网学推荐

免费论文

原创论文

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