首页
社区
课程
招聘
[求助]PsSetLoadImageNotifyRoutine中遇到的问题
2010-11-19 14:57 10796

[求助]PsSetLoadImageNotifyRoutine中遇到的问题

2010-11-19 14:57
10796
最近写驱动,调PsSetLoadImageNotifyRoutine设置一个回调函数来得到一个模块的全路径,

根据回调函数的声明
VOID
(*PLOAD_IMAGE_NOTIFY_ROUTINE) (
    IN PUNICODE_STRING  FullImageName,
    IN HANDLE  ProcessId, // where image is mapped
    IN PIMAGE_INFO  ImageInfo
    );

FullImageName中的路径有类似以下的三种情况:
\Device\HarddiskVolumeX\yyy\xxx
\SystemRoot\xxx.dll
\WINDOWS\xxxxx.xx

为了得到一个加载模块的全路径,这里遇到了两个问题:
第一种情况时拿出前面的设备名如下调用来得到设备对象,

Status = ObReferenceObjectByName(&VolumeName,
                OBJ_CASE_INSENSITIVE,
                NULL,
                0,
                *IoDeviceObjectType,
                KernelMode,
                0,
                (PVOID)&DeviceObject);

其中VolumeName是\Device\HarddiskVolume1
返回0xC0000024,
{错误类型} 请求的操作所请求的对象类型与在请求中指定的对象类型不匹配。
不解

第三种情况,前面没有盘符,得到FileObject后如下调用
Status = IoVolumeDeviceToDosName(DeviceObject, &DosName);
直接蓝,打出当前的 IRQL=APC_LEVEL,不解
MSDN上说是调用IRQL=PASSIVE_LEVEL,有没有好的解决方法呢?

等待高人解答,先谢过了

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
打赏
分享
最新回复 (10)
雪    币: 7640
活跃值: (2231)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
寒冰心结 2010-11-19 15:37
2
0
第一个情况.
函数ObReferenceObjectByName不能用来获取Device类型的对象的地址.原因是Device类型有解析函数.
IopParseDevice.而IopParseDevice内存在参数检查.其中有一个参数就是我们调用ObReferenceObjectByName()时传递进去的第7个参数:ParseContext.但是很显然.你调用的时候传递的
是一个0.所以就错误返回了.正确的办法是用IoGetDeviceObjectPointer来代替.

第二个情况没啥说的吧.查询符号链接.然后拼接起来.

第三个情况..不懂你那FILE_OBJECT那里来的.以及如何调用的...所以未知.
雪    币: 248
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhtjia 2010-11-19 16:33
3
0
FileObject = CONTAINING_RECORD(FullImageName, FILE_OBJECT, FileName);

文件对象这样搞来的,有点牵强,还望大牛解释

ParseContext的结构该怎么填充呢?
雪    币: 7640
活跃值: (2231)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
寒冰心结 2010-11-19 19:37
4
0
那FullImageName是一个UNICODE_STRING指针好吧.结构内根本无FILE_OBJECT.CONTAINING_RECORD 这宏貌似是取结构体成员时候用的吧.
你这样的取法依据是什么呀?.我在怀疑怎么可以编译的过去?.
ParseContext 填充比较麻烦.没研究过.
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2010-11-20 08:55
5
0
wrk里有XX
if (PsImageNotifyEnabled) {

        IMAGE_INFO ImageInfo;

        if ((StartingAddress < MmHighestUserAddress) &&
            (Process->UniqueProcessId) &&
            (Process != PsInitialSystemProcess)) {

            ImageInfo.Properties = 0;
            ImageInfo.ImageAddressingMode = IMAGE_ADDRESSING_MODE_32BIT;
            ImageInfo.ImageBase = StartingAddress;
            ImageInfo.ImageSize = OutputViewSize;
            ImageInfo.ImageSelector = 0;
            ImageInfo.ImageSectionNumber = 0;

            PsCallImageNotifyRoutines (&ControlArea->FilePointer->FileName,
                                       Process->UniqueProcessId,
                                       &ImageInfo);
        }
    }
不过有时候Call来自其他地方啊~如果系统开启kernel dbg mode并链接上windbg就不太一样了~具体请自行研究
雪    币: 248
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhtjia 2010-11-22 13:07
6
0
CONTAINING_RECORD是把FullImageName当成FILE_OBJECT中的Name来取得FILE_OBJECT的指针
依据你楼下的代码
雪    币: 248
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhtjia 2010-11-22 13:08
7
0
V插K,知道ParseContext 怎么填吗?
雪    币: 248
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhtjia 2010-11-22 14:30
8
0
用名字L"\\Device\\HarddiskVolumeX"调用IoGetDeviceObjectPointer得到的是挂在卷设备的最上层的设备,有没有办法直接得到创建这个卷的设备对象?
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2010-11-22 23:32
9
0
请求的操作所请求的对象类型与在请求中指定的对象类型不匹配,在我的代码中

RtlInitUnicodeString( &DriverName, pwszDeviceName );

  ObReferenceObjectByName( &DriverName,
                           OBJ_CASE_INSENSITIVE,
                           NULL,
                           0,
                          *IoDriverObjectType,
                           KernelMode,
                           NULL,
                           &DriverObject );

  if ( DriverObject == NULL )
  {
    return NULL;
  }

  DeviceObject = DriverObject->DeviceObject;
雪    币: 248
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhtjia 2010-11-23 11:58
10
0
这样得到的DeviceObject可能是Volume1,可能是Volume2,或者。。。
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
Fypher 4 2010-11-23 14:34
11
0
IoVolumeDeviceToDosName的参数中,DeviceObject类型不对的话必蓝无疑。
IoGetDeviceObjectPointer也不好使。

果断枚举Driver->Device吧……
游客
登录 | 注册 方可回帖
返回