阅读:1532回复:7
求助:windows2003下系统调用参数的获取
我认为在windows2003下由用户态陷入内核态的时候仍然是有下面两句的
mov eax, ServiceId lea edx, ParameterTable 所以我采用了和在windows2000下一样的处理方法 DWORD *temp; POBJECT_ATTRIBUTES p_objAttr; ANSI_STRING objname; temp = globalEDX; temp += edx_offset;//这个edx_offset已经置为2 p_objAttr = (POBJECT_ATTRIBUTES) *temp; if (p_objAttr != NULL) { if(p_objAttr->ObjectName != NULL) { } } 可是通过softICE调试我却发现p_objAttr中什么东西都没有,请高手指点我哪里出错了? 获取参数的地址的函数如下 __declspec(naked) MyKiFastCallEntry() { __asm{ pushad pushfd push fs mov bx,0x30 mov fs,bx push ds push es mov ServiceID,eax; mov globalEDX,edx; pop es pop ds pop fs popfd popad jmp [d_origKiFastCallEntry] } } |
|
沙发#
发布于:2007-07-30 19:43
请大家帮忙看看
我看到有本书上说 EDX寄存器中加载当前堆栈指针ESP 这是指什么? 是和在windows2000下EDX寄存器加载用户堆栈参数的指针一样的意思么? 如果是一样的意思,我怎么会取不到东西呢? |
|
板凳#
发布于:2007-07-30 22:08
是不是我取参数的地址取错了呢?
对于汇编不是很懂的说! |
|
地板#
发布于:2007-07-31 20:19
大家帮忙指点一下吧!!!
|
|
地下室#
发布于:2007-07-31 21:31
我调试发现globalEDX中保存的一直一直是一个固定的值,这是不是没道理呢?
我参数取错了么? 请大家指点啊! 真的很急!!! |
|
5楼#
发布于:2007-08-01 10:42
if (IS_WINDOWS2000())
{ __asm{ mov CallNumber,eax; mov ParameterTable,edx } } else if (IS_WINDOWSXP_OR_LATER()) { __asm{ mov CallNumber,eax; add edx,8 mov ParameterTable,edx } } |
|
|
6楼#
发布于:2007-08-01 10:47
不是2k,2003的问题,而是int 2e,和sysenter的问题
mov eax, ServiceId lea edx, ParameterTable 是使用int 2e的代码 采用sysenter的代码.比如ZwOpenFile mov eax,4 mov edx,_KiFastSystemCall call [edx] _KiFastSystemCall: mov edx,esp sysenter 显然edx,不在指向ParaeterTable,前面又加了两个dword,所以加8后,再按照int 2e同样的处理,就 可以了 题外话:这种问题,其实只要会用softice跟踪,跟跟就清楚了. 做这种系统级程序,反汇编,和跟踪是必不可少的,如果不掌握,就只能抄别人的现成代码了,os稍有变化,自己就搞不定了..还是要先练基本功 |
|
7楼#
发布于:2007-08-01 20:09
说的是
我也觉得很惭愧 内核调试能力不行 需要锻炼 谢谢大虾们指点! |
|