NTCreateDEbugOBject for win8..1

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


这个代码可以在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;
    


  
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值