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

请教:windows从用户态陷入内核态参数保存的具体位置

楼主#
更多 发布于:2007-07-25 22:01
从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是不是就是保存了查找的文件的路径呢?可是想看却蓝屏了,所以我想是不是地址上面还是取的有问题呢?

请高手们指点!!!!!拜谢!!!!!
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2007-07-25 22:30
1,对于NtOpenFile,你在另一个贴子里的代码是对的,第三个参数才是p_objAttr,所以temp + =2;
2.用softice,断住手工分析分析,p_objecattr指向的参数对不对
3用ice,windbg看崩溃的地址,分析原因
4.对于用户态传过来的指针数据,用之前,先用try{ ProbeForRead,ProbeForWrite} excpe{},做参数检查, ,不然用户传的指针非法,到你这里,就把系统搞蓝屏了
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2007-07-26 08:48
调试看内存,就一目了然了,记住实践是检验真理的唯一标准。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
zjxiong7019
驱动牛犊
驱动牛犊
  • 注册日期2006-11-11
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分560分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-07-26 12:00
谢谢两位!谢谢
zjxiong7019
驱动牛犊
驱动牛犊
  • 注册日期2006-11-11
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分560分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-07-26 20:12
我跟踪了一下,看到p_objAttr->ObjectName中的buffer确实保存了路径,可是当我想用DbgPrint语句想打印出来看一下却会蓝屏,谁能指点一下应该怎么读这个Buffer里面的数据么?我是这么做的:
PUNICODE_STRING uniString;
uniString=p_objAttr->ObjectName;//我测验了一下这句话造成了蓝屏
DbgPrint("%ws",(*uniString).Buffer);
我现在有些不明白该怎么做了
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2007-07-26 20:32
ObjectName是一个unicode,如果Buffer不以0结尾,你调用DbgPrint,可能越界,指针非法,导致蓝屏.
游客

返回顶部