http://115.com/file/e7sr3g82#TP
保护学习之关于恢复硬件断点第四课.rar
初学过保护之TP学习总结 第四课 关于硬件断点
驱动保护大法超级群:208668455 视频发布和交流的论坛网址
www.begin5.com “编程屋”/////////////////////////////////////////////////////////////////////////
首先感谢以下朋友:天天 爱在路上 我期待 有一天我会回来 萝卜 去年夏天 曲水 还有┌.Trojan的双机教程(已发布到begin5)
排名无先后!//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
本群学习交流建议:不要怕丢人,不要怕说错,勇于提问并互相交流问题!
我是糖衫大胸 = 唐山大兄; QQ:43880574 , 教程有疑问或者错误,欢迎交流并指出!谢谢!
///////////////////////////////////////////////////////////////////////////////////
尽信书不如无书!也不能完全信这些资料,主要是思路,否则无论怎么学都是错的!
//////////////////////////////////////////////////////////////////////////////////////////////
开始讲之前,首先声明,糖衫大胸 以后不会在群内涉及大量商业活动,以后以交流和学习技术为主,当
然在交流过程中,有的“高手”人家不愿意告诉你的时候,可以适当商业性的向对方协商是否愿意出售!
///////////////////////////////////////////////////////////////////////////////////////////////
今天我们要研究的部分是: 究竟应该怎样学习? 硬件断点 调试 + 输出 = 王道
为什么要恢复硬件断点 知识要点:
调试寄存器 DR0-DR3这四个寄存器是用来设置 断点地址的。断点的比对在物理地址转换前(异常产生时,还没有将线性地址转换成物理地址)。
由于只有0-3四个保存地址的寄存器,所以,硬件断点,在物理上最多只能有4个。
DR7是调试控制寄存器。
L0-L3(由第0,2,4,6位控制):对应DR0-DR3,设置断点作用范围,如果被置位,那么将只对当前任务有效。每次异常后,Lx都被清零。
//////////////////////////////////////////////////////////////////////////////
关于恢复硬件断点: hr hw bp send
SSDT 表中索引为 0xD5和0x55的函数
//处理硬件断点时
ULONG uNtSetContextThreadAddress;
ULONG uNtGetContextThreadAddress;
ULONG TenNtSetContextThread,
TenNtGetContextThread;
//////////////////////////////////////////////////////////////////////
// 名称: _MyNtGetThreadContext
// 功能: 两个SSDT HOOK伪造函数的中继函数
// 参数:
// 返回:
//////////////////////////////////////////////////////////////////////
static NAKED NTSTATUS Nakd_NtGetThreadContext(HANDLE hThread, PCONTEXT pContext)
{
__asm
{
jmp dword ptr[TenNtGetContextThread]
}
}
static NAKED NTSTATUS Nakd_NtSetThreadContext(HANDLE hThread, PCONTEXT pContext)
{
__asm
{
jmp dword ptr[TenNtSetContextThread]
}
}
//////////////////////////////////////////////////////////////////////
// 名称: MyNtGetThreadContext && MyNtSetThreadContext
// 功能: NtGetThreadContext与NtSetThreadContext函数被SSDT HOOK的伪造函数
// 参数:
// 返回:
//////////////////////////////////////////////////////////////////////
NTSTATUS MyNtGetThreadContext(HANDLE hThread, PCONTEXT pContext)
{
if ( _stricmp((const char*)PsGetProcessImageFileName(PsGetCurrentProcess()),DNF_EXE) )
{
return Nakd_NtGetThreadContext(hThread, pContext);
}
return STATUS_UNSUCCESSFUL;
}
NTSTATUS MyNtSetThreadContext(HANDLE hThread, PCONTEXT pContext)
{
if ( _stricmp((const char*)PsGetProcessImageFileName(PsGetCurrentProcess()),DNF_EXE) )
{
return Nakd_NtSetThreadContext(hThread, pContext);
}
//DbgPrint("Dr7:%08X\n", pContext->Dr7);
if ( pContext->Dr7 == 0x101 )
{
return Nakd_NtSetThreadContext(hThread, pContext);
}
return STATUS_UNSUCCESSFUL;
}
//////////////////////////////////////////////////////////////////////
// 名称: My_Recovery_HardwareBreakpoint
// 功能: 通过对set与get进行SSDT HOOK来恢复硬件断点
// 参数:
// 返回:
//////////////////////////////////////////////////////////////////////
NTSTATUS My_Recovery_HardwareBreakpoint()
{
KIRQL Irql;
//获取地址
uNtSetContextThreadAddress = (ULONG)KeServiceDescriptorTable->ServiceTableBase+0xD5 * 4;
uNtGetContextThreadAddress = (ULONG)KeServiceDescriptorTable->ServiceTableBase+0x55 * 4;
TenNtSetContextThread = *(ULONG*)uNtSetContextThreadAddress;
TenNtGetContextThread = *(ULONG*)uNtGetContextThreadAddress;
KdPrint(("Set地址:%0X\n",TenNtSetContextThread));
KdPrint(("Get地址:%0X\n",TenNtGetContextThread));
KdPrint(("Process:%0X \n",(ULONG)p_MyHookAddress));
KdPrint(("Thread:%0X \n",(ULONG)t_MyHookAddress));
WPOFF(); //清除CR0
//提升IRQL中断级
Irql=KeRaiseIrqlToDpcLevel();
//完成SSDT HOOK
*(ULONG*)uNtGetContextThreadAddress = (ULONG)MyNtGetThreadContext;
*(ULONG*)uNtSetContextThreadAddress = (ULONG)MyNtSetThreadContext;
//恢复Irql
KeLowerIrql(Irql);
WPON(); //恢复CR0
return STATUS_UNSUCCESSFUL;
}
[注意]APP应用上架合规检测服务,协助应用顺利上架!