一种基于PspCidTable的进程检测方法.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
适合读者:编程爱好者 前置知识:VC 、汇编 一种基于PspCidTable 的进程检测方法 文/ 图 武汉大学计算机学院信息安全专业 段俊锋 本文介绍了Windows XP 下PspCidTable 的组织结构和基于该结构的一种进程检测方法。 PspCidTable 组织结构简介 在Windows NT 下,所有的资源都是以对象(object )的方式进行管理。我们平时最常见的进程(process )、 文件(file )、设备(device )等都是对象。当我们要访问一个对象时,比如说打开一个文件,系统就会创建 一个对象句柄,通过这个句柄来完成对文件的打开、关闭、删除等操作。句柄和对象之间的联系是通过句 柄表来完成的。准确地说,一个句柄是它所对应的对象在句柄表中的索引。通过句柄,可以在句柄表找到 对象的指针,通过指针对对象进行操作。PspCidTable 是Windows 系统中一种特殊的句柄表,它不链接在系 统句柄表上,也不属于任何一个进程。通过它可以访问系统中所有的对象。在 Windbg 下面可以查看 PspCidTable 的地址: kd dd PspCidTable 8055a360 e100086000000000 8055a3700000000000000000 看得出来,这个系统里PspCidTable 的地址为0x8055a360 (不同的系统中,这个值是不同的)。这个地 线 址中是一个指向_HANDLE_TABLE 结构的指针: kd dt _HANDLE_TABLE e1000860 防 ntdll!_HANDLE_TABLE +0x000 TableCode : 0xe1003000 „„ 客 +0x038 NextHandleNeedingPool : 0x800 „„ 黑 +0x040 StrictFIFO : 0y1 这里的TableCode 中记录着句柄表的地址。在Windows 2000 中PspCidTable 句柄表采用的是三层表结 构,TableCode 中记录着三层表——上层表、中层表和下层表的地址。但是在Windows XP 中,为了节省系 统空间,采用了动态扩展的表结构,当句柄数目少的时候仅仅采用下层表,当句柄数目较大的时候系统才 会启用中层表,直至上层表。那么怎么判断系统使用了几层表呢?TableCode 的后两位是判断的依据,后两 位是00 则是一层表结构,后两位是01 则是两层表结构,后两位是10 则是三层表结构。如果系统采用了两 层或者三层表的话,TableCode 中就不是句柄表地址了,把这个值最后两位置0 之后,则是一个指向多层表 地址的指针。下面看看另外一个Windows XP 系统下的对应的_HANDLE_TABLE 。 lkd dt _HANDLE_TABLE e1001820 nt!_HANDLE_TABLE +0x000 TableCode : 0xe27ef001 „„ +0x038 NextHandleNeedingPool : 0x1000 „„ +0x040 StrictFIFO : 0y1 lkd dd 0xe27ef000 e27ef000 e1003000 e27f500000000000 e27ef0100000000000000000 看得出来,这个系统采用了两层表结构。下层表地址为0xe1003000,中层表地址为0xe27f5000 。这其 中有一个差别,一般采用一层表结构时,偏移0x038 处的NextHandleNeedingPool 是0x800,采用两层表结 构时为0x1000 (增加了0x800 ),相应的,采用三层表时为0x1800 。 获得了三层句柄表之后,我们就可以通过句柄来访问对象了。具体方法是,如果句柄值小于 0x800 则 将句柄值乘以 2 作为下层表中的偏移与下层表基地址相加就可以获得 一个类型为 _HANDLE_TABLE_ENTRY 的地址了,该结构中偏移00 处为Object,将这个值最高位置1,最低三位置0 就是一个对象(体

文档评论(0)

docindoc + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档