首页
社区
课程
招聘
[讨论]在驱动中GetCurrentProcessFileName时的一个奇怪问题!
发表于: 2008-3-13 15:20 6784

[讨论]在驱动中GetCurrentProcessFileName时的一个奇怪问题!

2008-3-13 15:20
6784
最近在写驱动程序的时候,遇到一个奇怪的问题:

PCWSTR GetCurrentProcessFileName()
{
        DWORD dwAddress = (DWORD)PsGetCurrentProcess();
        if(KeGetCurrentIrql() != PASSIVE_LEVEL)        return NULL;       
        if(dwAddress == 0 || dwAddress == 0xFFFFFFFF)return NULL;
        dwAddress += 0x1B0;
        if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;
        dwAddress += 0x10;
        if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;
        dwAddress += 0x3C;
        if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;

        KdPrint(("Current Process Full Path Name: %ws\n",  (PCWSTR)dwAddress));
        return (PCWSTR)dwAddress;
}  
上面这个函数想必大家都不陌生,在xp/2k的驱动中可以得到当前进程的全路径,然而我在测试的时候发现,其实有些情况会出错,导致我的虚拟机直接蓝屏,但是我想不通问什么?

上面红色的代码,是最终得到ImageFile这个Unicode字符串地址的代码,在这之前的一步,dwAddress 一般情况下就是0x20000,而执行完红色的代码后,dwAddress 大概就是0x2yyyy的样子,反正比0x20000要大。
然而有些时候,执行完红色的代码后,得到的好像不是0x2yyyy,而是0xyyyy,这样就没有得到ImageFile的地址,而是和0x20000的偏移量。

——虽然我没有想清楚问什么,windows会这样搞!但是这里可以对上面的函数做点修改,暂时得到正确的函数体来得到正确的ImageFile的地址,我修改的函数如下:
PCWSTR GetCurrentProcessFileName()
{
        DWORD dwAddress = (DWORD)PsGetCurrentProcess();
        DWORD dwAddress1 ;

        if(KeGetCurrentIrql() != PASSIVE_LEVEL)
                return NULL;
       
        if(dwAddress == 0 || dwAddress == 0xFFFFFFFF)
                return NULL;
        dwAddress += 0x1B0;
        if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;
        dwAddress += 0x10;
        if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;
        dwAddress1=dwAddress;//20000
        dwAddress += 0x3C;
        if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;
        if(dwAddress<dwAddress1)
                dwAddress=dwAddress+dwAddress1;
        KdPrint(("Current Process Full Path Name: %ws\n",  (PCWSTR)dwAddress));
        return (PCWSTR)dwAddress;
}  

希望大牛们帮我想想,不胜感激!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不懂, 要问西裤
当你出现0xyyyy的时候 看看+0x38和+0x3A是什么
383C应该是一起的,是个UNICODE_STRING
2008-3-13 15:34
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
3
_EPROCESS->Peb->ProcessParameters->ImagePathName.Buffer
需要Attach吧
2008-3-13 15:57
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
4
这个代码,你要是放在DriverEntry中,走到这两句
  dwAddress += 0x1B0;
  if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;就退出了。

像楼上讲的,你需要attach到某个进程。
2008-3-13 17:36
0
雪    币: 215
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
PCWSTR GetCurrentProcessFileName()
{
  DWORD dwAddress = (DWORD)PsGetCurrentProcess();
  PUNICODE_STRING ImagePathName;

  if(KeGetCurrentIrql() != PASSIVE_LEVEL)  return NULL;  
  if(dwAddress == 0 || dwAddress == 0xFFFFFFFF)return NULL;
  dwAddress += 0x1B0;
  if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;
  dwAddress += 0x10;
  if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;
  dwAddress += 0x3C;
ImagePathName = (PUNICODE_STRING)dwAddress;
  if(ImagePathName==NULL ) return 0;
  KdPrint(("Current Process Full Path Name: %ws\n",  ImagePathName->Buffer));
  return (PCWSTR)dwAddress;
}

好像,对当前进程好像不需要attach的。
2008-3-14 09:02
0
雪    币: 222
活跃值: (44)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
6
对!不用attach吧!

但是5楼的代码,能保证最终一定能得到
ImagePathName = (PUNICODE_STRING)dwAddress;
吗?

有些时候,dwAddress只是个偏移,不是绝对的地址!正如我一开始说的!
不知道有其他朋友遇到过这个问题吗?
2008-3-14 13:51
0
雪    币: 215
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
进程创建完成后,当前进程的dwAddress这个不是偏移了,但是如果要去读取其它进程的,就有可能是偏移的情况。
2008-3-14 14:22
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
8
RaiseIrql试试
2008-3-14 14:35
0
游客
登录 | 注册 方可回帖
返回
//