欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

枚举内核对象目录信息

枚举内核对象目录信息

Programming Windows Driver Model这本书中提供了一个工具叫DevView,
通过它可以很方便的查看设备对象的相关信息

不过在我的机器上使用却有问题,当我点击Device这个目录是DevView crash,于是就有了山寨的想法。
目前实现的比较简单,只是单纯的实现了枚举对象目录的功能,也没有实现应用层的交互,
虽然实现简单,功能单一,但是可以作为一个独立的模块知识与大家分享。由于没有实现应用层,就用debugview工具凑合看看把,为了体现对象目录是个树形结构,我稍微用了点分隔符号,表达个意思,下面看个截图(winXP sp2 虚拟机测试)

主要的知识点提一下
定义了两个结构
typedef struct _OBJECT_DIRECTORY_INFORMATION {
    UNICODE_STRING Name;
    UNICODE_STRING TypeName;
} OBJECT_DIRECTORY_INFORMATION, *POBJECT_DIRECTORY_INFORMATION;
参考了wrk-v1.2\public\sdk\inc\ntobapi.h中的定义
typedef struct _OBJECT_NODE
{
    _OBJECT_NODE *NextNode;  
    _OBJECT_NODE *ChildNode;  
    WCHAR              wsObjName[MAX_OBJ_NAME_LEN];
    WCHAR                wsTypeName[MAX_OBJ_TYPE_LEN];
}OBJECT_NODE, *POBJECT_NODE;
自定义的结构,用于保存树形结构对象的信息
两个枚举对象目录的API
extern "C"
NTSYSCALLAPI
NTSTATUS
NTAPI
ZwOpenDirectoryObject ( __out PHANDLE DirectoryHandle,
             __in ACCESS_MASK DesiredAccess,
             __in POBJECT_ATTRIBUTES ObjectAttributes
     ); 
extern "C"
NTSYSAPI
NTSTATUS
NTAPI
ZwQueryDirectoryObject ( __in HANDLE DirectoryHandle,                        __out_bcount_opt(Length) PVOID Buffer,
                 __in ULONG Length,
              __in BOOLEAN ReturnSingleEntry,
                 __in BOOLEAN RestartScan,
                                          __inout PULONG Context,
                                          __out_opt PULONG ReturnLength
                                );
由于DDK的头文件没有定义,那就手动导出函数声明。
描述以下代码流程:
在DriverEntry函数中直接实现递归枚举对象->保存对象信息->打印->卸载清除对象信息,
额外保存对象信息是为了接下来和应用层交互,在这个例子中可能还没体现出来。
整体结构比较简单,直接上代码
myobj.rar

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功