首页
社区
课程
招聘
[原创]PspCidTable引起的思考和探索
发表于: 2020-4-5 14:23 12044

[原创]PspCidTable引起的思考和探索

2020-4-5 14:23
12044

0x00 前言

       之前发过一个求助贴,为什么在Windows10 64位系统通过PspCidTable的到的对象地址不是有效的。 求助帖链接

 

       但是没有好兄弟来告诉我怎么回事。于是,它引起了我的好奇心,我便自己动手,逆PCHunter来解答我的困惑(感谢作者提供了这么好的工具)。

 

       第一次发帖比较啰嗦,请耐心看,给各位看官比心♥。

 

       PS:文末会提供所有的参考文章链接。

0x01 前期准备

1 . 工具及环境

       双机调试环境(虚拟机是W10 64位 1803),PCHunter,IDA
火绒 (提取PCHunter的驱动PCHunter64as.sys)。提取方法见下图

 

       好的,准备工作到此结束,开干!!!

0x02 分析PCHunter的驱动,找到其枚举进程的功能函数

       首先,我并不是用IDA远程调试内核的办法。是先通过IDA找到偏移,然后在windbg用 PCHunter64as.sys + 偏移  来确定地址。驱动文件拖入IDA,在DriverEntry里一顿观察(根据IRP_MJ_DEVICE_CONTROL=0x0E)找到与R3通信的函数及其偏移0x71434。

 

       上虚拟机,启动PCHunter,看Windbg一气呵成。根据得到的偏移,在通信函数头部下断点。忽略第一次断点命中(弹出右键菜单),点击刷新第二次命中断点,OK,开始跟踪分析。

 

       根据坛友 hjbfa 的分析,PCHunter有一套自己的通信协议[1]。但是这不是我们分析的重点,我们直接白嫖来用,一路跳过,来到关键的“CALL 寄存器”,就能在寄存器找到我们所关注的函数地址及其偏移0x431e4,转战IDA,根据偏移就能找到枚举进程的函数。然后经过反复的下断调试分析,观察内存里面进程信息的变化,一层一层的递进,就能找到最为关键的函数(我以为它在第0层,结果它在第2层)。

 

 

       OK,经过一番努力来到最关键的函数,终于到了我们最喜欢的读汇编环节。对PspCidTable有过了解都应该知道,可以通过TableCode&(~3)判断是几级表[2]。最终都是在0级表处理,得到进程线程信息。所以分析,找到处理0级表的函数。(详情看IDA注释)

 

       !!!看,我们发现了什么,获取的地址为什么无效,原来是因为经过简单的右移和与运算才是最终的对象地址。如果内核版本是Win8 则右移0x13,
再 &0xFFFFFFFFFFFFFFF0。如果内核版本是Win10,则右移0x10再与运算。就这样我的问题得到解决。马上自己计算验证一下。

 

       !!!完美!!!

0x03 总结

       通过对PCHunter的动态调试与静态分析,终于解答了我的困惑。简简单单的右移运算,当初怎么没发现呢。果然实践出真知。当然,都已经到这一步了,怎么能不进一步深入了解PCHunter怎么检测进程的呢。简单分析发现,PCHunter从PspCidTable获取对象地址后,首先判断是线程,还是进程,然后分别处理。
       所以仅仅对进程对象地址写0,还是能被PCHunter发现并标红。还需要对线程处理,修改线程指向的进程对象[3],才能完全躲过其检测。
贴一份我的隐藏进程三部曲(过PCHunter检测,但是线程指向改为system进程并不稳定,系统会蓝):

0x04 参考文章

       [1] hjbfa. 通过逆向PCHunter驱动学习64位windows内核之精准定位 https://bbs.pediy.com/thread-227207.htm
       [2] xiaocaiccccc. 在Win7 x64通过PspCidTable枚举进程 https://blog.csdn.net/qq269813279/article/details/80679789?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1
       [3] Justgoon. win7 32位进程隐藏(过PChunter检测) https://bbs.pediy.com/thread-221944.htm


[课程]Linux pwn 探索篇!

收藏
免费 7
支持
分享
最新回复 (18)
雪    币: 4709
活跃值: (1554)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
2
前排出售瓜子香肠饮料矿泉水
2020-4-5 14:24
0
雪    币: 1886
活跃值: (5929)
能力值: ( LV7,RANK:116 )
在线值:
发帖
回帖
粉丝
3
前排买瓜子香肠饮料矿泉水
2020-4-5 14:26
0
雪    币: 13904
活跃值: (17017)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
4
mark,楼主辛苦了
2020-4-5 14:53
0
雪    币: 5511
活跃值: (2072)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢分享!
2020-4-5 15:32
0
雪    币: 3700
活跃值: (3817)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
感谢分享!
2020-4-5 18:04
0
雪    币: 83
活跃值: (1082)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
2020-4-5 18:18
0
雪    币: 6910
活跃值: (3287)
能力值: ( LV7,RANK:105 )
在线值:
发帖
回帖
粉丝
8
师傅写的很详细,排版辛苦了,点赞收藏有了
最后于 2020-4-5 19:12 被A2kaid编辑 ,原因:
2020-4-5 19:12
0
雪    币: 1042
活跃值: (470)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
往往进步的就是LZ这样的人~
2020-4-6 11:07
0
雪    币: 310
活跃值: (2227)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
mark
2020-4-6 20:15
0
雪    币: 21449
活跃值: (62273)
能力值: (RANK:125 )
在线值:
发帖
回帖
粉丝
11
往往进步的就是LZ这样的人~
2020-4-13 09:20
0
雪    币: 23
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
mark
2020-5-6 06:16
0
雪    币: 731
活跃值: (1338)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
mark
2020-6-17 10:27
0
雪    币: 299
活跃值: (234)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
谢谢楼主,刚摸索到了一点就看到你这个帖子,受益匪浅!
2020-6-17 18:33
0
雪    币: 6049
活跃值: (4717)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
15
呜呜呜 太强了 呜呜呜 什么时候才能像小路师傅那么强
2020-11-18 15:38
0
雪    币: 434
活跃值: (1685)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
有个疑问,pchunter的驱动是加了壳的,如何像楼主一样那么顺滑的用ida反编译
2020-12-9 01:45
0
雪    币: 83
活跃值: (1082)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
17
metaworm 有个疑问,pchunter的驱动是加了壳的,如何像楼主一样那么顺滑的用ida反编译
同问 楼主 你是怎么ida 分析他的加壳驱动得
2020-12-9 07:09
0
雪    币: 1055
活跃值: (412)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
我分析的是老版本PCHunter,它驱动没有加壳哦。
2020-12-9 18:26
0
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
19

感谢分享!至少在我的另一台笔记本Win10(1809)上有效。

kd> uf nt!PsLookupProcessByProcessId
nt!PsLookupProcessByProcessId:
fffff800`50840100 48895c2418      mov     qword ptr [rsp+18h],rbx
fffff800`50840105 56              push    rsi
fffff800`50840106 4883ec20        sub     rsp,20h
fffff800`5084010a 48897c2438      mov     qword ptr [rsp+38h],rdi
fffff800`5084010f 488bf2          mov     rsi,rdx
fffff800`50840112 65488b3c2588010000 mov   rdi,qword ptr gs:[188h]
fffff800`5084011b 66ff8fe6010000  dec     word ptr [rdi+1E6h]
fffff800`50840122 b203            mov     dl,3
fffff800`50840124 e8a7060000      call    nt!PspReferenceCidTableEntry (fffff800`508407d0)
...
kd> uf nt!PspReferenceCidTableEntry
nt!PspReferenceCidTableEntry:
fffff800`508407d0 48895c2408      mov     qword ptr [rsp+8],rbx
fffff800`508407d5 48896c2410      mov     qword ptr [rsp+10h],rbp
fffff800`508407da 4889742418      mov     qword ptr [rsp+18h],rsi
fffff800`508407df 48897c2420      mov     qword ptr [rsp+20h],rdi
fffff800`508407e4 4156            push    r14
fffff800`508407e6 4883ec20        sub     rsp,20h
fffff800`508407ea 488b0567acf1ff  mov     rax,qword ptr [nt!PspCidTable (fffff800`5075b458)]
...
1: kd> dq nt!PspCidTable
fffff800`5075b458  ffffbe8f`2aa07b00 00000000`00000000
fffff800`5075b468  ffff948f`3ecb20c0 00000000`00000000
fffff800`5075b478  00010000`00000000 0000017c`00001000
fffff800`5075b488  00000000`00001f41 00000000`00009e09
fffff800`5075b498  00000000`00000000 00000000`00000000
fffff800`5075b4a8  00000000`00000000 00000000`00000000
fffff800`5075b4b8  00000000`00000000 00000000`00000000
fffff800`5075b4c8  00000000`00000000 00000000`00000000
1: kd> dq ffffbe8f`2aa07b00
ffffbe8f`2aa07b00  00000000`00001c00 ffffbe8f`3383a001
ffffbe8f`2aa07b10  00000000`00000000 ffffbe8f`2aa07b18
ffffbe8f`2aa07b20  ffffbe8f`2aa07b18 00000001`00000000
ffffbe8f`2aa07b30  00000000`00000000 00000000`00000000
ffffbe8f`2aa07b40  00000000`00000000 ffffbe8f`2aa2b110
ffffbe8f`2aa07b50  ffffbe8f`2aa2bc20 000006bf`000006bc
ffffbe8f`2aa07b60  00000000`00000000 00000000`00000000
ffffbe8f`2aa07b70  00000000`00000000 00000000`00000000
1: kd> dq ffffbe8f`3383a000
ffffbe8f`3383a000  ffffbe8f`2aa2b000 ffffbe8f`3383b000
ffffbe8f`3383a010  ffffbe8f`2f3ff000 ffffbe8f`2e9fd000
ffffbe8f`3383a020  ffffbe8f`33d32000 ffffbe8f`35107000
ffffbe8f`3383a030  ffffbe8f`35af9000 00000000`00000000
ffffbe8f`3383a040  00000000`00000000 00000000`00000000
ffffbe8f`3383a050  00000000`00000000 00000000`00000000
ffffbe8f`3383a060  00000000`00000000 00000000`00000000
ffffbe8f`3383a070  00000000`00000000 00000000`00000000
1: kd> dq ffffbe8f`2aa2b000
ffffbe8f`2aa2b000  00000000`00000000 00000000`00000000
ffffbe8f`2aa2b010  948f3ec7`e300ffb9 00000000`00000000
ffffbe8f`2aa2b020  948f41fa`50800001 00000000`00000000
ffffbe8f`2aa2b030  948f3ed2`40800001 00000000`00000000
ffffbe8f`2aa2b040  948f3ed7`90800001 00000000`00000000
ffffbe8f`2aa2b050  948f3ed6`80800001 00000000`00000000
ffffbe8f`2aa2b060  948f3ed1`30800001 00000000`00000000
ffffbe8f`2aa2b070  948f3edb`01400001 00000000`00000000
1: kd> !object ffff948f3ec7`e300
Object: ffff948f3ec7e300  Type: (ffff948f3eca8e80) Process
    ObjectHeader: ffff948f3ec7e2d0 (new version)
    HandleCount: 5  PointerCount: 163940

nt!PspCidTable的定位,修改都好办。x64上,由于PG的原因,改了过一会儿会蓝。

不过学习点东西还是不错的!PCHunter_jb51.net的驱动也没有加壳,空了再慢慢分析。

2020-12-9 20:34
0
游客
登录 | 注册 方可回帖
返回
//