首页
社区
课程
招聘
[讨论]ObReferenceObjectByName调用的时候蓝屏
发表于: 2017-2-2 23:58 4907

[讨论]ObReferenceObjectByName调用的时候蓝屏

2017-2-2 23:58
4907
#define KBD_DRIVER_NAME L"\\Driver\\Kbdclass"

extern "C"
{
        POBJECT_TYPE* IoDriverObjectType;
        NTKERNELAPI
                NTSTATUS
                ObReferenceObjectByName(PUNICODE_STRINGObjectName,
                ULONG Attributes,
                PACCESS_STATE AccessState,
                ACCESS_MASK DesiredAccess,
                POBJECT_TYPE ObjectType,
                KPROCESSOR_MODE AccessMode,
                PVOID ParseContent,
                PVOID *Object);
};

PDRIVER_OBJECT pKbdDriverObject = NULL;
UNICODE_STRING uniNtNameString;

RtlInitUnicodeString(&uniNtNameString, KBD_DRIVER_NAME);
status = ObReferenceObjectByName(&uniNtNameString, OBJ_CASE_INSENSITIVE, NULL, 0, *IoDriverObjectType, KernelMode, NULL, (PVOID *)&pKbdDriverObject);

寒江独钓这本书第4章讲的是键盘的过滤, 其中用到了一个未文档化的函数, ObReferenceObjectByName, 我跟着书里面写, 结果运行到这个函数就蓝屏了, 网上说需要把IoDriverObjectType改成双重指针, 上面是我改过之后的代码, 改了之后还是蓝屏, 这个函数到底怎么用啊?

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 9056
活跃值: (3701)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
POBJECT_TYPE* IoDriverObjectType;
换成
extern POBJECT_TYPE* IoDriverObjectType;

试试.
2017-2-3 08:16
0
雪    币: 12876
活跃值: (9357)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
3
extern POBJECT_TYPE *IoDriverObjectType;

ObReferenceObjectByName(&DriverName, OBJ_CASE_INSENSITIVE, NULL, 0, *IoDriverObjectType, KernelMode, NULL, (PVOID*)&MouClassDriverObject)

不用谢我
2017-2-3 10:12
1
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢啦
2017-2-3 12:16
0
雪    币: 3
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
试过了, 还是蓝屏
2017-2-3 14:08
0
雪    币: 3
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我的IoDriverObjectType是包括在extern "C"{}里面的, 我再加上一个extern 或者把IoDriverObjectType拿出来单独写都不行
2017-2-3 14:09
0
雪    币: 3
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我发现这样写就不蓝屏了, 但是函数返回的结果表示没有成功获得kbdclass

extern "C" POBJECT_TYPE IoDriverObjectType;
extern "C"
{
       
        NTKERNELAPI
                NTSTATUS
                ObReferenceObjectByName(PUNICODE_STRING ObjectName,
                ULONG Attributes,
                PACCESS_STATE AccessState,
                ACCESS_MASK DesiredAccess,
                POBJECT_TYPE ObjectType,
                KPROCESSOR_MODE AccessMode,
                PVOID ParseContent,
                PVOID *Object);
};

status = ObReferenceObjectByName(&uniNtNameString, OBJ_CASE_INSENSITIVE, NULL, 0, IoDriverObjectType, KernelMode, NULL, (PVOID *)&pKbdDriverObject);
        if (!(NT_SUCCESS(status)))
        {
                KdPrint(("could not get the KbdDriverObject!"));
                return status;
        }
2017-2-3 14:40
0
雪    币: 3
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
好吧, 照着2楼3楼的写法去写代码, 这次又不蓝屏了, 不知道以前到底是什么情况。 还有, 我上面写得代码是错的, 2楼和3楼说的方法是对的, 下面附上正确代码:

extern "C" POBJECT_TYPE* IoDriverObjectType;
extern "C"
{
  
  NTKERNELAPI
    NTSTATUS
    ObReferenceObjectByName(PUNICODE_STRING ObjectName,
    ULONG Attributes,
    PACCESS_STATE AccessState,
    ACCESS_MASK DesiredAccess,
    POBJECT_TYPE ObjectType,
    KPROCESSOR_MODE AccessMode,
    PVOID ParseContent,
    PVOID *Object);
};

status = ObReferenceObjectByName(&uniNtNameString, OBJ_CASE_INSENSITIVE, NULL, 0, *IoDriverObjectType, KernelMode, NULL, (PVOID *)&pKbdDriverObject);
  if (!(NT_SUCCESS(status)))
  {
    KdPrint(("could not get the KbdDriverObject!"));
    return status;
  }
2017-2-3 15:12
0
雪    币: 1140
活跃值: (102)
能力值: ( LV4,RANK:48 )
在线值:
发帖
回帖
粉丝
9
我刚遇到这个问题,刚发完帖子就发现你这个了
2017-2-10 20:38
0
雪    币: 1140
活跃值: (102)
能力值: ( LV4,RANK:48 )
在线值:
发帖
回帖
粉丝
10
看来我们学习进度很接近啊
2017-2-10 20:40
0
游客
登录 | 注册 方可回帖
返回