阅读:1785回复:5
请教:windows从用户态陷入内核态参数保存的具体位置
从ntdll.dll中调用了一个函数,比如ntopenfile,陷入内核态的时候,会有下面的一段汇编代码
MOV EAX, SyscallNumber LEA EDX, [ESP+4] 我现在想知道ntopenfile打开的文件的路径是什么,应该怎么做呢? 我自己写了这样一段代码,请高手们看看正不正确 DWORD *temp; POBJECT_ATTRIBUTES p_objAttr; temp =(DWORD*) g_EDX; //这个g_EDX是保存的寄存器EDX的值(mov g_EDX, edx),类型为DWORD p_objAttr = (POBJECT_ATTRIBUTES) *temp; p_objAttr->ObjectName是不是就是保存了查找的文件的路径呢?可是想看却蓝屏了,所以我想是不是地址上面还是取的有问题呢? 请高手们指点!!!!!拜谢!!!!! |
|
沙发#
发布于:2007-07-25 22:30
1,对于NtOpenFile,你在另一个贴子里的代码是对的,第三个参数才是p_objAttr,所以temp + =2;
2.用softice,断住手工分析分析,p_objecattr指向的参数对不对 3用ice,windbg看崩溃的地址,分析原因 4.对于用户态传过来的指针数据,用之前,先用try{ ProbeForRead,ProbeForWrite} excpe{},做参数检查, ,不然用户传的指针非法,到你这里,就把系统搞蓝屏了 |
|
板凳#
发布于:2007-07-26 08:48
调试看内存,就一目了然了,记住实践是检验真理的唯一标准。
|
|
|
地板#
发布于:2007-07-26 12:00
谢谢两位!谢谢
|
|
地下室#
发布于:2007-07-26 20:12
我跟踪了一下,看到p_objAttr->ObjectName中的buffer确实保存了路径,可是当我想用DbgPrint语句想打印出来看一下却会蓝屏,谁能指点一下应该怎么读这个Buffer里面的数据么?我是这么做的:
PUNICODE_STRING uniString; uniString=p_objAttr->ObjectName;//我测验了一下这句话造成了蓝屏 DbgPrint("%ws",(*uniString).Buffer); 我现在有些不明白该怎么做了 |
|
5楼#
发布于:2007-07-26 20:32
ObjectName是一个unicode,如果Buffer不以0结尾,你调用DbgPrint,可能越界,指针非法,导致蓝屏.
|
|