首页
论坛
专栏
课程

[原创]发现最近好多在说T*启动时清空CR3 如何去恢复。方法很简单。我把代码今天贴出来。

BDBig 2018-12-4 23:47 1579

DXF可以直接恢复CR3 无检测。CF就不行。CF有检测。

CF只能出PTML4入手。就算你恢复了CR3.你们会发现 部分地址你们还是读不到?

为啥呢。这个问题问的好。看看 0E 就明白了。核心数据全部清空 当有进程去访问

这些地址 地址不存在触发异常 进入 0E 。T*判断触发 进程是不是自己的进程 是自己的进程

就给他一个抹掉的地址。不是真的 直接返回0.

这个在DXF影响不大。在CF上影响比较严重。

我之前想过HOOK MmMapIoSpace 来判断。意义不大。

如果是你直接返回NULL.直接升天

如何解决这个问题呢?

嵌套 TP HOOK 进行HOOK 按照某位网友给我的思路就是。

具体代码我也没有实现。有兴趣的自己去实现一下吧

PULONGLONG Mapped_Memory_Addr(ULONGLONG Addr, int Mapped_len, int Catch)

{

PHYSICAL_ADDRESS Physical_address;

RtlZeroMemory(&Physical_address, sizeof(PHYSICAL_ADDRESS));

if (Addr <= 0)

{

return NULL;

}

Physical_address.QuadPart = Addr;

PULONGLONG Tmp_Buffer = (PULONGLONG)MmMapIoSpace(Physical_address, Mapped_len, Catch);

return Tmp_Buffer;

}


BOOLEAN InsertProcess(ULONGLONG FakeCr3, HANDLE Pid, ULONGLONG TrueCr3)
{
 if (g_Cr3Conut < 0x4096)
 {
  for (ULONG i = 0; i < g_Cr3Conut; i++)
  {
   if (g_Cr3[i].Pid == Pid)
   {
    g_Cr3[i].Cr3 = TrueCr3;
    g_Cr3[i].Fake_Cr3 = FakeCr3;
    return TRUE;
   }
  }
        g_Cr3Conut++;
  g_Cr3[g_Cr3Conut].Pid = Pid;
  g_Cr3[g_Cr3Conut].Cr3 = TrueCr3;
  g_Cr3[g_Cr3Conut].Fake_Cr3 = FakeCr3;
  
 }
 return FALSE;
}

OB_PREOP_CALLBACK_STATUS
preCall(PVOID RegistrationContext, POB_PRE_OPERATION_INFORMATION pOperationInformation)
{

     UNREFERENCED_PARAMETER(RegistrationContext);
  PEPROCESS pe = IoGetCurrentProcess();
  if (MmIsAddressValid((PVOID)((ULONG64)pe + 0x28)))
  {
   if (__readcr3() != *(PULONG64)((ULONG64)pe + 0x28))
   {
    InsertProcess(*(PULONG64)((ULONG64)pe + 0x28), PsGetCurrentProcessId(), __readcr3());
    if (g_API)
    {
     PULONG64 Fake_PTML4 = Mapped_Memory_Addr(*(PULONG64)((ULONG64)pe + 0x28), 0x1000, 0);
     PULONG64 True_PTML4 = Mapped_Memory_Addr(__readcr3(), 0x1000, 0);
     if (Fake_PTML4[0] != True_PTML4[0])
     {
      _disable();
      if (Fake_PTML4 != NULL && True_PTML4 != NULL)
      {
       RtlCopyMemory(Fake_PTML4, True_PTML4, 0x1000);
      }
      MmUnmapIoSpace(Fake_PTML4, 0x1000);
      MmUnmapIoSpace(True_PTML4, 0x1000);
      _enable();
     }
    }
   }
  }
  
  if (g_API)
  {
   pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess = PROCESS_ALL_ACCESS_THREAD;
   pOperationInformation->Parameters->CreateHandleInformation.OriginalDesiredAccess = PROCESS_ALL_ACCESS_THREAD;
  }


 return OB_PREOP_SUCCESS;
}
BOOLEAN SetObType()
{
 if (ObFlage == FALSE)
 {
  NTSTATUS status;
  OB_CALLBACK_REGISTRATION obReg;
  OB_OPERATION_REGISTRATION opReg;
  memset(&obReg, 0, sizeof(obReg));
  obReg.Version = ObGetFilterVersion();
  obReg.OperationRegistrationCount = 1;
  obReg.RegistrationContext = NULL;
  RtlInitUnicodeString(&obReg.Altitude, L"25444");
  memset(&opReg, 0, sizeof(opReg));
  opReg.ObjectType = PsProcessType;
  opReg.Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;
  opReg.PreOperation = (POB_PRE_OPERATION_CALLBACK)preCall;
  obReg.OperationRegistration = &opReg;
  status = ObRegisterCallbacks(&obReg, &obHandle);
  if (status == STATUS_SUCCESS) ObFlage = TRUE;
 
  return ObFlage;
 }
  return FALSE;
}


这些东西 压根不值钱 我竟然看到 有人 天价在卖这些东西  

任何替换 CR3的东西 在ObjectCallVakc_Type 里不敢是假的。

是假的就是想死

QQ群:61895068

欢迎进群讨论。




[推荐]十年磨一剑!《加密与解密(第4版)》上市发行

最后于 2018-12-4 23:55 被BDBig编辑 ,原因:
上传的附件:
最新回复 (23)
BDBig 2018-12-4 23:54
2

0

#define PROCESS_ALL_ACCESS_THREAD        (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | THREAD_ALL_ACCESS|\
                                   0xFFFF)
红眼兽 2018-12-5 00:01
3

0

wx_clay 1 2018-12-5 00:04
4

0

占楼
小艾 2018-12-5 00:20
5

0

被安排的明明白白
BDBig 2018-12-5 00:26
6

0

小艾 被安排的明明白白
这东西肯定是被安排的。但是为啥没安排。我都感觉是T*在放水
hzqst 2 2018-12-5 08:16
7

0

鹅厂:懒得管
实际上他都接管idt和msr了,只要在进内核的时候把再cr3改回假的,你们这些各种xx回调都gg
顺便 你这样依然没有解决关键数据PTE被抹的问题
最后于 2018-12-5 08:17 被hzqst编辑 ,原因:
BDBig 2018-12-5 09:02
8

0

hzqst 鹅厂:懒得管实际上他都接管idt和msr了,只要在进内核的时候把再cr3改回假的,你们这些各种xx回调都gg顺便 你这样依然没有解决关键数据PTE被抹的问题
我换了1809 就不存在着问题了。哈哈。清PTE的我在DXF没有发现。到是CF这样的黄昏游戏 竟然清掉了
固件安全 2018-12-5 09:12
9

0

当场逮捕,这只是鹅厂员工没把事情做绝吧,毕竟都接管msr了,话说这方法应该被安排的明明白白了吧
BDBig 2018-12-5 09:18
10

0

     
最后于 2018-12-5 09:18 被BDBig编辑 ,原因:
BDBig 2018-12-5 09:18
11

0

固件安全 [em_36]当场逮捕,这只是鹅厂员工没把事情做绝吧,毕竟都接管msr了,话说这方法应该被安排的明明白白了吧
OE都接管。肯定呀。这种方法 没有被安排。。鹅场不想管。我现在上游戏看见外挂都恶心。现在大部分的读写的玩意都是注入。注入shellcode。这东西也不知道啥时间管。据悉市场价 CF : 800一月。APC注入shellcode.DXF 3 - 4K /月
刘铠文 2018-12-5 09:31
12

0

线程回调里就可以拿到cr3了,为啥要这么麻烦?
刘铠文 2018-12-5 09:32
13

0

顺便给你说一下,tp在win10并不是接管idt 0e
哇咔咔zs 2018-12-5 09:36
14

0

直接驱动拦截协议通讯,分析封包,懒得去逼逼驱动防护
kongfubull 2018-12-5 09:48
15

0

mark下,不明觉厉
hzqst 2 2018-12-5 10:05
16

0

BDBig 我换了1809 就不存在着问题了。哈哈。清PTE的我在DXF没有发现。到是CF这样的黄昏游戏 竟然清掉了
1809的安排pg,鹅厂还没搞稳定,大概是这个原因
BDBig 2018-12-5 10:21
17

0

刘铠文 顺便给你说一下,tp在win10并不是接管idt 0e
你说的是高版本的的WIN10 像我这种的万年不更新的 接管了。
BDBig 2018-12-5 10:22
18

0

刘铠文 线程回调里就可以拿到cr3了,为啥要这么麻烦?
线程回掉 最后你一样要拉OB站坑。为什么占坑 和 恢复页表一体呢。又少了写了一个线程回掉的代码
BDBig 2018-12-5 10:23
19

0

hzqst 1809的安排pg,鹅厂还没搞稳定,大概是这个原因
估计等他搞稳定了。微软在拉一波更新。哈哈。据说现在某大手子 的调试器 只支持没有挂MSR 和 IDT版的WIN10 WIN7。随便问一下。pte清空了 能不能不备份就给恢复呢?或者反清空
killpy 2 2018-12-5 15:02
20

0

hzqst 鹅厂:懒得管实际上他都接管idt和msr了,只要在进内核的时候把再cr3改回假的,你们这些各种xx回调都gg顺便 你这样依然没有解决关键数据PTE被抹的问题
我获取到真实页表 KeAttach进去 访问游戏内存 此时pte因为被清0  会触发异常 进入idt  tp此时应该能给我放行吧 
fakersaber 2018-12-6 09:03
21

0

win7上这东西是没有用滴
BDBig 2018-12-6 17:24
22

0

fakersaber win7上这东西是没有用滴[em_1]
W7没用开玩笑。看懂什么意思了吗?你以为只是一个OB吗?看清楚里边的代码亲。

  PULONG64 Fake_PTML4 = Mapped_Memory_Addr(*(PULONG64)((ULONG64)pe + 0x28), 0x1000, 0);
     PULONG64 True_PTML4 = Mapped_Memory_Addr(__readcr3(), 0x1000, 0);
     if (Fake_PTML4[0] != True_PTML4[0])
     {
      _disable();
      if (Fake_PTML4 != NULL && True_PTML4 != NULL)
      {
       RtlCopyMemory(Fake_PTML4, True_PTML4, 0x1000);
      }
      MmUnmapIoSpace(Fake_PTML4, 0x1000);
      MmUnmapIoSpace(True_PTML4, 0x1000);
      _enable();


核心代码看清楚
最后于 2018-12-6 17:26 被BDBig编辑 ,原因:
木志本柯 6天前
23

0

呦西是干货
木志本柯 6天前
24

0

hzqst 鹅厂:懒得管实际上他都接管idt和msr了,只要在进内核的时候把再cr3改回假的,你们这些各种xx回调都gg顺便 你这样依然没有解决关键数据PTE被抹的问题
呦西前辈给提了个醒以后如果不能读写或许能考虑你这个建议
返回