欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    pspCidTAble完全解读.pdf

    • 资源ID:50073060       资源大小:658.54KB        全文页数:12页
    • 资源格式: PDF        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    pspCidTAble完全解读.pdf

    PspCidTablePspCidTable 完全解读 by sysdog 2009.5.1 Whu完全解读 by sysdog 2009.5.1 Whu-一、句柄一、句柄句柄:HADNLE 在 winnt.h 定义如下:typedef void*HANDLE;是一个 32 位无类型指针,充当内核对象在内核的索引.句柄本质内核对象(object)的索引每个进程都有自己的进程句柄表,当操作进程对象时,会把对象指针放在自己的句柄表中,返回一个句柄,通过句柄来索引对象指针,然后操作对象。进程句柄表是根据 HANDLE 索引对象指针的,而 pspcidtable(未导出,需要自己定位地址)是根据 CID 索引对象指针的.EPROCESS 和 ETHREAD 分别是进程对象和线程对象应用程序HANDLE(句柄)用户空间用户空间内核空间内核空间NT 执行体执行体对象执行体对象NT 内核内核对象 图一、句柄、NT 执行体对象和 NT 内核对象IPspCidTablePspCidTable 完全解读 by sysdog 2009.5.1 Whu完全解读 by sysdog 2009.5.1 Whu-用户空间用户空间内核空间内核空间NT 执行体EPROCESS(进程对象)ETHREAD(线程对象)NT 内核KPROCESS(PCB)(进程描述表)KTHREAD(线程描述表)图二、进程和线程描述表NT 执行体处理进程线程对象,进程和线程描述表可由 EPROCESS 结构来访问,NT 内核处理进程和线程描述表二、句柄表二、句柄表XP 下句柄表是动态分配的,是个三层表,1 级表(称为基本表)存放系统底层的。句柄表大小为 1 页即 4K,而每个表项是一个 HANDLE_TABLE_ENTRY占 8 个字节,所以每个表最多只能放 512 个表项,又因为表项索引是以 4 递增的,因此一个最终表能承受的最大索引值也是 2048 即 0 x800,两个表最大为 0 x1000,三个表就是 0 x1800。句柄表的格式如下:PspCidTablePspCidTable 完全解读 by sysdog 2009.5.1 Whu完全解读 by sysdog 2009.5.1 Whu-II句柄表就是 HANDLE_TABLE 结构,如下:里面没有指针结构啊,那么句柄表到底存储在那里?实际是保存在 TableCode 里面,但是 TableCode 并不是地址,它比地址所担任的责任多一点:标明这个指针指向的是哪一级别的句柄,在 x86 上面 Windows 总是分配内存使其沿四个字节对齐,所以实际的句柄表地址的低两位一定是 0?。XP 就用这两位来标示这个表是哪个级别,00 表示 1 级表,01 表示 2 级表,02表示 3 级表。2 级表存放的是 1 级表的指针,3 级表存放的是 2 级表的指针。TableCode 转变一下就是 HANDLE_TABLE_ENTRY 了,转变也很简单,就是低两位清零,因为底两位代表当前句柄表的级数,HANDLE_TABLE 里面存放的是一些信息,HANDLE_TABLE_ENTRY 才是真正的句柄表。HANDLE_TABLE_ENTRY结构如下:如果是一级表 HANDLE_TABLE_ENTRY=TableCode如果是二级表 HANDLE_TABLE_ENTRY 需要根据 2 级表中的指针来找 1 级表的基址,然后再根据 1 级表中的偏移找到进程对象.三级表类推III三、内核对象三、内核对象作为一个 Wi n d o w s 软件开发人员,经常需要创建、打开和操作各种内核对象。系统要创建和操作若干类型的内核对象,比如存取符号对象、事件对象、文件对象、文件映射对象、I/O 完成端口对象、作业对象、信箱对象、互斥对象、管道对象、进程对象、信标对象、线程对象和等待计时器对象等。这些对象都是通过调用函数来创建的。例如,C r e a t e F i l e Ma p p i n g 函数可使系统能够创建一个文件映射对象。每个内核对象只是内核分配的一个内存块,并且只能由该内核访问。该内存块是一种数据结构,它的成员负责维护该对象的各种信息。有些数据成员(如安全性描述符、使用计数等)在所有对象类型中是相同的,但大多数数据成员属于定的对象类型。例如,进程对象有一个进程 I D、一个基本优先级和一个退出代码,而文件对象则拥有一个字节位移、一个共享模式和一个打开模式。由于内核对象的数据结构只能被内核访问,因此应用程序无法在内存中找到这些数据结构并直接改变它们的内容。M i c r o s o f t 规定了这个限制条件,目的是为了确保内核对象结构保持状态的一致。这个限制也使 M i c r o s o f t 能够在不破坏任何应用程序的情况下在这些结构中添加、删除和修改数据成员。如果我们不能直接改变这些数据结构,那么我们的应用程序如何才能操作这些内核对象呢?解决办法是,Wi n d o w s 提供了一组函数,以便用定义得很好的方法来对这些结构进行操作。这些内核对象始终都可以通过这些函数进行访问。当调用一个用于创建内核对象的函数时,该函数就返回一个用于标识该对象的句柄。该句柄可以被视为一个不透明值,你的进程中的任何线程都可以使用这个值。将这个句柄传递给 Wi n d o w s 的各个函数,这样,系统就能知道你想操作哪个内核对象。四、PspCidTable四、PspCidTable对象指针:从其线形地址来看,它将常驻内存的结构体划分为两部分:一个对象头和一个对象体。对象指针并没有指向对象自身的基地址,而是指向了对象体,由于紧接着对象头的就是对象体,所以可以给对象指针加上一个负的偏移量来访问对象头。IV对象头(Object Header)对象指针对象体(Object)对象根据根据 HANDLEHANDLE 索引句柄对象体过程索引句柄对象体过程EPROCESSHANDLE_TABLEObject Table对象根据 HANDLE索引对象头Object HeaderTableCodeObject通过 PID 索引进程对象体过程PspCidTable HANDLE_TABLE索引 HANDLE_TABLE_ENTRYTableCodePIDObjectEPROCESSVPspCidTable:指向 HANDLE_TABLE 的指针,未导出结构,存放所有进程及线程对象指针。lkd dt _handle_table指针ntdll!_HANDLE_TABLEPspCidTable +0 x000TableCode +0 x004QuotaProcess +0 x008UniqueProcessId +0 x00cHandleTableLock +0 x01cHandleTableList+0 x024 HandleContentionEvent+0 x028 DebugInfo +0 x02cExtraInfoPages+0 x030 FirstFree +0 x034LastFree +0 x038NextHandleNeedingPool +0 x03cHandleCount+0 x040 Flags+0 x040 StrictFIFOPspCidTable 是一个句柄表,其格式与普通的句柄表是完全一样的.但它与每个进程私有的句柄表有以下不同:1.PspCidTable 中存放的对象是系统中所有的进线程对象指针,其索引就是 PID 和 CID2.PspCidTable中存放是对象体(指向EPROCESS和ETHREAD),而每个进程私有的句柄表则存放的是对象头(OBJECT_HEADER)3.PspCidTable 是一个独立的句柄表,而每个进程私有的句柄表以一个双链连接起来PspCidTable 在 XP 下是个三层表,动态分配的PspCidTable 是内核未导出的 HANDLE_TABLE 结构,它保存着所有进程及线程对象指针.只要可以遍历这个表就可以遍历所有进程,包括隐藏进程(hook ZWQuerySystemInformation),抹除 PspCidTable 除外,下面根据 KD 查看此表:VI图一通过 PspCidTable 遍历进程就是为了获取进程对象指针。PspCidTable 是根据 PID 或者 CID索引的,所以就依据进程 CID 获取进程对象指针。五、演示说明五、演示说明1.根据 HANDLE 索引 object 指针ObjectTable:e7313480利用 Local kernel 来验证,查找 0 x14 句柄的对象指针PROCESS 88cb7020ObjectTable:e73134800014:Object:e1c050d0Name:WindowsPspCidTablePspCidTable 完全解读 by sysdog 2009.5.1 Whu完全解读 by sysdog 2009.5.1 Whu-注意红色部分。ObjectTable:e7313480 指向 HANDLE_TABLE 结构 TableCode :0 xe5018000QuotaProcess :0 x88cb7020 _EPROCESSVIITableCode:0 xe5018000 最低两位为 00 表示 0 级表。于是查找句柄为 0 x14 的对象指针有(因为索引时按 4 递增的,一个 HANDLE_TABLE_ENTRYA 占 8 个字节)Ptr=HANDLE_TABLE_ENTRY+HANDLE*8/4=HANDLE_TABLE_ENTRY+HANDLE*2e1c050b9看到e1c050b9就是0 x14对应的object Header,这里需要转换一下(低三位清零再加上ObjectHeader 大小,因为 object header 是 8 个字节对齐,低三位做标志位)Object=object Header&0 xfffffff8+sizeof(Object Header)e1c050b9&0 xfffffff8+0 x18=e1c050d0-Object:e1c050d0 Name:Windows跟上面的一模一样。2.根据 CID 索引(PspCidTable 句柄表)对象指针首先是查找 pspcidtable 句柄表的地址:e1002ca8 00000002 00000001 00000000然后观察 HANDLE_TABLE结构:VIIITableCode :0 xe3a39001NextHandleNeedingPool:0 x1000TableCode=e3a39001第二位为 01 表示有 2 层表。NextHandleNeedingPool:0 x1000,该字段说明了当 PID 或 CID 达到多少以上时,需要再建立一个新表(最终表)。我们的系统里现在已经有两个最终表了。最终表大小为 1 页即 4K,而每个表项是一个 HANDLE_TABLE_ENTRY占 8 个字节,所以每个表最多只能放 512 个表项,又因为表项是用PID 或者 TID 来索引的,而索引是以4 递增的,因此一个最终表能承受的最大 ID 也是 2048 即 0 x800,两个表最大为 0 x1000,以此类推.e1005000TableCode=e3a39001 可知道:有 2 个基本表一级表中放的是基本表的指针0 级表的 HANDLE_TABLE_ENTRY=e1005000计算公式:PHANDLE_TABLE_ENTRY=HANDLE_TABLE_ENTRY+CID*sizeof(HANDLE_TABLE_ENTRY)/PID_INC即PHANDLE_TABLE_ENTRY=HANDLE_TABLE_ENTRY+CID*2IX对 CID=0 x16C0 x80088cb7020e7313480208.下面对这个进行验证。由于 CID0 x80088cc78b0CID800 说明在 1 级表中PHANDLE_TABLE_ENTRY=e3a39000+984*2(e3a3a000+184*2)0 x88cc78b1得到 EPROCESS 的地址为 0 x88cc78b1&(3)=0 x88cc78b0,验证正确。XPspCidTablePspCidTable 完全解读 by sysdog 2009.5.1 Whu完全解读 by sysdog 2009.5.1 Whu-六、基于六、基于 PspCidTablePspCidTable 的进程检测及隐藏技术分析的进程检测及隐藏技术分析1.1.基于 HOOK 的检测技术:遍历 PspCidTable 所有进程对象指针由于 PspCidTable 是未导出结构,需要自己定位【一】PspCidTble 的定位1.PsLookupProcessByProcessId(PsLookupThreadByThreadId 或者 PsLookupProcessThreadByCid)函数中搜索特征串(0 x35ff 和 0 x8e)定位 PspCidTalbeCODE:2.利用 KDDEBUGGER_DATA(32/64)结构得到 pspCidTableKdEnableDebugger-KdInitSystem-KdDebuggerDataBlock-KDDEBUGGER_DATA32-PspCidTable3.利用 KPCR 中取,KRCR 地址ffdff000 处是一个叫做 KPCR的结构,PCR即 Processor Control Region,处理器控制域。这是一个很有用的结构。系统本身就大量使用。0 xffdff000 是 KPCR 这个结构变量的地址那么+0 x34 就是 KdVersionBlock 成员变量在该结构中的偏移但是在 0 xffdff034 指向的地方对应有个结构_DBGKD_GET_VERSION64可惜的是这个结构只有 0 x28 字节大小 但是.嘿嘿 这个结构后面藏着 N 多超级重要的内核变量。我们的 pspcidtable 这个变量其实就在这个结构起始位置的 0 x80 字节偏移处XI【二】进程对象的遍历1.利用未导出的 ExEnumHandleTable函数2.直接自己获取 PHANDLE_TABLE_ENTRY等,然后 PsLookupProcessByProcessId 3.自己写实现遍历(完成)2.2.隐藏技术:抹掉 PspCidTable 表(完成)3.3.基于抹掉 PspCidTable 的进程检测技术(正在调试)七、几种隐藏进程技术分析及对策七、几种隐藏进程技术分析及对策没开始写呢没开始写呢XII

    注意事项

    本文(pspCidTAble完全解读.pdf)为本站会员(赵**)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开