单步的实现
就是之前设置的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
时间: 2024-10-24 00:18:49