首页
社区
课程
招聘
[旧帖] [原创][视频]保护学习之关于恢复硬件断点第四课 0.00雪花
发表于: 2012-2-21 18:02 2058

[旧帖] [原创][视频]保护学习之关于恢复硬件断点第四课 0.00雪花

2012-2-21 18:02
2058
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;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
瞧了一下,过于简单了,顶一下吧
2012-2-21 19:37
0
雪    币: 1644
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢分享。。
2012-2-26 23:32
0
游客
登录 | 注册 方可回帖
返回
//