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

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

2020-4-5 14:23
12273

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

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

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

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

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

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

       首先,我并不是用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再与运算。就这样我的问题得到解决。马上自己计算验证一下。

       !!!完美!!!


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (18)
雪    币: 4709
活跃值: (1575)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
2
前排出售瓜子香肠饮料矿泉水
2020-4-5 14:24
0
雪    币: 1907
活跃值: (6004)
能力值: ( LV7,RANK:116 )
在线值:
发帖
回帖
粉丝
3
前排买瓜子香肠饮料矿泉水
2020-4-5 14:26
0
雪    币: 14539
活跃值: (17553)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
4
mark,楼主辛苦了
2020-4-5 14:53
0
雪    币: 5596
活跃值: (2173)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢分享!
2020-4-5 15:32
0
雪    币: 3738
活跃值: (3872)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
感谢分享!
2020-4-5 18:04
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
2020-4-5 18:18
0
雪    币: 7271
活跃值: (3612)
能力值: ( LV7,RANK:105 )
在线值:
发帖
回帖
粉丝
8
师傅写的很详细,排版辛苦了,点赞收藏有了
最后于 2020-4-5 19:12 被A2kaid编辑 ,原因:
2020-4-5 19:12
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
往往进步的就是LZ这样的人~
2020-4-6 11:07
0
雪    币: 300
活跃值: (2477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
mark
2020-4-6 20:15
0
雪    币: 26205
活跃值: (63302)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
11
往往进步的就是LZ这样的人~
2020-4-13 09:20
0
雪    币: 23
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
mark
2020-5-6 06:16
0
雪    币: 764
活跃值: (1408)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
mark
2020-6-17 10:27
0
雪    币: 299
活跃值: (234)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
谢谢楼主,刚摸索到了一点就看到你这个帖子,受益匪浅!
2020-6-17 18:33
0
雪    币: 6172
活跃值: (4947)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
15
呜呜呜 太强了 呜呜呜 什么时候才能像小路师傅那么强
2020-11-18 15:38
0
雪    币: 414
活跃值: (1721)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
有个疑问,pchunter的驱动是加了壳的,如何像楼主一样那么顺滑的用ida反编译
2020-12-9 01:45
0
雪    币: 83
活跃值: (1087)
能力值: ( 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
游客
登录 | 注册 方可回帖
返回
//