能力值:
( LV6,RANK:90 )
|
-
-
2 楼
帮你想想,是不是得首先知道用户模式下的线程上下文在切换到内核模式时它会保存在哪?知道它保存在哪后,应该可以读出来了吧...关键是我google了下,不知道它保存在哪.TEB?一起找..有进展了帮忙通告下
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我卡这个问题几天了,不知道怎么弄,不知道切换的时候保存哪去了
|
能力值:
( 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调用第一个函数.
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
实在太感谢楼上那位兄弟了
请问如果能不能获得这个时候ring3的eip呢,像这些东西查什么资料的,
如何知道这个esp就是由 KiGetUserModeStackAddress() 得到的
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
ring3的esp指向的第一个DWORD就是返回到ring3的地址,至于ring3的栈中更多分析,不同的系统不同,自己跟踪一下是最好的研究方法;这些东西靠自己积累。
强调一下,KiGetUserModeStackAddress()得到是ring3 esp值的指针,不是esp。
其实在回答你的问题之前,我也不是清楚什么函数可以取ring3 esp,我只知道ring3 esp在TrapFrame中,由于取的过程涉及三个内核的数据结构,不同的版本的系统,这三个结构都可能会变化,如果能找一个内核函数来取ring3 esp则可以避免版本问题,因此我在函数中搜索了一下,于是发现了KiGetUserModeStackAddress。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
学习中,没接触过内核
|
|
|