[原创]发现最近好多在说T*启动时清空CR3 如何去恢复。方法很简单。我把代码今天贴出来。
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
欢迎进群讨论。
