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失效,其他断点存在。