找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4245|回复: 1

逆WIN7X64内核调试之NTCreateDebugObject

[复制链接]

9

主题

43

回帖

2

精华

铂金会员

积分
2525
发表于 2015-9-28 15:38:34 | 显示全部楼层 |阅读模式
NTSTATUS __fastcall proxyNtCreateDebugObject(
        OUT PHANDLE DebugObjectHandle,
        IN ACCESS_MASK DesiredAccess,
        IN POBJECT_ATTRIBUTES ObjectAttributes,
        IN ULONG Flags
        )
{
        NTSTATUS status;
        HANDLE Handle;
        PDEBUG_OBJECT DebugObject;
        KPROCESSOR_MODE        PreviousMode;

        PreviousMode = ExGetPreviousMode();

        //判断用户层句柄地址是否合法
        try {
                if (PreviousMode != KernelMode) {
                ProbeForWriteHandle (DebugObjectHandle);
                        *DebugObjectHandle = *DebugObjectHandle;
                }
                *DebugObjectHandle = NULL;

        } except(ExSystemExceptionFilter()) {
                return GetExceptionCode();
        }

        if (Flags & ~DEBUG_KILL_ON_CLOSE) {
                return STATUS_INVALID_PARAMETER;
        }

        //创建调试对象
        status = ObCreateObject(
                PreviousMode,
                NewDbgObject,        //调试对象类型,后面我们要换成我们新建的调试对象类型
                ObjectAttributes,
                PreviousMode,
                NULL,
                sizeof(DEBUG_OBJECT),
                0,
                0,
                (PVOID*)&DebugObject);

        if (!NT_SUCCESS(status)) {
                return status;
        }
        //初始化调试对象
        ExInitializeFastMutex(&DebugObject->Mutex);
        InitializeListHead(&DebugObject->EventList);
        KeInitializeEvent(&DebugObject->EventsPresent, NotificationEvent, FALSE);

        if (Flags & DEBUG_KILL_ON_CLOSE) {
                DebugObject->Flags = DEBUG_OBJECT_KILL_ON_CLOSE;
        }
        else {
                DebugObject->Flags = 0;
        }

        //调试对象插入句柄表
        status = ObInsertObject(
                DebugObject,
                NULL,
                DesiredAccess,
                0,
                NULL,
                &Handle);
        if (!NT_SUCCESS(status)) {
                return status;
        }

        try {
                *DebugObjectHandle = Handle;
        } except(ExSystemExceptionFilter()) {
                status = GetExceptionCode();
        }

        return status;
}

这个函数没什么改变 ~~抄mengwuji的就可以了= =

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2015-9-28 19:14:02 | 显示全部楼层
话说这么多年,调试体系的变化是不太大的,唯独就是很多相关的API和变量没导出。
此外,估计WIN64上为了支持对WOW64程序的调试,有新的内容。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表