|
|
|
|
|
|
|
《软件调试》的示例程序
帖子发起人: 格蠹老雷 发起时间: 2008-07-31 22:44 下午 回复: 22
|
帖子排序:
|
|
|
|
2008-07-31, 22:44 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
Re: 关于《软件调试》4.3.4 按分支单步执行。
|
|
|
|
SHL,
仔细检查一下你的代码,看是不是有编码问题。我在我的机器上做了个试验,同时启用LBR和BTF,没有跟踪,LBR寄存器还是在不停记录呀。
lkd> wrmsr 1d9 3 [设置LBR和BTF位]
lkd> rdmsr 1d9
msr[1d9] = 00000000`00000003 【读回来看,验证】
lkd> rdmsr 1c9
msr[1c9] = 00000000`08000006 【读TOS寄存器】
lkd> rdmsr 1c9
msr[1c9] = 00000000`08000000 【再读TOS寄存器,看其在变】
lkd> rdmsr 1c9
msr[1c9] = 00000000`08000001
lkd> rdmsr 41 【读一个LBR栈寄存器,其内容是有效的】
msr[41] = 8060d341`8060d0c3
lkd> rdmsr 42
msr[42] = 8060b33c`8060b32e 【再读一个LBR栈寄存器,其内容也是有效的】
lkd> ln 8060d0c3
(8060d00e) nt!NtSystemDebugControl+0xb5 | (8060d466) nt!NtCreateKeyedEvent
lkd> ln 8060d341
(8060d00e) nt!NtSystemDebugControl+0x333 | (8060d466) nt!NtCreateKeyedEvent
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-08-01, 16:07 下午
|
shl
注册: 2008-07-10
发 贴: 14
|
Re: 关于《软件调试》4.3.4 按分支单步执行。
|
|
|
|
to Raymond:
我的CPU跟您的不一样。。。
我是写1D9,读1DB和1DC。。。
很奇怪。。。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-08-01, 16:08 下午
|
shl
注册: 2008-07-10
发 贴: 14
|
Re: 关于《软件调试》4.3.4 按分支单步执行。
|
|
|
|
forgot wrote: |
跑这里来问了啊,
BTF开启之后TF被视为是 Single Step On Branches,不是分支指令就不会 int1。
To Raymond:
所谓突破限制是指,hook 所有处理器的 int1 isr ,可以在中断里重新设置TF,然后根据 fs 判断进程记录一次LBR。
|
|
呵呵,你小子也来了。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-08-02, 00:10 上午
|
shl
注册: 2008-07-10
发 贴: 14
|
Re: 关于《软件调试》4.3.4 按分支单步执行。
|
|
|
|
BTF + LBR +TF(我这是需要OD来触发),Intel手册上是说BTF和TF都为1的时候
遇到分支就会产生INT1中断,于是,我们就是在ISR里读取LBR的(我这里是这么做的,fg那里的
思路应该大致相同)......我对照过了,LBR里读出来的就是程序的分支.呵
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-08-02, 10:39 上午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
Re: 关于《软件调试》4.3.4 按分支单步执行。
|
|
|
|
SHL,
那么就很正常了呀。像下面这样理解,你也许就明白了。
记录和报告异常是CPU的两种动作,LBR位用来让CPU把分支记录到LBR栈(环形寄存器缓冲区)中。BTF+TF位让CPU遇到分支时产生异常。
但以下两点值得注意:
1)LBR和BTF位是在MSR寄存器中的,TF位是在标志寄存器中的。在目前的操作系统(Windows等)实现中,MSR寄存器是全局的,标记寄存器是线程相关的。也就是说,当CPU切换线程时,并不保存和恢复MSR寄存器的内容,但却保存和恢复标志寄存器的内容。
2)TF和BTF位都是会被CPU自动清除的,也就是当CPU因为这两位而产生一次异常后,会自动将它们清除(《软件调试》96页)。这样做的原因也很明显,如果不清除,那么从分发和处理异常的代码便会不停再导致异常,CPU便死循环了。
回到你的问题,你开启了LBR,而且不关闭,那么CPU应该始终在记录分支的,但是你只有在收到中断时才去读它。因为LBR栈可记录的分支非常少,所以你只能看到它记录的OD所调试程序中的分支。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-08-02, 14:07 下午
|
shl
注册: 2008-07-10
发 贴: 14
|
Re: 关于《软件调试》4.3.4 按分支单步执行。
|
|
|
|
to Raymond:
首先非常感谢您一直给我的解答,很感谢
另外,您讲的这些我在Intel手册上和您的《软件调试》一书上都有看过
原理和道理我也明白.
关键问题是fg那边的实现思路跟我大致是一样的,只是他是用ASM写的,我是C
而他那里跟我的现象相反.不需要OD来触发TF,在ISR中也可以读到所有的分支
,不过,他是怀疑他的机器中了病毒,而此病毒刚好是在不断触发TF,也就是说我和他
只有其中一个才是正常的....呵呵...我去验证下去...
谢谢~
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-08-07, 17:56 下午
|
shl
注册: 2008-07-10
发 贴: 14
|
Re: 关于《软件调试》4.3.4 按分支单步执行。
|
|
|
|
hello~我已经可以确定我这的现象是正常的了,thx
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
|
总页数 2 第 2 页 [共有 23 条记录]
|
< 1 2 |
|
|
高端调试 » 图书 » 《软件调试》的示例程序 » Re: 关于《软件调试》4.3.4 按分支单步执行。
|
|
|
|
|
|