首页
论坛
专栏
课程

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

2018-12-4 23:47 3423

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

2018-12-4 23:47
3423

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

欢迎进群讨论。




[推荐]看雪企服平台,提供安全分析、定制项目开发、APP等级保护、渗透测试等安全服务!

最后于 2018-12-4 23:55 被BDBig编辑 ,原因:
上传的附件:
上一主题 下一主题
最新回复 (25)
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 3 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 3 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编辑 ,原因:
木志本柯 2018-12-11 19:28
23
0
呦西是干货
木志本柯 2018-12-11 19:43
24
0
hzqst 鹅厂:懒得管实际上他都接管idt和msr了,只要在进内核的时候把再cr3改回假的,你们这些各种xx回调都gg顺便 你这样依然没有解决关键数据PTE被抹的问题
呦西前辈给提了个醒以后如果不能读写或许能考虑你这个建议
Besttwuya 2019-1-12 04:15
25
0
小心鹅厂安排,低调点!
hekes 2019-1-14 08:16
26
0
mark
游客
登录 | 注册 方可回帖
返回