首页 > 其他 > 详细

简单调试器的实现(三)

时间:2016-04-24 20:10:24      阅读:170      评论:0      收藏:0      [点我收藏+]

单步的实现

就是之前设置的TF标志位

//设置TF标志位
void SetTrapFlag() {
	CONTEXT context = {0};
	GetDebuggeeContext(&context);
	context.EFlags |= 0x100;
	SetDebuggeeContext(&context);

}

步出则是在ebp+4的地址设置断点

BOOL MoveOut()
{
    // 获取ebp
    CONTEXT    Context = {0};
    GetDebuggeeContext(&Context);
    // 获取ebp+4处保存的返回地址
    SIZE_T    addr = 0;
    if(!ReadDebuggeeMemory(Context.Ebp + 4,sizeof(addr),(LPVOID)&addr))
    {
        return FALSE;
    }
    // 设置一次性断点
    SetCCBreakPointAt(addr,SOFTTYPE_ONCE);
    return TRUE;
}

步过则是获得下一条指令长度,在下下条指令下断点

步过,获得eip下一条指令的长度,越过这条指令下断点,这样就不会进入call里面
BOOL MoveOver()
{
    CONTEXT    Context = {0};
    GetDebuggeeContext(&Context);
    SIZE_T addr = GetCoodeLen(Context.Eip) + Context.Eip;
    SetCCBreakPointAt(addr,SOFTTYPE_ONCE);
    return TRUE;
}

 

 

然后关于之前硬件断点的问题,发现设置1个字节的断点就能断下来,不过在断点恢复的时候,设置TF恢复就不能正常运行

也有点问题。

这个调试器也拖了很久没弄了,感觉放下了就很久不会弄,甚至不会在弄了,脚步不踏实,什么时候能够脚踏实地呢。

链接  http://pan.baidu.com/s/1qXYKjxU

简单调试器的实现(三)

原文:http://www.cnblogs.com/aliflycoris/p/5427868.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!