欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

调试器的实现 第二章 软中断

调试器的实现<控制台版> 第二章 软中断

第二章  软中断(CC)的实现
1.相关函数与结构
  //软中断处理部分
public:
  //设置INT3断点
  void Int3BreakPoint(DWORD BreakAddress);
  //设置INT3断点并保存首字节
  BYTE SetBreakPoint(HANDLE hProcess,LPVOID pAdd, BYTE code, BOOL bFlag = TRUE);
  //查找列表中是否已存在该地址断点
  BOOL FindInt3BPoint(DWORD BreakAddress, char *Code = NULL);
        //由硬件断点引起的实效INT3断点重设
  BOOL SetInt3BPointAgain(DWORD BreakAddress);
  //删除找到的INT3断点
  BOOL DelFindInt3BPoint(DWORD BreakAddress);
//INT3结构
struct BreakPoint 
{
  BOOL  DelFlag;
  BYTE  b_code;
  DWORD BreakAddress;  
};
//保存链表
CList<BreakPoint,BreakPoint> m_myBreakList;
2.设计思路
将下断点地址首字节改CC,并保存原字节机器码,并写入链表。触发断点后,先将首字节CC改为原字节,EIP减1。 当程序运行到断
点代码时,进入断点访问处理函数DisposeBreakException(); 在断点函数中,显示并恢复原来的第一个首字节,并置单步,其作用
是在单步异常函数中把当前地址重新设置为此断点,即此断点永久生效,并非一次性断点。

3.删除INT3断点的处理
   直接操作INT3结构体中的DelFlag  作删除标记。 代码如下
  
//多个断点下同一地址,去除INT3断点,执行硬件或内存
BOOL CMyDebugInfor::DelFindInt3BPoint(DWORD BreakAddress)
{
  POSITION pos = m_myBreakList.GetHeadPosition();
  BreakPoint BpNode;
  
  for (int i=0;i<m_myBreakList.GetCount();i++)
  {
    BpNode = m_myBreakList.GetNext(pos);
    if (BpNode.BreakAddress == BreakAddress)
    {
      //清除INT3断点
      SetBreakPoint(m_hProcess,(LPVOID)BpNode.BreakAddress,BpNode.b_code);
      //删除标记
      BpNode.DelFlag = FALSE;
      pos = m_myBreakList.FindIndex(i);
      m_myBreakList.SetAt(pos, BpNode);
      m_EpnFlag.bSetInt3Flag = FALSE;
      //m_myBreakList.RemoveAt(pos);
      return TRUE;      
    }
  }
  return FALSE;
}

4. 多种断点的特殊处理
对INT3断点和硬件执行断点在同一地址的特殊处理:
   1.当下硬件断点时,检测是否下硬件的地址是否存在于INT3断点列表,如果存在,则迫使INT3断点暂时失效,当且仅当用户删除
硬件执行断点时,INT3断点才自动生效,具体示例请见测试分析报告。
  对INT3断点和硬件访问,写入。内存访问,写入断点在同一地址的特殊处理:
2. 当下硬件访问,写入,内存访问,写入断点时,检测是否存在于INT3断点列表,存在则迫使其永久失效。<无太大作用,因为下硬
件访问,写入,内存访问,写入断点时地址一般情况下是数据段,而INT3在代码段>

   3. 对于INT3断点和内存访问,写入,硬件访问,写入断点同时存在于当前EIP时,程序执行时会断2次或多次,在此情况下和OD有
区别<OD还是只断一次>,不过会提示当前的被断下的是哪种断点。
对硬件访问,写入和内存访问,写入断点在同一地址的特殊处理:
 
4.  在此种情况下和第3种的处理一样,区别于OD的处理,程序执行时会断
2次或多次,但是程序会提示当前被断下的是那种断点。
5.  当INT3,硬件,内存所有断点下与同一个地址EIP,INT3失效,其他断点存在。

                                                              科锐五期学员    易新

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功