首页
社区
课程
招聘
[求助]EXCEPTION_SINGLE_STEP单步调试问题
发表于: 2009-3-10 12:51 7387

[求助]EXCEPTION_SINGLE_STEP单步调试问题

2009-3-10 12:51
7387
大家好,谢谢斑竹等热心人的帮忙,debug api 逐渐了解更多了。我正在学习单步调试。
以前我都是在相邻两条指令设置0xcc后,任何一条指令中断就将0xcc写回另一条指令,来完成多次中断。现在想幈弃这种土办法,而采用更professional的单步中断。遇到了一些麻烦。

我的处理是进入断点处理后,
    先 SuspendAllThread ,
    ct.Eip--;
    ct.EFlags |= 0x00000100;   //不知道是否只需要0x100即可?
    然后把原始指令写回
    最后SetThreadContext
等到 EXCEPTION_SINGLE_STEP 异常时候,
    再把0xcc写回去。
    接着ResumeAllThread

现在情况是断点处理后,从来没进入EXCEPTION_SINGLE_STEP 异常,
是不是我的EFlags 没设对,还是其他原因。。。请有经验的同志帮忙看看问题出在哪里
谢谢

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
我看一些汇编写的也就是
or context.regFlag,100h

但  0x00000100 应该只会修改第三位, 不至于影响其他位...
2009-3-10 12:53
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
另外我获取上下文是如下参数
ct.ContextFlags = CONTEXT_FULL;

是否需要改成CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS
2009-3-10 13:04
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
原求助贴在新手区,我想可能有些有经验的朋友可能不去那个区,所以又转这边来问问,不好意思呀
http://bbs.pediy.com/showthread.php?t=83550

大家好,谢谢斑竹等热心人的帮忙,debug api 逐渐了解更多了。我正在学习单步调试。
以前我都是在相邻两条指令设置0xcc后,任何一条指令中断就将0xcc写回另一条指令,来完成多次中断。现在想幈弃这种土办法,而采用更professional的单步中断。遇到了一些麻烦。

我的处理是进入断点处理后,
    先 SuspendAllThread ,
    ct.Eip--;
    ct.EFlags |= 0x00000100;   //不知道是否只需要0x100即可?
    然后把原始指令写回
    最后SetThreadContext
等到 EXCEPTION_SINGLE_STEP 异常时候,
    再把0xcc写回去。
    接着ResumeAllThread

现在情况是断点处理后,从来没进入EXCEPTION_SINGLE_STEP 异常,
是不是我的EFlags 没设对,还是其他原因。。。请有经验的同志帮忙看看问题出在哪里
谢谢
2009-3-10 13:59
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
5
确实比较奇怪。我用同样的方法,即ctx.EFlags |= 0x100,是可以收到EXCEPTION_SINGLE_STEP异常的。

这是log内容:

Debug event received, debug event code is : CREATE_THREAD_DEBUG_EVENT
Debug event received, debug event code is : EXCEPTION_DEBUG_EVENT
Break point exception received : 0x00401000
eflags value is : 0x00000246
Debug event received, debug event code is : EXCEPTION_DEBUG_EVENT
Single step exception received : 0x00401002
2009-3-10 16:45
0
雪    币: 7325
活跃值: (3803)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
6
ct.ContextFlags |= CONTEXT_DEBUG_REGISTERS;
直接点就:
ct.ContextFlags = 0x1003F;
2009-3-10 16:48
0
雪    币: 357
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你是在第几次中断的时候写入的单步?因为调试进程的时候系统会在DebugBreak产生第一个系统断点,那个时候只写入你要断下地方的INT3断点,然后启动完毕后再次产生中断事件的时候再进入中断处理中做你的处理,写回原来INT3断点处的内容,记得把eip-1再执行。然后设置单步,再在单步处理里设置你要断下处的INT3中断。我也是前天才开始学这个,以上的我都调试通过了。希望对你有帮助。
2009-3-15 01:53
0
游客
登录 | 注册 方可回帖
返回
//