SoftICE for WIN95中文命令解说(三)
程序员文章站
2022-03-29 14:47:39
SoftICE for WIN95中文命令解说(三) Copyright (c) 1999 http://coobe.cs.hn.cninfo.net/~tianwei 命令: BPINT 作用: 在某个中断向量上下断点 语法: BPINT int-number [IF expre... 08-10-08...
softice for win95中文命令解说(三) copyright (c) 1999 http://coobe.cs.hn.cninfo.net/~tianwei 命令: bpint 作用: 在某个中断向量上下断点 语法: bpint int-number [if expression][do "command1;command2;..."] 用法: int-number : 中断向量号,从0到ffhif expression: 条件表达式,只有条件为"真"时,sof- tice才在断点处弹出do command : 当sice弹出时,自动执行的一些命令.当在硬中断和cpu异常出错的向量上下断点时,softice会在处理这个中断的过程的第一条语句时弹出.而软件中断则停在int xx处.注意:bpint只对由中断描述符表中的中断起作用(win95).如果在一个dos虚拟机(dos窗口)中下此种断点, 控制是由保护模式转到虚拟机的中断向量表中去.这时如果说停在int xxh 处, 你用f8跟下去,是一下子看不到对这个中断的实模式处理过程的,要走很远,这时可用:g @ $ 0:int-number*4 来一下子走到实模式处的处理过程. 点评: 注意! softice30的命令手册(英文版pdf格式在此处写错了!把$写成&了!)($意思是告诉softice 后跟实模式的段.以后有专门论及这些符号的文章.) 如果你是在dos窗口中用命令行调一个东西, 这时 g @ 0:intno*4也可以,这时默认的selector就是实模式,选择符存在.但如果在explorer中直接双击一个程序, 拿int 21h来说,一开头是在kernel中,就非得用 $ 不行了!另外:由于有了if 子句,可以很方便地下各种int xx断点,比如在文件打开中断功能上下断点 bpint 21 if ah==3d 命令: bpio 作用: 在输入输出端口上下断点 语法: bpio [-h] port [verb] [if expression][do "command1;command2;..."] 用法: port : 端口号verb : 进行什么样的操作时弹出,r为读;w为 写 ;rw为读写if expression: 条件表达式,只有条件为"真"时,sof- tice才在断点处弹出do command : 当sice弹出时,自动执行的一些命令.-h : 用硬件除错寄存器在vxd中下断点,只 在pentium级的芯片上才行当softice弹出时,cs:eip停在执行i/o操作的下一条指令处.如果不带参数 verb,默认为rw.注意:在win95中,若不带-h参数,则只能在ring 3中下断, 若要跟 vxd和vmm的i/o操作,请加-h.win95本身用vxd挂了很多i/o操作,用tss可以看到 点评: 可以参看后面要讲的tss命令. 命令: bpm 作用: 在内存单元上下断点 语法: bpm[size] address [verb] [debug-reg] [if expression][do "command1;command2;..."] 用法: size : 内存单元大小,b 为字节(默认);w 为 字;d 为双字.verb : 所进行的操作,r 为读;w为写;rw为读 写(默认); x 为执行.debug-reg : 除错寄存器,dr0,dr1,dr2,dr3.if expression: 条件表达式,只有条件为"真"时,sof- tice才在断点处弹出.do command : 当sice弹出时,自动执行的一些命令.当verb 为 r,w,rw时,一旦弹出,softice停在刚才发生内存操作的后一条指令处.为 x 时,停在将要执行的指令处.一般没有必要,不要带 debug-reg 参数,softice一开始是自动带dr3的,以后按顺序为2,1,0 只有当你调试一个debugger时,而此debugger也用到了drx,才需特别指定一个防止冲突.bpm断点如果下在(400000-7fffffff)内,那么只有你下断点时当前的可寻址区域( 见addr的点评)被激活才能发生中断.别的不行.但如果断点下在dll中,这个dll在多个地址区域内都存在,那么在这多个地址区域内都可能发生中断,简单的例子如kernel32.dll另外,size 参数要紧跟bpm写,成bpmd,bpmw之类. 点评: bpm用了dr3-dr0寄存器,所以最多只能设四个断点. 命令: bpr 作用: 在一个内存范围上下断点 语法: bpr start-address end-address [verb] [if expression][do "command1;command2;..."] 用法: start-address: 起始地址end-address : 终止地址verb : r 读;w 写;rw 读写;t 回溯跟踪指令 ;tw 回溯跟踪内存写if expression: 条件表达式,只有条件为"真"时,sof- tice才在断点处弹出do command : 当sice弹出时,自动执行的一些命令.bpr 用来在一段内存区域上下断点它没有 x 参数, 但可用 r 参数代替. t,tw是记录回溯跟踪的参数, 具体可见trace命令.bpr 有时会极大地降低系统效能,因为所有对断点所在页的内存操作都会被softice截获分析.如果程序中用到频繁的内存操作,机器就会相当慢.当条件满足,softice弹出时,cs:eip停在发生内存操作的那条指令上. bpr 断点是下在当前被激活的页表上,如果你下的range在物理4mb以下,断点就会在各虚拟机中,这样,bpr就对ldt,gdt,idts,页表本身不起作用.另外,vmm中0级堆栈和严重(?)内存区域(critical ar-eas)也不允许下bpr,很有可能死机.在95中,bpr只能用于ring 3,所以对ring 0的vxd无用.(v3.20) 点评: bpr 有时真的很慢,机器就象死了一样, 原因上面都说了.所以在知道内存单元的时侯最好用bpm,只有无路可走才用bpr的范围来试试.(当然也有非要用bpr 不可的地方) 命令: bprw 作用: 在某个windows程序或代码段所在的内存区域上下范围断点 语法: bprw module-name | selector [verb] [if expression][do "command1;command2;..."] 用法: module-name : windows程序的模块名selector : 选择符verb : r 读;w 写;rw 读写;t 回溯跟踪指令 ;tw 回溯跟踪内存写if expression: 条件表达式,只有条件为"真"时,sof- tice才在断点处弹出do command : 当sice弹出时,自动执行的一些命令.bprw是个在win程序的一个或多个可执行模块上下断点的比较便捷的方法实际上它就是bpr, 不信你可以下一个,再用bl 看看.它只不过比bpr更有目的性.用heap命令可以帮助使用者看module-name和selector.bprw 不用你再费心找范围.bprw 在回溯跟踪时很有用.另外,bprw 也是不能用于ring 0. 而且在跟 t 参数或和csip命令配合使用时有可能会很慢.rw参数是缺省值 点评: bprw 有时侯很管用的, 因为你有可能不知道某个程序在何时在内存中参与运行,用bprw就可以在这个程序一运行时就弹出.而且可以分不同的代码段. 命令: bpt 作用: 以前次的断点为模板,设定新的断点. 语法: bpt breakpoint_index 用法: breakpoint_index: 断点序号.(用bl可以看到)bpt 是以前次的断点为蓝本,进行修改,成为新的断点.它为使用者定新的断点提供了方便. 点评: 参见第二部分的bpe 命令 命令: bpx 作用: 在可执行语句上设定(或清除)断点 语法: bpx [address] [if expression] [do "command1;command2;..."] 用法: address : 断点所在的线性地址if expression: 条件表达式,只有条件为"真"时,sof- tice才在断点处弹出.do command : 当sice弹出时,自动执行的一些命令.bpx 用来在指令处下断点,程序一旦执行到此,softice就会弹出.当光标在代码窗口中时,直接打入bpx就会在光标所在语句处设断点,再打bpx 就取消. 当光标不在代码窗口中时,bpx 必须跟参数(地址). 地址为标准的"选择符:偏移",如果只输入偏移,当前的cs值默认为选择符.bpx 实际上是在你下的断点处加一个int 3指令, 到这条指令时就弹出来.这使得可以在一个程序中下多个断点,而不必要使用少得可怜的寄存器.但当你在rom中设断点时,softice自动用断点寄存器来设断.你也可以用bpm 命令的x参数来强迫softice用断点寄存器(drx)来设断. bpx 也可用16位代码的模块名来作地址参数, 这样,模块中每个出口函数都被设了断点. bpx 最多设256个断点.(v3.20) bpx 有个快捷键 f9,当光标在代码窗口中时,按f9就是设定(取消). 点评: bpx 可能是用得最多的断点了. 有些anti-debugger的程序就利用int 3 来作文章,看了上面的东西我想你可以闪过了吧!(不包括用drx做文章的噢!) 命令: bstat 作用: 显示某个断点的状态 语法: bstat [breakpoint-index] 用法: breakpoint-index :断点的序号,用bl 命令可以看到用bstat 来显示某个断点的状态,各种统计参数.bp # : 断点的序号.若前面有 "*" ,表示断点被禁止在total 栏目中:hits : softice每经过一次断点,计数 1breaks: 在if expression子句为真的情况下,softice 就会产生动作,要么弹出,要么记录在内存中, 不管怎样,计数 1popups: 在breaks中softice弹出的次数logged: 在breaks中sice将情况记录到内存中的次数misses: 在if expression子句为false的情况下,sice 虽然经过这个断点但没有弹出行动的次数errors: 由于if 子句中内存变量的问题或其他原因产 生的错误的次数.比如跟一个c写的程序,用变 量"if mysymbol==1"来设断,而在断点处 my- symbol 这个变量所在的内存由于释放或其他 操作而无法访问,就会产生error.在current 栏目中:hits : 当前的在if子句计算为true的情况下,但由于 bpcount宏所定的次数未到而记录下的累计数misses: 当前在if子句计算为false的情况下, 且(或) bpcount宏所定的次数未到而记录下的累计数在杂项(misc)栏目中:status: softice内部对最近一次断点进行计算的状态 代码.(错误代码)如果为0 的话,表示没有错.scode : softice最近一个内部状态代码,如果为0的话 表示没有errors.cond. : 如果断点带有附加判断(即有if expression) ,则为yes,否则为noaction: 如果断点带有附加的动作(即有do command), 则为yes,否则为no 点评: 无