[调试器的实现<控制台版>]第二章 软中断(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失效,其他断点存在。

 

转载于:https://www.cnblogs.com/DreamOfGalaxy/articles/4491999.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值