zjxiong7019
驱动牛犊
驱动牛犊
  • 注册日期2006-11-11
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分560分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
阅读:1533回复:7

求助:windows2003下系统调用参数的获取

楼主#
更多 发布于:2007-07-29 15:44
我认为在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]
    }
}
zjxiong7019
驱动牛犊
驱动牛犊
  • 注册日期2006-11-11
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分560分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-07-30 19:43
请大家帮忙看看
我看到有本书上说
EDX寄存器中加载当前堆栈指针ESP
这是指什么?
是和在windows2000下EDX寄存器加载用户堆栈参数的指针一样的意思么?
如果是一样的意思,我怎么会取不到东西呢?
zjxiong7019
驱动牛犊
驱动牛犊
  • 注册日期2006-11-11
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分560分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-07-30 22:08
是不是我取参数的地址取错了呢?
对于汇编不是很懂的说!
zjxiong7019
驱动牛犊
驱动牛犊
  • 注册日期2006-11-11
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分560分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-07-31 20:19
大家帮忙指点一下吧!!!
zjxiong7019
驱动牛犊
驱动牛犊
  • 注册日期2006-11-11
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分560分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-07-31 21:31
我调试发现globalEDX中保存的一直一直是一个固定的值,这是不是没道理呢?
我参数取错了么?
请大家指点啊!
真的很急!!!
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
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
        }
    }
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
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稍有变化,自己就搞不定了..还是要先练基本功
zjxiong7019
驱动牛犊
驱动牛犊
  • 注册日期2006-11-11
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分560分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-08-01 20:09
说的是
我也觉得很惭愧
内核调试能力不行 需要锻炼
谢谢大虾们指点!
游客

返回顶部