NTCreateDEbugOBject for win8..1

这段代码展示了如何在Windows 8.1上创建调试对象(Debug Object),通过调用ObCreateObject函数并初始化相关内存结构。代码中进行了适当的优化,减少了硬编码,并附带了调试过程的说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



这个代码可以在WIN8.1上面跑的  测试成功 自己测试的时候呢 把ObInsertObjectEx,DbgkDebugObjectType替换一下 最后用符号连接就完美了
这个不像昨天的那个伪代码 这个可以跑的 我跟着调试了一遍代码也是没有用IDA了  IDA太坑
优化一下函数 减少一个硬编码  现在只有一个dbgobjecttype了
NTSTATUS NTCreateDebugObject(OUT PHANDLE DebugObjectHandle,
 IN ACCESS_MASK DesiredAccess,
 IN POBJECT_ATTRIBUTES ObjectAttributes,
 IN ULONG Flags){
  typedef NTSTATUS (__stdcall *OBCREATEOBJECT)(
   __in KPROCESSOR_MODE ProbeMode,
   __in POBJECT_TYPE ObjectType,
   __in POBJECT_ATTRIBUTES ObjectAttributes,
   __in KPROCESSOR_MODE OwnershipMode,
   __inout_opt PVOID ParseContext,
   __in ULONG ObjectBodySize,
   __in ULONG PagedPoolCharge,
   __in ULONG NonPagedPoolCharge,
   __out PVOID *Object
   );
  PHANDLE handle;
  UNICODE_STRING usFuncName;
  KPROCESSOR_MODE PreviousMode;
  OBCREATEOBJECT ObCreateObject;
  POBJECT_TYPE DebugObject;
  POBJECT_TYPE DbgkDebugObjectType=(POBJECT_TYPE)0x84939eb0  ;
 
  NTSTATUS status;
  RtlInitUnicodeString(&usFuncName,L"ObCreateObject");
  ObCreateObject = MmGetSystemRoutineAddress(&usFuncName);
  PreviousMode=ExGetPreviousMode();
  if (PreviousMode==KernelMode)
  {
   return STATUS_INVALID_PARAMETER;
  }
  if (Flags & 0xFFFFFFFE)
  {
   return STATUS_INVALID_PARAMETER;
  }
 

  status= ObCreateObject(PreviousMode,DbgkDebugObjectType,ObjectAttributes,PreviousMode,NULL,0x3c,0, 0,(PVOID)&DebugObject);
  if (!NT_SUCCESS(status))
  {
   return status;
  }
  *(ULONG*)((ULONG)DebugObject+0x10)=1;
  *(ULONG*)((ULONG)DebugObject+0x14)=0;
  *(ULONG*)((ULONG)DebugObject+0x18)=0;
  
    KeInitializeEvent((PRKEVENT)((ULONG)DebugObject+0x1c),1,0);
     
  *(ULONG*)((ULONG)DebugObject+0x30+4)= ((ULONG)DebugObject+0x30);
   *(ULONG*)((ULONG)DebugObject+0x30)=((ULONG)DebugObject+0x30);
    KeInitializeEvent((PRKEVENT)DebugObject,0,0);
    *(ULONG*)((ULONG)DebugObject+0x38)=2;
  
     status= ObInsertObject(DebugObject,NULL,DesiredAccess,0,NULL,&handle);
     if (!NT_SUCCESS(status))
     {
      return status;
     }
    KdPrint(("handle %X",handle));
    *(ULONG*)DebugObjectHandle=handle;

    return 0;
    


  
}


public DbgUiConnectToDbg .text:00000001800CC650 DbgUiConnectToDbg proc near ; DATA XREF: .rdata:0000000180120BD4↓o .text:00000001800CC650 ; .rdata:off_1801521D8↓o ... .text:00000001800CC650 .text:00000001800CC650 var_38 = dword ptr -38h .text:00000001800CC650 var_30 = qword ptr -30h .text:00000001800CC650 var_28 = qword ptr -28h .text:00000001800CC650 var_20 = dword ptr -20h .text:00000001800CC650 var_18 = xmmword ptr -18h .text:00000001800CC650 .text:00000001800CC650 sub rsp, 58h .text:00000001800CC654 mov rax, gs:_TEB.NtTib.Self .text:00000001800CC65D xor ecx, ecx .text:00000001800CC65F cmp [rax+(_TEB.DbgSsReserved+8)], rcx ; 判断是否已经有调试 这里存放的是调试对象的句柄 .text:00000001800CC666 jnz short loc_1800CC6AE .text:00000001800CC668 mov [rsp+58h+var_30], rcx .text:00000001800CC66D lea r8, [rsp+58h+var_38] .text:00000001800CC672 mov [rsp+58h+var_20], ecx .text:00000001800CC676 xorps xmm0, xmm0 .text:00000001800CC679 mov [rsp+58h+var_28], rcx .text:00000001800CC67E mov r9d, 1 .text:00000001800CC684 movdqu [rsp+58h+var_18], xmm0 .text:00000001800CC68A mov [rsp+58h+var_38], 30h ; '0' .text:00000001800CC692 mov edx, 1F000Fh .text:00000001800CC697 mov rcx, gs:_TEB.NtTib.Self .text:00000001800CC6A0 add rcx, 16A8h .text:00000001800CC6A7 call NtCreateDebugObject ; 参数1:存放调试对象句柄的地址 .text:00000001800CC6A7 ; 参数2:1F000F 访问掩码 也就是DesriedAccess .text:00000001800CC6A7 ; 参数3:==Out参数 .text:00000001800CC6A7 ; 参数4:1 .text:00000001800CC6AC mov ecx, eax .text:00000001800CC6AE .text:00000001800CC6AE loc_1800CC6AE: ; CODE XREF: DbgUiConnectToDbg+16↑j .text:00000001800CC6AE mov eax, ecx .text:00000001800CC6B0 add rsp, 58h .text:00000001800CC6B4 retn .text:00000001800CC6B4 ; --------------------------------------------------------------------------- .text:00000001800CC6B5 db 0CCh .text:00000001800CC6B5 DbgUiConnectToDbg endp
08-11
详细注释每一行汇编 0000000140888290 ; __int64 __fastcall NtCreateDebugObject(PHANDLE DebugHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, ULONG Flags) 0000000140888290 NtCreateDebugObject proc near ; DATA XREF: .pdata:000000014011CF74↑o 0000000140888290 ; PAGE:000000014098C2E8↓o 0000000140888290 var_68 = qword ptr -68h 0000000140888290 ObjectBodySize = dword ptr -60h 0000000140888290 var_58 = qword ptr -58h 0000000140888290 var_50 = dword ptr -50h 0000000140888290 Object = qword ptr -48h 0000000140888290 var_40 = qword ptr -40h 0000000140888290 DebugObject = qword ptr -30h 0000000140888290 Handle = qword ptr -28h 0000000140888290 var_8 = byte ptr -8 0000000140888290 mov rax, rsp 0000000140888293 mov [rax+8], rbx 0000000140888297 mov [rax+10h], rsi 000000014088829B mov [rax+18h], rdi 000000014088829F push r14 00000001408882A1 sub rsp, 80h ; Integer Subtraction 00000001408882A8 mov esi, r9d 00000001408882AB mov r14d, edx 00000001408882AE mov rdi, rcx 00000001408882B1 and qword ptr [rax-28h], 0 ; Logical AND 00000001408882B6 and qword ptr [rax-30h], 0 ; Logical AND 00000001408882BB mov rax, gs:188h 00000001408882C4 mov r10b, [rax+232h] 00000001408882CB loc_1408882CB: ; DATA XREF: .rdata:00000001400B5514↑o 00000001408882CB test r10b, r10b ; Logical Compare 00000001408882CE jz short loc_1408882E7 ; Jump if Zero (ZF=1) 00000001408882D0 mov rcx, 7FFFFFFF0000h 00000001408882DA cmp rdi, rcx ; Compare Two Operands 00000001408882DD cmovb rcx, rdi ; Move if Below (CF=1) 00000001408882E1 mov rax, [rcx] 00000001408882E4 mov [rcx], rax 00000001408882E7 loc_1408882E7: ; CODE XREF: NtCreateDebugObject+3E↑j 00000001408882E7 and qword ptr [rdi], 0 ; Logical AND 00000001408882EB loc_1408882EB: ; DATA XREF: .rdata:00000001400B5514↑o 00000001408882EB test esi, 0FFFFFFFEh ; Logical Compare 00000001408882F1 jz short loc_1408882FD ; Jump if Zero (ZF=1) 00000001408882F3 mov eax, 0C000000Dh 00000001408882F8 jmp loc_1408883FE ; Jump 00000001408882FD ; --------------------------------------------------------------------------- 00000001408882FD loc_1408882FD: ; CODE XREF: NtCreateDebugObject+61↑j 00000001408882FD mov rdx, cs:DbgkDebugObjectType ; ObjectType 0000000140888304 and [rsp+88h+var_40], 0 ; Logical AND 000000014088830A lea rax, [rsp+88h+DebugObject] ; Load Effective Address 000000014088830F mov [rsp+88h+Object], rax ; Object 0000000140888314 and [rsp+88h+var_50], 0 ; Logical AND 0000000140888319 and dword ptr [rsp+88h+var_58], 0 ; Logical AND 000000014088831E mov [rsp+88h+ObjectBodySize], 68h ; 'h' ; ObjectBodySize 0000000140888326 mov r9b, r10b ; OwnershipMode 0000000140888329 mov cl, r10b ; ProbeMode 000000014088832C call ObCreateObjectEx ; Call Procedure 0000000140888331 test eax, eax ; Logical Compare 0000000140888333 js loc_1408883FE ; Jump if Sign (SF=1) 0000000140888339 mov rbx, [rsp+88h+DebugObject] 000000014088833E mov dword ptr [rbx+18h], 1 0000000140888345 and qword ptr [rbx+20h], 0 ; Logical AND 000000014088834A and dword ptr [rbx+28h], 0 ; Logical AND 000000014088834E lea rcx, [rbx+30h] ; Event 0000000140888352 xor r8d, r8d ; State 0000000140888355 lea edx, [r8+1] ; Type 0000000140888359 call KeInitializeEvent ; Call Procedure 000000014088835E lea rax, [rbx+50h] ; Load Effective Address 0000000140888362 mov [rax+8], rax 0000000140888366 mov [rax], rax 0000000140888369 xor r8d, r8d ; State 000000014088836C xor edx, edx ; Type 000000014088836E mov rcx, rbx ; Event 0000000140888371 call KeInitializeEvent ; Call Procedure 0000000140888376 test sil, 1 ; Logical Compare 000000014088837A jz short loc_140888385 ; Jump if Zero (ZF=1) 000000014088837C mov dword ptr [rbx+60h], 2 0000000140888383 jmp short loc_140888389 ; Jump 0000000140888385 ; --------------------------------------------------------------------------- 0000000140888385 loc_140888385: ; CODE XREF: NtCreateDebugObject+EA↑j 0000000140888385 and dword ptr [rbx+60h], 0 ; Logical AND 0000000140888389 loc_140888389: ; CODE XREF: NtCreateDebugObject+F3↑j 0000000140888389 mov rax, gs:188h 0000000140888392 mov rcx, [rax+0B8h] 0000000140888399 mov rax, [rcx+580h] 00000001408883A0 test rax, rax ; Logical Compare 00000001408883A3 jz short loc_1408883C1 ; Jump if Zero (ZF=1) 00000001408883A5 movzx eax, word ptr [rax+8] ; Move with Zero-Extend 00000001408883A9 mov ecx, 14Ch 00000001408883AE cmp ax, cx ; Compare Two Operands 00000001408883B1 jz short loc_1408883BD ; Jump if Zero (ZF=1) 00000001408883B3 mov ecx, 1C4h 00000001408883B8 cmp ax, cx ; Compare Two Operands 00000001408883BB jnz short loc_1408883C1 ; Jump if Not Zero (ZF=0) 00000001408883BD loc_1408883BD: ; CODE XREF: NtCreateDebugObject+121↑j 00000001408883BD or dword ptr [rbx+60h], 4 ; Logical Inclusive OR 00000001408883C1 loc_1408883C1: ; CODE XREF: NtCreateDebugObject+113↑j 00000001408883C1 ; NtCreateDebugObject+12B↑j 00000001408883C1 lea rax, [rsp+88h+Handle] ; Load Effective Address 00000001408883C6 mov [rsp+88h+var_58], rax 00000001408883CB and qword ptr [rsp+88h+ObjectBodySize], 0 ; Logical AND 00000001408883D1 and dword ptr [rsp+88h+var_68], 0 ; Logical AND 00000001408883D6 xor r9d, r9d ; Logical Exclusive OR 00000001408883D9 mov r8d, r14d 00000001408883DC xor edx, edx ; Logical Exclusive OR 00000001408883DE mov rcx, [rsp+88h+DebugObject] 00000001408883E3 call ObInsertObjectEx ; Call Procedure 00000001408883E8 mov ecx, eax 00000001408883EA test eax, eax ; Logical Compare 00000001408883EC js short loc_1408883FE ; Jump if Sign (SF=1) 00000001408883EE loc_1408883EE: ; DATA XREF: .rdata:00000001400B5524↑o 00000001408883EE mov rax, [rsp+88h+Handle] 00000001408883F3 mov [rdi], rax 00000001408883F6 jmp short loc_1408883FA ; Jump 00000001408883F8 ; --------------------------------------------------------------------------- 00000001408883F8 loc_1408883F8: ; DATA XREF: .rdata:00000001400B5524↑o 00000001408883F8 mov ecx, eax 00000001408883FA loc_1408883FA: ; CODE XREF: NtCreateDebugObject+166↑j 00000001408883FA mov eax, ecx 00000001408883FC jmp short $+2 ; Jump 00000001408883FE ; --------------------------------------------------------------------------- 00000001408883FE loc_1408883FE: ; CODE XREF: NtCreateDebugObject+68↑j 00000001408883FE ; NtCreateDebugObject+A3↑j ... 00000001408883FE lea r11, [rsp+88h+var_8] ; Load Effective Address 0000000140888406 mov rbx, [r11+10h] 000000014088840A mov rsi, [r11+18h] 000000014088840E mov rdi, [r11+20h] 0000000140888412 mov rsp, r11 0000000140888415 pop r14 0000000140888417 retn ; Return Near from Procedure 0000000140888417 ; --------------------------------------------------------------------------- 0000000140888418 db 0CCh 0000000140888419 ; --------------------------------------------------------------------------- 0000000140888419 NtCreateDebugObject$filt$1_0: ; DATA XREF: .rdata:00000001400B5514↑o 0000000140888419 ; .pdata:000000014011CF74↑o ... 0000000140888419 push rbp 000000014088841B sub rsp, 50h ; Integer Subtraction 000000014088841F mov rbp, rdx 0000000140888422 mov rax, gs:188h 000000014088842B mov [rbp+70h], rax 000000014088842F mov rax, [rbp+70h] 0000000140888433 mov cl, [rax+232h] 0000000140888439 mov [rbp+51h], cl 000000014088843C mov cl, [rbp+51h] 000000014088843F xor eax, eax ; Logical Exclusive OR 0000000140888441 test cl, cl ; Logical Compare 0000000140888443 setnz al ; Set Byte if Not Zero (ZF=0) 0000000140888446 add rsp, 50h ; Add 000000014088844A pop rbp 000000014088844B retn ; Return Near from Procedure 000000014088844B ; --------------------------------------------------------------------------- 000000014088844C db 0CCh 000000014088844D ; --------------------------------------------------------------------------- 000000014088844D NtCreateDebugObject$filt$0: ; DATA XREF: .rdata:00000001400B5524↑o 000000014088844D ; .pdata:000000014011CF80↑o ... 000000014088844D push rbp 000000014088844F sub rsp, 50h ; Integer Subtraction 0000000140888453 mov rbp, rdx 0000000140888456 mov rax, gs:188h 000000014088845F mov [rbp+68h], rax 0000000140888463 mov rax, [rbp+68h] 0000000140888467 mov cl, [rax+232h] 000000014088846D mov [rbp+50h], cl 0000000140888470 mov cl, [rbp+50h] 0000000140888473 xor eax, eax ; Logical Exclusive OR 0000000140888475 test cl, cl ; Logical Compare 0000000140888477 setnz al ; Set Byte if Not Zero (ZF=0) 000000014088847A add rsp, 50h ; Add 000000014088847E pop rbp 000000014088847F retn ; Return Near from Procedure 000000014088847F ; --------------------------------------------------------------------------- 0000000140888480 db 0CCh 0000000140888480 NtCreateDebugObject endp
最新发布
08-12
通过我给出的代码,分析它的作用BOOLEAN HookDbgkDebugObjectType() { //如果是不以原始DbgkDebugObjectType指针来操作,以启动方式时则需要替换PspInsertProcess中的DbgkDebugObjectType UNICODE_STRING ObjectTypeName; //获取原始DbgkDebugObjectType CKernelTable Ssdt; /*根据给定的函数名NtCreateDebugObject,在系统服务描述符表(SSDT)中查找对应的函数地址*/ PVOID NtCreateDebugObject = Ssdt.GetAddressFromName("NtCreateDebugObject"); if (!NtCreateDebugObject) { return FALSE; } ULONG templong = 0; /* 指令序列用于查找 DbgkDebugObjectType 地址*/ UCHAR tzm[] = { 0x48, 0x8B, 0x15, 0xEC, 0x85, 0x47, 0x00 }; ULONG64 addr = 0; for (PUCHAR i = (PUCHAR)NtCreateDebugObject; i < (PUCHAR)NtCreateDebugObject + 0x100; i++) { if (*i == 0x48 && *(i + 1) == 0x8B && *(i + 2) == 0x15 ) { // 复制相对偏移量 memcpy(&templong, i + 3, 4); addr = (ULONG64)((ULONG)templong + (ULONG64)i + 7);// 计算绝对地址 break; } } g_DbgkDebugObjectType = (POBJECT_TYPE*)addr; if (g_DbgkDebugObjectType == 0) { return FALSE; // 返回失败状态,无法获取 DbgkDebugObjectType 地址 } DbgPrint("fh:sys g_DbgkDebugObjectType:%p\n", g_DbgkDebugObjectType); RtlInitUnicodeString(&ObjectTypeName, L"styone"); // 初始化对象类型名称 OBJECT_TYPE_INITIALIZER_WIN10 ObjectTypeInitializer; POBJECT_TYPE* DbgkDebugObjectType = g_DbgkDebugObjectType; //参数构造 //memcpy(&ObjectTypeInitializer, &DbgkDebugObjectType->TypeInfo, sizeof(ObjectTypeInitializer)); // 复制对象类型信息 memcpy(&ObjectTypeInitializer, &(*DbgkDebugObjectType)->TypeInfo, sizeof(OBJECT_TYPE_INITIALIZER_WIN10)); //这里恢复调试权限 //ObjectTypeInitializer.DeleteProcedure = &DbgkpDeleteObject; //ObjectTypeInitializer.CloseProcedure = &DbgkpCloseObject; //ObjectTypeInitializer.DeleteProcedure = &proxyDbgkpDeleteObject; //ObjectTypeInitializer.CloseProcedure = &proxyDbgkpCloseObject; ObjectTypeInitializer.DeleteProcedure = NULL; // 设置删除过程为空 ObjectTypeInitializer.CloseProcedure = NULL;// 设置关闭过程为空 ObjectTypeInitializer.GenericMapping.GenericRead = 0x00020001;// 设置通用读权限 ObjectTypeInitializer.GenericMapping.GenericWrite = 0x00020002; // 设置通用写权限 ObjectTypeInitializer.GenericMapping.GenericExecute = 0x00120000;// 设置通用执行权限 ObjectTypeInitializer.GenericMapping.GenericAll = 0x001f000f;// 设置通用所有权限 ObjectTypeInitializer.ValidAccessMask = 0x001f000f; // 设置有效访问掩码 //创建调试对象类型 NTSTATUS status = ObCreateObjectType(&ObjectTypeName, &ObjectTypeInitializer, NULL, (PVOID*)g_DbgkDebugObjectType); //return FALSE; if (!NT_SUCCESS(status)) { if (status == STATUS_OBJECT_NAME_COLLISION) { //对象名已经存在 DbgPrint("ObCreateObjectType STATUS_OBJECT_NAME_COLLISION 对象名已经存在\n"); PUCHAR j_ObGetObjectType = (PUCHAR)GetKernelAddress("ObGetObjectType"); if (!j_ObGetObjectType) { DbgPrint("ObGetObjectType函数 failed\n"); // 获取 ObGetObjectType函数 失败 return FALSE; } //ULONG uloffset = (ULONG)(*(PUINT32)(j_ObGetObjectType + 31)); //DbgPrint("uloffset:%x\n", uloffset); //ULONG64 baseAddr = (ULONG64)j_ObGetObjectType + 35; //DbgPrint("baseAddr:%p\n", baseAddr); //POBJECT_TYPE* ObTypeIndexTable = (POBJECT_TYPE*)(baseAddr + uloffset); // 获取对象类型索引表地址 POBJECT_TYPE* ObTypeIndexTable = (POBJECT_TYPE*)(*(PUINT32)(j_ObGetObjectType + 31) + (ULONG64)j_ObGetObjectType + 35); if (!ObTypeIndexTable) { DbgPrint("ObGetObjectType get failed\n"); // 获取对象类型索引表失败 return FALSE; } DbgPrint("ObTypeIndexTable:%p\n", ObTypeIndexTable); // 打印对象类型索引表地址 //DbgPrint("sizeof(_OBJECT_TYPE):%x\n", sizeof(_OBJECT_TYPE)); // 打印对象类型索引表第2个元素地址 DbgPrint("ObTypeIndexTable[2]:%p\n", ObTypeIndexTable[2]); ULONG Index = 2; while (ObTypeIndexTable[Index]) { // 打印当前对象类型地址 DbgPrint("ObTypeIndexTable[Index]:%p\n", ObTypeIndexTable[Index]); if (&ObTypeIndexTable[Index]->Name) { if (ObTypeIndexTable[Index]->Name.Buffer) { DbgPrint("RtlCompareUnicodeString:%ws %ws\n", ObTypeIndexTable[Index]->Name.Buffer, ObjectTypeName.Buffer); // 比较对象类型名称 if (RtlCompareUnicodeString(&ObTypeIndexTable[Index]->Name, &ObjectTypeName, FALSE) == 0) { // 设置 DbgkDebugObjectType 为找到的对象类型 *g_DbgkDebugObjectType = ObTypeIndexTable[Index]; // 打印已存在的 DbgkDebugObjectType 地址 DbgPrint("ObCreateObjectType already exist *g_DbgkDebugObjectType:%p\n", *g_DbgkDebugObjectType); return TRUE; } } } Index++; } } else { DbgPrint("ObCreateObjectType eeor!\n"); // 创建对象类型失败 return FALSE; } } // 打印创建成功的 DbgkDebugObjectType 地址 DbgPrint("ObCreateObjectType ok g_DbgkDebugObjectType:%p\n", g_DbgkDebugObjectType); return TRUE;// 返回成功状态 }
08-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值