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

急迫请教高手们一个问题<kisystemservice参数捕捉>!

楼主#
更多 发布于:2007-07-23 20:27
环境:Win2000和Win2003
不管是 Int2e 还是 SYSENTER
他们陷入内核的时候都会有这样两句
mov eax, ServiceId
lea edx, ParameterTable

我现在是想把系统调用的参数取出来,比如说打开的文件的路径名
把edx里面的值存到了一个全局变量DWORD g_edx中,这个值是系统调用参数的地址
然后我看到有人用这样一段代码来取参数:
           DWORD *temp;
    POBJECT_ATTRIBUTES p_objAttr;
    ANSI_STRING objname;

    temp = g_EDX;
    temp += edx_offset;//这个edx_offset已经知道是2
    p_objAttr = (POBJECT_ATTRIBUTES) *temp;
    if (p_objAttr != NULL)
    {
        if(p_objAttr->ObjectName != NULL)
        {
            temp = &p_objAttr->ObjectName;
            if(NT_SUCCESS(RtlUnicodeStringToAnsiString(&objname, *temp, TRUE)))
            {
                DbgPrint("\tObject Name: %s\n",objname.Buffer);
                RtlFreeAnsiString( &objname );
            }
        }
                  }
将Dword值传给 DWORD *,根本编译通不过,可是源代码就是这样的,而且他还加了一个edx_offset才去取参数,我现在有些糊涂,到底是怎样来取这个参数呢????
还请各位高手指教!!!!

zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2007-07-23 20:52
>将Dword值传给 DWORD *,根本编译通不过
强制转换

>而且他还加了一个edx_offset才去取参数,我现在有些糊涂,到底是怎样来取这个参数呢
tmp指向的第一个DWORD, 是第一个参数,第二个DWORD是第二个参数,依次类推,+2,指向第三个参数,ZwCreateFile的第三个参数就是ObjectAttributes,
zjxiong7019
驱动牛犊
驱动牛犊
  • 注册日期2006-11-11
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分560分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-07-23 21:02
引用第1楼zhaock于2007-07-23 20:52发表的  :
>将Dword值传给 DWORD *,根本编译通不过
强制转换

>而且他还加了一个edx_offset才去取参数,我现在有些糊涂,到底是怎样来取这个参数呢
tmp指向的第一个DWORD, 是第一个参数,第二个DWORD是第二个参数,依次类推,+2,指向第三个参数,ZwCreateFile的第三个参数就是ObjectAttributes,

那这段代码是正确地么?
可是build通不过啊
zjxiong7019
驱动牛犊
驱动牛犊
  • 注册日期2006-11-11
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分560分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-07-23 21:21
引用第2楼zjxiong7019于2007-07-23 21:02发表的  :

那这段代码是正确地么?
可是build通不过啊

强制转换类型之后编译成功了
DWORD *temp;
    POBJECT_ATTRIBUTES p_objAttr;
    ANSI_STRING objname;

    temp = (DWORD*)g_EDX;
    temp += edx_offset;
    p_objAttr = (POBJECT_ATTRIBUTES) *temp;
    if (p_objAttr != NULL)
    {
        if(p_objAttr->ObjectName != NULL)
        {
            temp = &p_objAttr->ObjectName;
            if(NT_SUCCESS(RtlUnicodeStringToAnsiString(&objname, *temp, TRUE)))
            {
                DbgPrint("\tObject Name: %s\n",objname.Buffer);
                RtlFreeAnsiString( &objname );
            }
        }
}
不知道可不可以取到参数,因为我对于指针和地址有点搞糊涂了,不过先谢谢!
zjxiong7019
驱动牛犊
驱动牛犊
  • 注册日期2006-11-11
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分560分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-07-23 21:57
引用第3楼zjxiong7019于2007-07-23 21:21发表的  :

强制转换类型之后编译成功了
DWORD *temp;
    POBJECT_ATTRIBUTES p_objAttr;
    ANSI_STRING objname;
.......

搞错了
还是没有编译成功
temp = &p_objAttr->ObjectName;
这句话也是类型有问题
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2007-07-23 23:09
麻烦死了,,,直接用汇编写得了。。。
驱动开发者 呵呵
zjxiong7019
驱动牛犊
驱动牛犊
  • 注册日期2006-11-11
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分560分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-07-24 21:34
我现在虽然编译通过了,但是还是蓝屏,还需要请高手们帮忙看看!!!!
我调试了一下应该还是p_objAttr的地址没有取对啊,高手们帮我看看!!!
DWORD *temp;
    POBJECT_ATTRIBUTES p_objAttr;
    ANSI_STRING objname;
//接下来这三行对么?
    temp = (DWORD*)g_EDX;//g_EDX是从edx寄存器中取出来的值,类型为DWORD
    temp += edx_offset;
    p_objAttr = (POBJECT_ATTRIBUTES) *temp;
    if (p_objAttr != NULL)
    {
        if(p_objAttr->ObjectName != NULL)
        {
            if(NT_SUCCESS(RtlUnicodeStringToAnsiString(&objname, p_objAttr->ObjectName , TRUE)))
            {
                DbgPrint("\tObject Name: %s\n",objname.Buffer);
                RtlFreeAnsiString( &objname );
            }
        }
            }
zzq191
驱动中牛
驱动中牛
  • 注册日期2001-08-09
  • 最后登录2018-05-29
  • 粉丝17
  • 关注0
  • 积分1041分
  • 威望716点
  • 贡献值0点
  • 好评度318点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2007-07-27 12:47
temp += edx_offset;
这个加2后得到的地址正确吗?
QQ:416331891,承接windows下应用和驱动的开发,雅虎通:zzq191, Email:zzq191@21cn.com
zjxiong7019
驱动牛犊
驱动牛犊
  • 注册日期2006-11-11
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分560分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-07-27 20:25
引用第7楼zzq191于2007-07-27 12:47发表的  :
temp += edx_offset;
这个加2后得到的地址正确吗?
我之前也是不知道正不正确,可是用SOftICE调试看了一下似乎是有文件路径的,难道是不对的么?请指点!!!
游客

返回顶部