发信人: sanvador()
整理人: CyberCowBoy(2000-08-08 20:58:36), 站内信件
|
中断断点
使用中断断点通过IDT来跟踪中断。当指定的中断与IDT不匹配时断点触发。
使用BPINT命令设置中断断点:
BPINT interrupt-number [IF expression][DO "command1;command2;..."]
interrupt-number 数字范围从0到255
IF expression 参考后面的条件断点。
DO "command1;command2;...' 参考后面的设置断点活动。
如果中断是由软件INT指令引发的,显示的指令是这个INT指令。(当执行到相应 断点的INT指令时,在指令执行之前SoftICE弹出)否则,当前的指令是中断句柄 的第一条指令。你可以通过使用IDT命令列出所有的中断和他们的句柄。
例子:使用下面的指令来设置一个断点,当从用户模式调用内核模式的例程NtCr eateProcess是触发断点:
BPINT 2E IF EAX==1E
注意:NtCreateProcess正常情况下是由NTDLL.DLL中的ZwCreateProcess调用,而 它(ZwCreateProcess)是由DERNEL32.DLL中的CreateProcessW所调用的。。在条 件表达式里,1E是NtCreateProcess的服务号。使用NTCALL命令来找到此值。
你可以使用BPINT命令来跟踪软件中断。例如,INT 21由16位Windows程序调用。 注意从V86模式产生的软件中断,并不通过它们所指定的IDT向量。在V86下执行I NT指令会产生由IDT向量0xD所处理的处理器一般性保护错误(GPF)。Windows G PF句柄辨别错误原因并将控制传递到一个句柄,由它表示指定的V86中断类型。此 过程可能将中断反映到V86模式,以通过进入V86模式的中断向量表(IVT)并调出 中断句柄而结束。在某些情况下,实模式的中断是由调出实模式中断向量来反映 (模拟)的。
在中断被反映(模拟)的情况中,你可以通过放置一个BPX断点在实模式中断句柄 的开始来跟踪它。
例子:要设置一个实模式INT 21句柄的断点,使用下面的命令
BPX *($0:(21*4))
I/O断点
I/O断点监视对端口地址的读写。当用IN或OUT指令访问端口时触发断点。SoftIC E通过使用奔腾处理器所带扩展调试寄存器来实现I/O断点。因此,设置I/O断点需 要奔腾或增强奔腾的CPU。一次最多可以设置4个I/O断点。I/O断点在用户代码( Ring-3)和内核级代码(Ring-0)中都一样有效。
注意:在Windows 95下,SoftICE依赖于I/O权限位映射,它可限制I/O端口Ring- 3级代码的跟踪。
你不能使用I/O断点跟踪由MS-DOS程序所执行的IN/OUT指令。这样的IN/OUT指令由 操作系统跟踪并模拟,所以它不产生实际端口的I/O,至少不是1:1映射。
使用BPIO命令设置I/O断点:
BPIO port-number [R|W|RW] [IF expression]
[DO "command1;command2;..."]
R,W,RW 在读(IN指令)、写(OUT指令)或两者都有时中断
IF expression 参考后面的条件断点。
DO "command1;command2;...' 参考后面的设置断点活动。
当I/O断点触发,SoftICE弹出时,当前指令是引发断点的IN或OUT之后的指令。不 象BPM断点,它不必指定范围。任何访问端口号的字节、字、或双字都会触发断点 。任何跨越此I/O断点的I/O也将触发断点。例如,如果你设置一个I/O断点在2FF 端口,端口2FE的字I/O将触发断点。
例子:使用下面的命令来设置断点,当从端口3FEH读值,并且3FEH的高2位为1时 触发断点。
BPIO 3FE R IF (AL & CO)== CO
在指令完成之后计算条件。值可能在AL、AX、或EAX中。因为除了字符串I/O指令 (很少使用)以外,所有I/O端口都使用EAX寄存器。
窗口消息断点
使用窗口消息断点来跟踪传递到一个窗口进程的特定消息或一个范围内的消息。 虽然你可以用BPX命令和条件表达式来实现相等的断点,下面的BMSG命令更容易使 用:
BMSG window-handle [L][begin-message [end-message]]
[IF expression][DO "command1;command2;..."]
window-handle 窗口建立时的返回值。你可以使用HWND命令得到窗口列表及其句 柄
L 表示窗口消息将被打印到命令窗口而不弹出SoftICE
Begin-message 单窗口消息或者是一个范围内窗口消息的最低消息号。如果你不 用end-message来指定范围,仅begin-message导致中断。
对于begin-message和begin-message来说,消息号可以用十六进制数或消息实际 的ASCII名字来指定。例如,WM_QUIT
End-message 一个范围内Windows消息的较高的消息号
IF expression 参考后面的条件断点
DO "mommand1;command2;..." 参考后面的设置断点活动
你可以使用符号名,如WM_NCPAINT来指定消息或消息范围。使用SoftICE所支持的 WMSG命令来得到窗口消息列表。如果没有指定消息或消息范围,任何消息都将触 发断点
例子:为窗口句柄1001E设置窗口消息断点,使用下面的命令:
BMSG 1001E WM_NCPAINT
SoftICE计算窗口进程的地址情况,所以在你使用BMSG的时候不用考虑地址问题。
你可以用BPX风格的断点和条件表达式来构筑一个相当的断点。用HWND命令得到窗 口过程的列表,然后使用BPX命令(仅Win32):
BPX 5FEBDD12 IF (esp->8)== WM_NCPAINT
警告:当使用原始地址(不是符号)设置断点,它必须是在当前地址情况中。
-- 无意苦争春
一任群芳妒
零落成泥碾作尘
依旧香如故
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.110.29.242]
|
|