首页
社区
课程
招聘
[求助]驱动中如何获取当前线程的ring3栈指针(esp)
发表于: 2010-1-27 04:27 6388

[求助]驱动中如何获取当前线程的ring3栈指针(esp)

2010-1-27 04:27
6388
一个线程实际上有两个上下文:用户模式和内核模式,
一个线程有ring3级的栈和ring0级的栈
GetThreadContext只能返回线程的用户模式上下文(驱动中用不了这个函数,ZwGetThreadContext也用不了)
在驱动中PsGetCurrentThread,可以得到当前运行的线程,
我现在hook了一个内核函数,我想在驱动中得到当前线程在ring3下的堆栈指针(esp),
请问怎么得到?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 75
活跃值: (688)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
帮你想想,是不是得首先知道用户模式下的线程上下文在切换到内核模式时它会保存在哪?知道它保存在哪后,应该可以读出来了吧...关键是我google了下,不知道它保存在哪.TEB?一起找..有进展了帮忙通告下
2010-1-27 13:32
0
雪    币: 124
活跃值: (205)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我卡这个问题几天了,不知道怎么弄,不知道切换的时候保存哪去了
2010-1-27 15:14
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
用户模式的esp存在_KTHREAD.TrapFrame.HardwareEsp中,内核未导出的函数KiGetUserModeStackAddress()返回用户模式ESP的指针(而不是ESP本身),

XP SP2的NTOSKRNL.EXE中KiGetUserModeStackAddress定义如下:
.text:0040C32B                         __stdcall KiGetUserModeStackAddress() proc near
.text:0040C32B A1 24 F1 DF FF                          mov     eax, ds:0FFDFF124h
.text:0040C330 8B 80 34 01 00 00                       mov     eax, [eax+_KTHREAD.TrapFrame]
.text:0040C336 8D 40 74                                lea     eax, [eax+_KTRAP_FRAME.HardwareEsp]
.text:0040C339 C3                                      retn
.text:0040C339                         __stdcall KiGetUserModeStackAddress() endp

如果你不会下载符号,则找KeUserModeCallback,它是一个导出函数,它有类似如下的定义:
PAGE:0048F5A9                         KeUserModeCallback proc near

PAGE:0048F5A9 6A 30                                   push    30h
PAGE:0048F5AB 68 F0 EC 40 00                          push    offset dword_40ECF0
PAGE:0048F5B0 E8 DD C4 F7 FF                          call    __SEH_prolog
PAGE:0048F5B5 E8 71 CD F7 FF                          call    KiGetUserModeStackAddress()
PAGE:0048F5BA 89 45 E4                                mov     [ebp+var_1C], eax
...
除__SEH_prolog外,KiGetUserModeStackAddress是KeUserModeCallback调用第一个函数.
2010-1-27 19:41
0
雪    币: 124
活跃值: (205)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
实在太感谢楼上那位兄弟了

请问如果能不能获得这个时候ring3的eip呢,像这些东西查什么资料的,
如何知道这个esp就是由 KiGetUserModeStackAddress()  得到的
2010-1-27 21:53
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
ring3的esp指向的第一个DWORD就是返回到ring3的地址,至于ring3的栈中更多分析,不同的系统不同,自己跟踪一下是最好的研究方法;这些东西靠自己积累。

强调一下,KiGetUserModeStackAddress()得到是ring3 esp值的指针,不是esp。

其实在回答你的问题之前,我也不是清楚什么函数可以取ring3 esp,我只知道ring3 esp在TrapFrame中,由于取的过程涉及三个内核的数据结构,不同的版本的系统,这三个结构都可能会变化,如果能找一个内核函数来取ring3 esp则可以避免版本问题,因此我在函数中搜索了一下,于是发现了KiGetUserModeStackAddress。
2010-1-28 08:28
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习中,没接触过内核
2010-1-28 13:29
0
游客
登录 | 注册 方可回帖
返回
//