WIN10下双机调试原理:
1 创建.OBJECTTYE_CALLBACK 来恢复权限
2 我记得原来有人问过我问XX在WIN10是不是清空DebugProt是不清空了。我原来不分析过 这几天在研究发现。确实是清空了。1803也好 WIN7也好
都清空了。
他的清空原理就是调试器退出的原理。所以不触发PG.调试器退出调用(已经到R0)NtRemoveProcessDebug来移除调试对象 也就是DebugProt里的值
NtRemoveProcessDebug 的定义
NTSTATUS NtRemoveProcessDebug(IN HANDLE ProcessHandle, IN HANDLE DebugHandle);
参数1:ProcessHandle 进程句柄
参数2:调试句柄 NtCreateDebugObject 返回
XX通过这个函数来清空了DebugProt句柄。说白了就是调试器退出的原理。这样就不会触发PG.很高的手法。(个人水平不咋地。感觉这样真的很NB。)
这样一来肯定有人要问了:你是如何分析出来XX调用的NtRemoveProcessDebug。这个很简单。直接对DebugPort下写断点。ba w1 EPRPCRESS + 0X420.断下来之后 k 栈回溯。就会发现了
HOOK了NtRemoveProcessDebug R0的事就已经结束了。
DNF: HOOK KdpTrap 解决登陆的时候 WINDBG一直抛出异常 过滤是不是TASLogin.exe在抛出异常 如是的话 直接返回return STATUS_SUCCESS;
NTSTATUS TwoMachineDebugging::HookedKdpTrap(
IN PKTRAP_FRAME TrapFrame,
IN PKEXCEPTION_FRAME ExceptionFrame,
IN PEXCEPTION_RECORD ExceptionRecord,
IN PCONTEXT ContextRecord,
IN KPROCESSOR_MODE PreviousMode,
IN BOOLEAN SecondChanceException
)
{
PEPROCESS hp = PsGetCurrentProcess();
if (!_stricmp((char *)PsGetProcessImageFileName(hp), "TASLogin.exe"))
{
return STATUS_SUCCESS;
}
return OriginalKdpTrap(TrapFrame, ExceptionFrame, ExceptionRecord, ContextRecord, PreviousMode, SecondChanceException);
}
NTSTATUS TwoMachineDebugging::HookedKdpTrap(
IN PKTRAP_FRAME TrapFrame,
IN PKEXCEPTION_FRAME ExceptionFrame,
IN PEXCEPTION_RECORD ExceptionRecord,
IN PCONTEXT ContextRecord,
IN KPROCESSOR_MODE PreviousMode,
IN BOOLEAN SecondChanceException
)
{
PEPROCESS hp = PsGetCurrentProcess();
if (!_stricmp((char *)PsGetProcessImageFileName(hp), "TASLogin.exe"))
{
return STATUS_SUCCESS;
}
return OriginalKdpTrap(TrapFrame, ExceptionFrame, ExceptionRecord, ContextRecord, PreviousMode, SecondChanceException);
}
2: SharedUserData->KdDebuggerEnabled = TRUE; 这一步可以在WIDNBG里来设置。也可以用上述代码实现
3:定时器循环对KdDebuggerEnabled 设置为 1.
VOID
Pass
KdDebuggerEnabled
(
__in struct _KDPC *Dpc,
__in_opt PVOID DeferredContext,
__in_opt PVOID SystemArgument1,
__in_opt PVOID SystemArgument2
)
{
__try
{
*KdDebuggerEnabled = 0x1;
}
__except (1)
{
return;
}
KeSetTimer(&g_PassObjTimer, g_PassObjTime, &g_PassObjDpc);
return;
}
VOID
Pass
KdDebuggerEnabled
(
__in struct _KDPC *Dpc,
__in_opt PVOID DeferredContext,
__in_opt PVOID SystemArgument1,
__in_opt PVOID SystemArgument2
)
{
__try
{
*KdDebuggerEnabled = 0x1;
}
__except (1)
{
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-2-22 14:43
被kanxue编辑
,原因: