码迷,mamicode.com
首页 > 其他好文 > 详细

简单调试器的实现(三)

时间:2016-04-24 20:13:25      阅读:247      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!