阅读:1759回复:8
急迫请教高手们一个问题<kisystemservice参数捕捉>!
环境: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才去取参数,我现在有些糊涂,到底是怎样来取这个参数呢???? 还请各位高手指教!!!! |
|
沙发#
发布于:2007-07-23 20:52
>将Dword值传给 DWORD *,根本编译通不过
强制转换 >而且他还加了一个edx_offset才去取参数,我现在有些糊涂,到底是怎样来取这个参数呢 tmp指向的第一个DWORD, 是第一个参数,第二个DWORD是第二个参数,依次类推,+2,指向第三个参数,ZwCreateFile的第三个参数就是ObjectAttributes, |
|
板凳#
发布于:2007-07-23 21:02
引用第1楼zhaock于2007-07-23 20:52发表的 : 那这段代码是正确地么? 可是build通不过啊 |
|
地板#
发布于:2007-07-23 21:21
引用第2楼zjxiong7019于2007-07-23 21:02发表的 : 强制转换类型之后编译成功了 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 ); } } } 不知道可不可以取到参数,因为我对于指针和地址有点搞糊涂了,不过先谢谢! |
|
地下室#
发布于:2007-07-23 21:57
引用第3楼zjxiong7019于2007-07-23 21:21发表的 : 搞错了 还是没有编译成功 temp = &p_objAttr->ObjectName; 这句话也是类型有问题 |
|
5楼#
发布于:2007-07-23 23:09
![]() |
|
|
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 ); } } } |
|
7楼#
发布于:2007-07-27 12:47
temp += edx_offset;
这个加2后得到的地址正确吗? |
|
|
8楼#
发布于:2007-07-27 20:25
引用第7楼zzq191于2007-07-27 12:47发表的 :我之前也是不知道正不正确,可是用SOftICE调试看了一下似乎是有文件路径的,难道是不对的么?请指点!!! |
|