SOFTICE 操作手册 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

    . BPM

    E HEAP32

    P SRC WMSG

    ? BPR EC HWND PAGE SS WR

    A BPRW EXIT I PAUSE STACK WW

    ADDR BPT EXP I1HERE PCI SYM X

    ALTKEY BPX F I3HERE PEEK SYMLOC XFRAME

    ALTSCR BSTAT FAULTS IDT PHYS T XG

    ANSWER C FILE LDT POKE TABLE XP

    BC CLASS FKEY LHEAP PRINT SCREEN键 TABS XRSET

    BD CLS FLASH LINES PROC TASK XT

    BE CODE FORMAT LOCALS QUERY THREAD ZAP

    BH COLOR G M R TRACE

    BL CPU GDT MACRO RS TSS

    BMSG CSIP GENINT MAP32 S TYPES

    BPE DATA H MAPV86 SERIAL U

    BPINT DEX HBOOT MOD SET VCALL

    BPIO DIAL HEAP O SHOW WL

    命令: .

    作用: 在代码窗口中定位当前指令

    语法: .

    用法: 当代码窗口可见时 .命令(点命令)使得当前的CS:EIP

    所指向的指令可见 并且高亮显示. 另外此命令也把

    SoftICE 从其他内存区域中切回原先弹出的内存区域.

    详见后面的ADDR命令.

    点评:

    当你在代码窗口中上下浏览时有可能走得很远 那么

    这时一个"." 命令会让你在下一瞬间回到SOFTICE当前

    所在的CS:EIP处再也用不着按PGUPPGDOWN很多次了!

    命令: ?

    作用: 计算一个表达式的值

    语法: ? 表达式

    用法:

    计算一个表达式的值.并以十六进制十进制带符号的

    十进制(<0时有)和ASCII值多种形式显示计算结果.

    点评:

    一个非常高级的计算器 诸如46578*1999+ESI 之类的

    计算不会再让你烦恼另外由于可以显示ASCII所以可

    以很方便地在各种数制之间察看.

    命令: A

    作用: 写入汇编代码

    语法: A [地址]

    用法:

    用SICE内置的汇编器在内存中写入汇编代码.汇编器支

    持标准的80x86指令集.包括386486PentiumPentium

    -ProMMX协处理器新版的SICE还支持AMD的3D Now!

    PIIPIII的特有指令集.汇编将在A后的地址处开始.如

    果在A后没有加地址 那么汇编将在你上次汇编结束处

    开始.如果你是第一次键入A命令且没有追加地址那么

    汇编将在当前CS:EIP处开始.另外键入A命令后 在单

    独一行指令栏中键入USE16或USE32将告诉汇编器是采

    用16位还是32位指令默认是和当前的CS寄存器的模式

    一致.

    点评:

    这是和DOS下DEBUG.EXE的用法一样的命令.一般改程序

    时用A命令写入再用CODE ON(见稍后)命令看代码记

    录原来的代码和改过的代码后再用工具软件如PCTOOLS

    HACKVIEW之类查找修改.

    命令: ADDR

    作用: 在SoftICE中显示或是切换内存区域

    语法: ADDR [内存区域句柄|过程名]

    用法:

    用来察看某一个任务的私有内存区域 或是加参数[内

    存区域句柄|过程名]在SoftICE中切换某一任务的私有

    内存区域为当前可寻址的内存区域.

    一些参数的显示:

    .HANDLE 内存区域控制块的地址

    .PGTPTR 每个任务私有页表的起址

    .TABLES 每个私有页表中的表项数目

    .MINADDR 每个任务的线性地址的起址

    .MAXADDR 每个任务的线性地址的终址

    .MUTEX VMM用于页表管理的句柄

    .OWNER 使用这块内存区域的实例的名字

    如果有多个相同名字的实例运行 ADDR带OWNER名字切

    换的话切到表中的第一个有此NAME的实例所占的内存

    区域.所以带HANDLE切换的话比较精确. 当用ADDR加参

    数后可以用上面提到过的"."命令来回到SoftICE弹出

    时所属的任务内存区域.

    点评:

    这个牵涉到CPU的保护模式寻址方式和WINDOWS 的内存

    管理由分段机构产生的32位线性地址要经过分页机构

    再转化为物理地址这要牵涉到两个表的寻址.WINDOWS

    每次切换都将每个任务的私有页表拷贝到CR3寄存器所

    指的当前页表中.而ADDR所作的和WINDOWS所作的一样.

    所以当你在一个任务中弹出时可以通过ADDR可以来看

    别的任务的私有内存区域.

    命令: ALTKEY

    作用: 改变用来呼叫SoftICE的热键

    语法: ALTKEY [ALT 字母 | CTRL 字母]

    用法:

    SoftICE默认的热键为CTRL+D 用此命令可以将热键改

    变如果每次启动机器都要改 则可以把这条命令放入

    WINICE.DAT中.

    这条命令是为了防止某些程序和SoftICE的热键相冲突

    而设的.如:ALTKEY CTRL S 将热键改为CTRL+S

    点评: 无.

    命令: ALTSCR

    作用: 切换SoftICE的视屏输出.

    语法: ALTSCR [ON|OFF]

    用法:

    如果你有双显示器 则这条命令将使SoftICE的窗口显

    示在另一台单显上.注意是老式的单显不是VGA单显.

    实际上在启动WINICE时可用参数/M强迫SoftICE用单显

    来显示.也可在WINICE.DAT中加入初始化串.在WIN95中

    用SoftICE自带的VIDEOSETUP可以很方便地设定.

    例:ALTSCR ON 将使输出改变到单显上.

    点评:

    这条命令将使SoftICE同一些老显卡兼容 也使调试变

    得方便试想一台显示器显示正常的图像 另一台来显

    示跟踪屏幕免去了按F4看原画面的步骤 在某些场合

    还是用得上的. 以前的WDEB386调试器就非要双监视器

    才能工作.而SoftICE只要一台显示器就行了这是个很

    大的进步但为了和老传统兼容 它也提供了这个命令

    方便用户.

    命令: ANSWER

    作用: 自动监控通讯端口及将输出转移到MODEM

    语法: ANSWER [on [com-port] [baud-rate] [i=init] | off]

    用法:

    此命令可以使SoftICE监控通讯端口 并将输出改变到

    一台远程的PC机上 此远程PC机必须运行 SERIAL.EXE

    (或SERIAL32.EXE).当SoftICE检测到远程PC上SERIAL.

    EXE发来的特定信息 就弹出 告诉你现在将连上远程

    PC然后再退出窗口联接完成.

    一些参数:

    .COM-PORT 串行通讯口默认为COM1

    .BAUD-RATE 1200 2400 4800 96001920023040

    288003840057000115000

    其中38400为默认波特率.

    .I=INIT MODEM的初始化字符串.

    点评: 无没有用过不知道:-(

    命令: BC

    作用: 清除一个或多个断点

    语法: BC list | *

    用法: 清除断点后用BL命令就看不到断点列表 且被清除的

    断点不再起作用.

    参数:

    list: 可以是将要清除的一系列断点中间用空格或逗

    号隔开.

    * : 清除所有的断点.

    点评: BC==Breakpoint Clearing

    命令: BD

    作用: 使一个或多个断点失效

    语法: BD list | *

    用法:

    使某个断点失效不同与 BC 命令的清除暂时失效的断

    点可以用 BE 命令来恢复.而 BC 命令是彻底清除.

    参数:

    list: 可以是单个也可以是一系列断点 中间用空格

    或逗号隔开.

    * : 禁止所有的断点.

    点评: BD==Breakpoint Disablling

    命令: BE

    作用: 使一个或多个断点恢复有效

    语法: BE list | *

    用法:

    用来恢复前次用 BD 命令使之失效的断点. (每当新定

    义断点或编辑断点时系统自动将其置为有效)

    参数:

    list: 可以是单个也可以是一系列断点 中间用空格

    或逗号隔开.

    * : 恢复所有的断点.

    点评: BE==Breakpoint enablling

    命令: BH

    作用: 在SoftICE历史数据库中显示或是选择曾经设过的断点

    语法: BH

    用法:

    用BH命令后SoftICE将显示一个表每一行是一个断点

    都是以前使用者曾经下过的断点 这时可以用上下光

    标键来定位用INSERT键选择再用ENTER键来确定. 用

    ESC键取消.SoftICE只记录最近的32个断点. 而且只在

    WIN95正常退出后记录(记录到WINICE.BRK中) 这样就

    有一个问题.如果你在MSDOS.SYS配置中是BootGUI=1的

    话(即最正常的启动方式)当你SHUT DOWN机器时控制

    并不回到SoftICE手中就无法记录刚才的断点.这时只

    有改为BootGUI=0.

    点评:

    注意:SoftICE只在SHUT DOWN时记录如果你用"重新启

    动并切换..."那是不行的.至少在我的V3.20是不行的

    .而且如果你"重新启动并切换..." 再用EXIT命令想

    退回到WIN95很容易出现VxD联接错.因为这样 WINICE

    并没有完全退出内存用 MEM.EXE可以看到这点.所以

    SoftICE的使用者最好在MSDOS.SYS中将上面所说的Boo

    -tGUI置为0.如果怕这样用多重配置的话还要每次开机

    敲一个WIN可以在AUTOEXEC.BAT中改动加入WIN.COM.

    (可不要在WINICE.EXE后再加WIN.COM!画蛇添足!)

    若用SoftICE次数不多的话 可以每次启动WINDOWS后

    再重新启动并切换到MS-DOS方式再打WINICE.EXE 这

    样也可以的. BH的好处是可以省去纸笔 下次重调试

    这个程序时不用再挖空心思想断点了.

    命令: BL

    作用: 显示当前所设的断点

    语法: BL

    用法:

    BL 命令显示当前所有断点的序号 (这个序号被BC BE

    BD 等命令所用)类型是否被禁止等信息.如果是被禁

    止的断点会在序号后跟一个"*"号.比如用上面提到的

    BD 命令会产生这种效果)

    点评: BL==Breakpoint listing

    命令: BMSG

    作用: 在WIN95的消息上下断点

    语法: BMSG window-handle [L] [begin-msg [end-msg ]]

    [IF expression][DO "command1;command2;..."]

    用法:

    window-handle: 消息发向的窗口句柄

    begin-msg : 消息标识字的范围如果没有end-msg

    那么只在begin-msg上下断点 否则

    在区域内所有消息都会被下断点

    end-msg : 见上.

    IF-expression: 表达式的值为真时SoftICE才弹出.

    DO "command1;command2;...":

    当到达断点时执行的一系列SoftICE

    命令.

    L : 表示不弹出SoftICE而是在命令窗口

    中记录WIN95消息.

    上面只有窗口句柄是必需的其他都是可选项. 如果没

    有指定在哪个MSG上下断点 那么所有发向该窗口的消

    息都会被拦截.窗口句柄可以用HWND命令来观看MSG标

    识符可以用 WMSG 命令来察看可以是16进制的数 也

    可以用习惯的书写方式如:WM_CREATE.SoftICE弹出后

    会停在处理该消息的过程的第一句代码上.

    点评:

    BMSG=(set)Breakpoint on MeSsaGe

    WINDOWS本身是由消息驱动的 所以跟踪一个消息会得

    到相当底层的答案我主页上一篇"修改RICHWIN4.3"的

    文章就是一个例子.

    命令: BPE

    作用: 编辑一个已存在的断点.

    语法: BPE index_number

    用法:

    index_number: 断点的序号用 BL 命令可以看到.

    用BPE命令可以很方便地修改一个已经存在的断点 但

    要注意一点: BPE 在执行时会先将你所要修改的断点

    清除然后再将改过的使能如果你在修改时按ESC键退

    出修改那么原先的断点也就不存在了 修改错误的结

    果也是一样的.原先的断点消失.

    点评: 参见后面的 BPT 命令.

    命令: BPINT

    作用: 在某个中断向量上下断点

    语法: BPINT int-number [IF expression]

    [DO "command1;command2;..."]

    用法:

    int-number : 中断向量号从0到FFH

    IF 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 : 除错寄存器DR0DR1DR2DR3.

    IF expression: 条件表达式只有条件为"真"时Sof-

    tICE才在断点处弹出.

    Do command : 当SICE弹出时自动执行的一些命令.

    当verb 为 RWRW时一旦弹出SoftICE停在刚才发生

    内存操作的后一条指令处.为 X 时停在将要执行的指

    令处.一般没有必要不要带 debug-reg 参数SoftICE

    一开始是自动带DR3的以后按顺序为210 只有当你

    调试一个DEBUGGER时而此DEBUGGER也用到了DRx才需

    特别指定一个防止冲突.

    BPM断点如果下在(400000-7FFFFFFF)内那么只有你下

    断点时当前的可寻址区域( 见ADDR的点评)被激活才能

    发生中断.别的不行.但如果断点下在DLL中这个DLL在

    多个地址区域内都存在那么在这多个地址区域内都可

    能发生中断简单的例子如KERNEL32.DLL另外size 参

    数要紧跟BPM写成BPMDBPMW之类.

    点评: 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 参数代替. TTW是记录回溯跟踪的参数 具体

    可见TRACE命令.BPR 有时会极大地降低系统效能因为

    所有对断点所在页的内存操作都会被SoftICE截获分析

    .如果程序中用到频繁的内存操作机器就会相当慢.

    当条件满足SoftICE弹出时CS:EIP停在发生内存操作

    的那条指令上. BPR 断点是下在当前被激活的页表上

    如果你下的RANGE在物理4MB以下断点就会在各虚拟机

    中这样BPR就对LDTGDTIDTs页表本身不起作用.

    另外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每经过一次断点计数+1

    Breaks: 在IF expression子句为真的情况下SoftICE

    就会产生动作要么弹出要么记录在内存中

    不管怎样计数+1

    Popups: 在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否则为No

    Action: 如果断点带有附加的动作(即有DO command)

    则为Yes否则为No

    命令: C

    作用: 比较内存中两块区域的内容

    语法: C start-address l length start-address-2

    用法:

    start-address : 第一块内存区域的开始地址

    length : 字节长度

    start-address-2: 第二块内存区域的开始地址

    如果比较结果不同将显示不同的部分和它们的地址

    点评: 无

    命令: CLASS

    作用: 显示WINDOWS的类的信息

    语法: CLASS [-x][task-name]

    用法:

    task-name: 当前的正在机器中运行的16或32位任务名

    -x : 显示CLASS(类)的完整结构.

    Windows 95在一个16位的模块中维护着标准的WINDOWS

    类.而且它为每个进程分别维护着除标准类以外的类.

    每当程序注册一个新的WINDOWS类时 信息被放入以下

    两个地方中的一个:

    1.任务全局列表放该进程所有模块都可以存取的类(用

    CS_GLOBAL风格)

    2.任务私有列表放只有申请该类的模块才能存取的类.

    当任何一个进程想做一个WINDOWS标准类的话如LIST-

    BOX它会在任务特定的系统冗余列表中得到一个拷贝

    这样就不会影响到WINDOWS本身. 所以当用CLASS命令

    时可以看到以下3个分类:(用虚线隔开)

    .任务私有列表

    .任务全局列表

    .系统冗余列表

    输出的各项参数:

    Class Handle : 类句柄.

    Class Name : 类的名字 如果注册时没有名字

    那么显示原子名

    Owner : 注册此类的模块

    Window Procedure: 处理该类的过程

    Style. 类的风格

    点评: 无

    命令: CLS

    作用: 清除命令窗口中的字符

    语法: CLS

    用法:

    CLS 清屏命令将清除命令窗口中显示的数据 并定位

    光标到命令窗口的左上角. (如果光标原先就在命令窗

    口中的话)

    点评: 无

    命令: CODE

    作用: 显示指令码

    语法: CODE [ON | OFF]

    用法:

    CODE ON 将显示指令的机器码

    CODE OFF 将不显示指令的机器码

    CODE 不带参数将显示当前是ON 还是 OFF

    点评:

    非常有用的由于安装SoftICE时默认为CODE OFF所以

    有必要打开看到了机器码就可以记录下来以便修改.

    命令: COLOR

    作用: 显示或修改屏幕颜色

    语法: COLOR [normal bold reverse help line]

    用法:

    normal : 普通字符的前/背景颜色默认为07h(灰/黑)

    bold : 粗体字符的前/背景颜色默认为0Fh(白/黑)

    reverse: 反象显示的字符的前/背景颜色 默认为71h

    (蓝/灰)

    help : HELP命令提示条的前/背景颜色 默认为30h

    (黑/青)

    line : SoftICE各个窗口分界线的前/背景颜色 默

    认为02(绿/黑)

    这些参数采用CGA的标准格式即0-3位为前景色4-6位

    为背景色这样就有16种前景色8种背景色:

    0 黑; 1 蓝; 2 绿; 3 青; 4 红; 5 品红;

    6 棕; 7 灰; 8 深灰; 9 浅蓝; A 浅绿;

    B 淡青; C 浅红; D 淡品红; E 黄; F 白

    点评: 默认的颜色已经很好了不要改得乱七八糟噢!

    命令: CPU

    作用: 显示寄存器内容

    语法: CPU [-i]

    用法:

    CPU 命令显示所有的CPU 寄存器的内容.

    (普通控制除错段)

    点评: 不用再装其他检测CPU的小软件了:)

    命令: CSIP (16位程序才有用)

    作用: 为所有断点设定一个界限(CS:EIP在其内)(16位程序)

    语法: CSIP [off | [not] start-address end-address | Windows-module-name]

    用法:

    off : 关闭CS:EIP的界限检查

    not : 在所定义的模块之外的区域断

    点才有效

    start-address : 内存区域起始地址

    end-address : 内存区域结束地址

    Window-module-name : 用 WINDOWS模块所在区域来代

    替地址界限.

    CSIP 不带参数将显示当前状态.

    对于32位程序这个命令没有用.请用带IF 参数的断点

    命令代替.当然WIN95下也有一些老的16位程序(16位模

    块这时CSIP就能派上用场.

    命令: DATA

    作用: 显示另一个数据窗口

    语法: DATA [window-number]

    用法:

    window-number: 所要选择的窗口号0123

    SoftICE最多支持4个数据窗口.每一个窗口可以独立按

    自己的格式显示数据. 但同一时刻只能显示一个窗口.

    如果用DATA窗口不带任何参数 将按0123的次序显

    示各个窗口中的内容.在数据窗口的右上角的横线上有

    窗口序号的提示.

    点评: 可以很方便地对多个目标的进行观察

    命令: DEX

    作用: 在数据窗口中显示(或赋予)某个表达式

    语法: DEX [data-window-number [expression]]

    用法:

    data-window-number: 即DATA命令中所讲的0123号

    数据窗口

    DEX 命令可以为每一个数据窗口赋予一个表达式每次

    SoftICE弹出该表达式就被重新计算 并显示在相应的

    数据窗口中.这对某些指针非常有用. 指针可以放在寄

    存器中或是在内存变量中如下二例:

    DEX 0 SS:ESP 每次SoftICE弹出 就在0号数据窗口中

    显示堆栈的值

    DEX 1 @pointervariable 每次SoftICE弹出 就在1号

    窗口中显示由pointervariable指针所指的内存单元的

    内容.(@ 操作符后有论述).

    用DEX不带参数将显示当前在各个数据窗口中所赋予的

    表达式. 用 DEX data-window-number(不跟表达式)将

    取消前次赋予窗口的表达式.

    点评: 相当于自动化的D命令.

    命令: DIAL

    作用: 将控制台重定向到MODEM

    语法: DIAL [on [ com-port] [ baud-rate] [i=init-string] [p=number] | off]

    用法: COM-PORT : 串行通讯口默认为COM1

    BAUD-RATE: 120024004800 9600 19200 23040

    2880038400(默认)57000115000

    I=INIT : MODEM的初始化字符串.

    p=number : 电话号码

    DIAL 命令通过拨号与远程电脑取得联系 远程电脑必

    需正在运行SERIAL.EXE且在等待对方拨号.一旦联接完

    成SoftICE的的输入将来自远程计算机输出也重定向

    到远程计算机.本地计算机除了激活的热键外不接收其

    他对SoftICE的输入.当远程机结束调试后用DIAL OFF

    来挂断MODEM.

    点评:

    前次的ANSWER命令是等远程机拨号过来而DIAL是拨过

    去.有机会试一下这两个命令就好了.

    命令: E

    作用: 修改内存单元

    语法: E[size] [address [data-list]]

    用法:

    size : B 字节;W 字;D 双字;S 短实型;L 长实型

    ;T 10字节的实型

    data-list: 要修改的值(和size类型一致) 可用单引

    号或双引号来输入字符串.

    如果键入没有data-list参数的E 命令 光标将切换到

    数据窗口并定位到所指定的内存单元等待使用者相应

    的操作.如果加跟data-list参数则内存单元立刻被修

    改为所指定的值.数据窗口当前如果不可见 则键入E

    命令将使之可见.在修改中可以用TAB键在ASCII与十六

    进制方式之间切换.

    点评: 无

    命令: EC

    作用: 进入或退出代码窗口

    语法: EC

    用法:

    EC 命令使得光标在代码窗口和命令窗口之间切换. 如

    果代码窗口当前不可见则键入 EC 命令后将自动可见

    当光标在代码窗口中时使用者可以利用 SoftICE的几

    项快捷功能:

    1.可以在光标处设断点直接打BPX不跟地址更方便的

    是按F9快捷键再执行一遍将清除当前所在的断点

    2.可以用HERE 命令来设个临时断点 所谓临时断点好

    象DEBUG中的G命令也可用F7快捷键来实现.

    3.在代码窗口中时也可用上下光标键PageUpPageDn

    来翻页上下浏览.

    另外当用户调试源文件时可以用:

    Ctrl+Home 到源程序的第一行

    Ctrl+End 到源程序的最后一行

    Ctrl+左右光标 水平察看源程序

    点评: 实际上可以用Ctrl+光标Ctrl+PgUpCtrl+PgDn来直接翻页

    命令: EXIT

    作用: 强行退出DOS程序或WINDOWS程序

    语法: EXIT

    用法:

    这个命令在PDF手册中说95已经不被支持 实际上还是

    有用的. 特别是当开个DOS VM跑时用EXIT退出还是偶

    尔会用到.EXIT实际上是强行执行一个INT 21h AH==4C

    所以在DOS VM和保护模式的ring3还是有可能正常退出.

    只是有可能而已.

    点评: 在WIN95(Protected)下除非你很肯定 否则不要用EXIT.

    一不小心你的机器将会死得很难看!

    命令: EXP

    作用: 显示DLL中的出口函数

    语法: EXP [[module!][partial-name]] | [!]

    用法:

    module! : 对所指定的模块列出出口函数(注意要

    加 ! 惊叹号)

    partial-name: 指定出口函数的前几个字符 可以用?

    来做替代不定字符. (注意要跟紧前面

    的module!)

    ! : 只跟! 表示列出SoftICE当前已加载出

    口函数表的模块.

    WIN95中SoftICE自动加载KERNELUSERGDI的出口函数

    表.你也可以通过WINICE.DAT或SoftICE 的LOADER (加

    载器)来加载更多的出口函数列表.

    点评:

    比较常用的DLLsDRVs都在WINICE.DAT中有了 用户只

    要修改为相应的路径就能每次开机自动带入.这样带来

    的好处是:

    1.可以在反汇编时直接看到调用接口.

    2.可以直接在函数上下断点

    命令: F

    作用: 填充某一块内存区域

    语法: F address l length data-list

    用法:

    length : 字节长度

    data-list: 所要填的数据. 可以是用单引号或双引号

    括起来的字符串

    执行F 命令将向所指定的内存区域填充length 长度的

    数据如果数据不够长度将重复数据直到达到长度为

    止.

    点评: 无

    命令: FAULTS

    作用: 打开或关闭错误跟踪功能

    语法: FAULTS [on | off]

    用法:

    FAULTS 命令将打开或关闭SoftICE的错误跟踪功能.

    不加参数将显示当前的开关状态.

    点评:

    由于SoftICE做为一个DEBUGGERFAULTS 默认为ON 所

    以一旦CPU有非法指令SoftICE就会不停地弹出 让你

    知道错在哪里实际在工作中这样的情况如果太频繁地

    发生最好将其置为OFF.我一般将其置为ON 当发生非

    法指令时再手工置为OFF.你也可以在WINICE.DAT 中一

    开始就置其为OFF. 初学者一般不知道有这个命令 一

    旦发生非法指令除了按R键只有傻站着;)

    命令: FILE

    作用: 显示或切换当前源文件

    语法: FILE [[*]file-name]

    用法:

    FILE 命令常用来辅助在源文件中没有符号表的地方下

    断点. 用FILE命令将所需的源文件显示在代码窗口中

    用SS 命令查找一下再用BPX或F9来下断点.

    如果加文件名参数则所选的文件变成当前文件 并被

    显示在代码窗口中. 如果没有文件名参数则显示当前

    的源文件(如果当前有的话).如果加 * 则列出当前符

    号表中所有源文件. 在WIN95中用FILE 加文件名同时

    也切换内存地址内容.

    点评:

    一般用于高级编程工具的辅助调试如C语言等.不过这

    些编程工具已经内置DEBUGGER所以就看个人习惯了.

    命令: FKEY

    作用: 显示或修改当前快捷键定义

    语法: FKEY [function-key string]

    用法:

    function-key: 快捷键:

    F1 - F12 :

    SF1 - SF12 : Shift键加F1 - F12

    CF1 - CF12 : Ctrl键加F1 - F12

    AF1 - AF12 : Alt键加F1 - F12

    string : 一个或多个SoftICE的命令.

    命令前加 ^ 表示在按快捷键时不显示

    相应的命令内容.命令后加;代表回车.

    FKEY 后只跟function-key而不跟string将取消该快

    捷定义.除了用FKEY命令可以定义快捷键外用SoftICE

    的LOADER也能做到这一点

    默认快捷键清单:

    F1=h; F2=^wr;

    F3=^src; F4=^rs;

    F5=^x; F6=^ec;

    F7=^here; F8=^t;

    F9=^bpx; F10=^p;

    F11=^G @SS:ESP; F12=^p ret;

    SF3=^format; CF8=^XT;

    CF9=TRACE OFF; CF10=^XP;

    CF11=SHOW B; CF12=TRACE B;

    AF1=^wr; AF2=^wd;

    AF3=^wc; AF4=^ww;

    AF5=CLS; AF8=^XT R;

    AF11=^dd dataaddr->0;

    AF12=^dd dataaddr->4;

    CF1=altscr off; lines 60; wc 32; wd 8;

    CF2=^wr;^wd;^wc;

    点评: 无

    命令: FLASH

    作用: 在 P 和 T 命令执行过程中刷新Windows 屏幕

    语法: FLASH [on | off]

    用法:

    如果将FLASH 置为 ON 则在执行T或P命令时SoftICE

    将刷新一下Windows 屏幕这在调试一个直接对显存操

    作的程序时特别有用.在一般情况下当用 P 命令跨过

    一个CALL 时而此 CALL 又调用显示驱动程序时Sof-

    tICE才重新刷新屏幕.

    FLASH 命令不带参数将显示当前状态.默认FLASH OFF.

    点评: 无

    命令: FORMAT

    作用: 改变数据窗口的显示格式

    语法: FORMAT

    用法:

    FORMAT 命令用来改变数据窗口的显示格式.

    SoftICE有快捷键 Shift-F3 来代替FORMAT.

    显示格式将按 字节字双字短实型长实

    型10字节实型循环.

    点评: 参见 D DATA 命令.

    命令: G

    作用: 执行到某一地址

    语法: G [=start-address] [break-address]

    用法:

    =start-address: 开始地址

    break-address : 中断地址

    G 命令不带参数将从SoftICE中返回.如果带参数break-

    address则SoftICE将在所指定的地址处下一个一次性

    断点; 如果带=start-addressSoftICE 将从指定的地

    址处开始执行否则从当前CS:EIP处执行. 程序中其他

    的断点(非G命令下的断点)照样起作用. 无论是谁先弹

    出都将清除G 命令所下的一次性断点.

    G 命令不带参数类似于 X 命令.

    G 命令在Windows95中使用除错寄存器 如果除错寄存

    器用完则用INT 3.

    点评: 由于G 命令缺省用DRx所以有时可以对付一些在INT 3上作手脚的程序.

    命令: GDT

    作用: 显示全局描述符表

    语法: GDT [selector]

    用法:

    selector: 指定GDT选择器

    GDT 命令将显示全局描述符表的内容.如果加选择符参

    数则只显示此选择符所指的描述符.

    输出:GDT 的线性基址和长度将显示在输出数据的顶行

    输出数据的每一行内容的说明:

    value: 最低两位即描述符特权级

    type : 描述符类型如下:

    Code16 : 16位代码描述符

    Data16 : 16位数据描述符

    Code32 : 32位代码描述符

    Data32 : 32位数据描述符

    LDT : 局部描述符表描述符

    TSS32 : 32位任务状态段描述符

    TSS16 : 16位任务状态段描述符

    CallG32: 32位调用门描述符

    CallG16: 16位调用门描述符

    TaskG32: 32位任务门描述符

    TaskG16: 16位任务门描述符

    TrapG32: 32位陷肼门描述符

    TrapG16: 16位陷肼门描述符

    IntG32 : 32位中断门描述符

    IntG16 : 16位中断门描述符

    Reserved: 保留的描述符

    base : 描述符中的段基址

    limit: 描述符中的段界限

    DPL : 描述符特权级0123

    present bit: P 或 NP 表示该段是否在内存中

    segment attributes: 段特性:

    RW: 数据段可读写

    RO: 数据段只读

    RE: 代码段可读可执行

    EO: 代码段只可执行

    B: TSS(任务状态段)忙置位

    ED: 数据扩展方式

    参见 LDT.

    点评:

    这段翻译并不完全用PDF手册上的.如"selector" 原指

    选择符(器)用来指向描述符表中的描述符 而 PDF中

    type 的说明全用到 selector说的意思虽是一样但和

    别的文献矛盾故认为不妥将其翻译成descriptor 即

    描述符.实际上可以看出一个选择符指向一个描述符

    两者是一致的.描述符类型实际上也就是指向它的选择

    符类型.

    命令: GENINT

    作用: 强行产生一个中断

    语法: GENINT [nmi | int1 | int3 | interrupt-number]

    用法:

    interrupt-number: 对Windows95来说0-5fh

    GENINT强行产生一个中断用于SoftICE和别的DEBUGGER

    协作的时侯如:GENINT nmi 将使SoftICE将控制返还给

    CodeView For Dos.(对其他DEBUGGER请尝试0123)

    GENINT还用于测试中断例程.但SoftICE不检测一个中断

    是否有效它只是摹拟中断的产生所以当用此命令时要

    注意相应的中断例程是否存在.

    点评: 无

    命令: H

    作用: 显示帮助信息

    语法: H [command]

    用法:

    键入 H 命令不带任何参数将显示所有命令的帮助. 要

    获得详细的帮助在 H 后加命令名就可.详细的帮助将

    包括命令的描述命令的语法和例子.

    点评:

    H 命令可以很方便地帮助使用者查询SoftICE的命令.

    实际上在命令窗口的底部有一个状态条它提供的实时

    帮助也是很有用的.

    命令: HBOOT

    作用: 系统重新启动

    语法: HBOOT

    用法:

    HBOOT 将重新启动计算机.等同于按 Ctrl+Alt+Del 组

    合键.HBOOT 一般都能成功只有特殊情况下(某些插卡

    需要重加电)才用机器上的RESET或POWER键.

    点评:

    HBOOT 让我想到两件事:

    1以前学微机时老师老是盯着我们唯恐我们乱启动

    机器.想起来真是不寒而栗 好象是我们的过错一样.

    可机器明明死了嘛不重新启动怎么行?

    2有大部分品牌机上没有RESET键 死机就按POWER键

    按得老板倒抽凉气.:)

    命令: HEAP

    作用: 显示Windows全局堆

    语法: HEAP -L [free | module-name | selector]

    用法:

    -L : 只显示含局部堆的全局堆入口

    module-name: 模块名.

    selector : LDT 选择符

    HEAP FREE 将显示空闲的全局堆.

    HEAP 跟模块名将只显示由指定的模块拥有的全局堆入

    口. HEAP 跟LDT 选择符将只显示与此选择符相应的全

    局堆入口. HEAP 不带参数将显示整个全局堆的情况.

    输出:

    selector or handle: 选择符符或句柄.

    address : 32位虚拟地址

    size : 堆的大小(字节)

    module name : 模块名

    --------------------------------

    type : 全局堆的类型

    code : 不可丢弃的代码段

    code D : 可丢弃的代码段

    Data : 数据段

    ModuleDB : 模块数据基础段

    TaskDB : 任务数据基础段

    BurgerM : "三明治"(就是堆本身)

    Alloc : 被动态分配的内存

    Resource : Windows 资源

    --------------------------------

    额外信息:

    如果某全局堆的入口是代码段或数据

    段则会显示该段在.EXE中的段号.如

    果某全局堆的入口是Windows资源则

    会附加显示如下资源类型:

    --------------------------------

    UserDef(用户自定义);Icon(图标);

    String(字符串); Accel(快捷键);

    IconGrp(图标组);Cursor(光标);

    Menu(菜单);FontGrp(字体组);

    ErrTable(错误表);NameTabl(名字表);

    Bitmap(位图);Dialog(对话框);

    Font(字体);CursGrp(光标组)

    --------------------------------

    点评:

    PDF 手册中称堆本身为Burger-->"三明治"(碎肉夹饼)

    很贴切堆本来就是乱七八遭.

    命令: HEAP32

    作用: 显示Windows全局堆

    语法: HEAP32 [hheap32 | task-name]

    用法:

    hheap32 : 由HeapCreate()返回的堆句柄.

    task-name: 32位任务的名字.

    HEAP32 不带参数显示32位进程的堆的情况:

    .KERNEL32 缺省系统堆.

    .进程用HeapCreate()申请的私有堆.

    .两个由VMM产生的Ring-0级的堆.第一个是换页锁定的

    堆第二个是可换页的堆.

    .一个属于所有虚拟机的Ring-0堆.

    如果加上进程名SoftICE将显示所有该进程的缺省堆

    且地址内容也切换到该进程中.如果加上堆的基地址而

    不是进程名SoftICE将显示该进程的非缺省堆.

    WINDOWS 95的调试版还提供了额外的调试信息想要用

    SoftICE看到这些信息必须:

    .对于KERNEL32 Ring-0堆必须安装有SDK除错版.

    .对于VMM Ring-0堆必须安装VMM的DDK除错版

    输出信息(HEAP32):

    HeapBase : 堆的基址

    MaxSize : 堆可增长的最大范围 在此范围内堆无需

    再创建一个新段.

    Committed: 以千字节为单位当前存在于物理内存中的

    被保证的内存大小

    Segments : 堆中段的数量. 当堆增长超出段所能容纳

    的范围就建立一个新段

    Type : 堆的类型:

    --------------------------------

    Private: 由应用程序建立的Ring-3堆

    System : KERNEL32建立的Ring-3堆

    Ring0 : VMM建立的Ring-0堆

    VMM## : 由VMM建立的为特定虚拟机

    存储数据的堆.

    --------------------------------

    输出信息(HEAP32 带参数):

    Address: 堆元素的地址.

    Size : 以字节为单位堆元素的长度.

    Free : 如果堆元素是空闲的块则会显示"FREE"否

    则不显示.

    点评: 在SoftICEv3.20实际操作上和手册说的中有些许不同.

    命令: HERE

    作用: 运行到当前光标所在行

    语法: HERE

    用法:

    HERE 命令让程序一直走到光标所在行再停下来.注意:

    只有当光标在代码窗口中时才有效.如果代码窗口不可

    见或光标不在代码窗口中则请用 G 命令代替.也可用

    EC 命令将光标移到代码窗口中去再用 HERE.

    HERE 命令有个快捷键 F7.将光标定位到你想让程序暂

    停的指令处按下F7 程序将在此处设一个一次性断点

    .程序中其他非一次性的断点照样起作用. 无论是谁先

    弹出都将清除 HERE 所下的一次性断点.和G命令一样

    HERE 命令尽量采用除错寄存器DRx 只有用完时才用

    INT 3

    点评: 无.

    命令: HWND

    作用: 显示窗口句柄的信息

    语法: HWND [-x][hwnd | [[level][process-name]]

    用法:

    level : 窗口等级号码.0 是最高级.1 其次等

    等.窗口等级代表了父窗口和子窗口的

    关系.

    -x : 显示窗口的冗余信息.

    hwnd : 窗口句柄.

    process-name: 任何当前进程名

    如果指定了窗口句柄就无需指定等级 进程名等其他

    参数SoftICE将显示所指定窗口句柄的信息.

    输出:

    Class Name : 此窗口所属类的名称或类的原子.

    Window Procedure: 窗口函数.

    点评: 窗口句柄很有用的.(废话!)

    命令: I

    作用: 从输入/输出(I/O)端口读入数据

    语法: I[size] port

    用法:

    size: B 字节(默认);W 字;D 双字

    port: 端口地址.

    I 命令在大多数情况下是作一个I/O输入指令 获取真

    实的硬件端口的数据. 在虚拟端口的情况下取得真实

    值和应用程序所见到的虚拟值可能不同. 对于 21h 和

    A1h 端口SoftICE是例外它不进行读取而是返回So-

    ftICE弹出时的值.

    点评: 参见 O 命令.

    命令: I1HERE

    作用: 遇到内嵌的INT 1指令时激活SoftICE

    语法: I1HERE [on | off]

    用法:

    I1HERE 命令使SoftICE在遇到程序中内嵌的INT 1指令

    时弹出.I1HERE在调试程序时需在某处暂停时特别有用

    .在SoftICE弹出之前 SoftICE会检查当前是否有一条

    INT 1指令在程序中.如果没有的话SoftICE将不弹出.

    在程序要暂停的指令之前加一句INT 1 就能做到这一

    点.SoftICE弹出时EIP 会停在INT 1的下一条指令后.

    I1HERE 不带参数将显示当前I1HERE的状态.缺省为OFF

    I1HERE 在与如BoundsChecker 之类的调试工具分工协

    作时很有用因为BoundsChecker用到 INT 3为了防止

    冲突应使用INT 1. 另外VMMWindows内存管理的VxD

    在Windows出现某些严重错误时会在严重错误返回前执

    行一个INT 1指令.如果此时I1HERE 为ON时 你就能跟

    踪这类错误. 如由VMM因换页错误而产生INT 1 时寄存

    器的值如下:

    .EAX = 错误地址.

    .ESI 指向一个ASCII字符串(信息).

    .EBP 指向一个CRS(在DDK的VMM.INC中定义的客户寄

    存器结构)

    点评:

    基础信息: INT 1 实际上是单步中断的处理例程. CPU

    在检测到 TP 标志为1时(TP是由DEBUGGER设的) 就自

    动进行这一例程. DEBUGGER 们挂接这个中断例程进行

    一些诸如显示当前寄存器值等操作并等待用户进一步

    的指令. 在程序中直接用 INT 1指令也能达到效果.

    SoftICE不象DOS下的DEBUG.EXE一碰到 INT 1 就中断

    缺省是不中断的只有当I1HERE 为 ON 时才中断.

    命令: I3HERE

    作用: 在遇到INT 3 指令时激活SoftICE

    语法: I3HERE [on | off]

    用法:

    I3HERE ON 将使SoftICE每碰到一个 INT 3 时都弹出

    这在调试程序时需要在某处暂停特别有用.在你需要暂

    停的指令之前加一个INT 3 就行.如果你是编 WINDOWS

    程序加个函数 DebugBreak(). 这个函数也执行一个

    INT 3.

    I3HERE 不带参数将显示当前状态.请参见I1HERE.

    点评:

    基础信息: INT 3 是断点中断处理例程.也被DEBUGGER

    们挂接显示寄存器值给出一些信息并等待用户下一

    步操作. DEBUGGER在下断点时将断点处的指令替换成

    INT 3把替换下的指令保存在执行完例程后再恢复原

    先保存的指令修改堆栈中的断点地址 使程序得以继

    续. DOS下的老DEBUG.EXE当遇到程序中的INT 3 指令时

    会进行同样的操作也修改堆栈中的断点地址所以IP又

    停在那条INT 3 上 如果你打入 G 程序将一直停在此

    处这时改一下IP就可以了.

    命令: IDT

    作用: 显示中断描述符表

    语法: IDT [interrupt-number]

    用法:

    interrupt-number: 所要显示的中断号

    IDT 命令读取中断描述符表寄存器的值 获得表基址

    然后显示中断描述符表的内容.IDT 命令不带参数将显

    示所有中断的情况如果带中断号 则只显示相应的入

    口. 输出参数如下:

    interrupt number: 0-05fh的中断号.

    interrupt type : 中断类型如下:

    ---------------------

    CallG32: 32位调用门.

    CallG16: 16位调用门.

    TaskG: 任务门.

    TrapG16: 16位陷肼门.

    TrapG32: 32位陷肼门.

    IntG32: 32位中断门.

    IntG16: 16位中断门.

    ---------------------

    address : (选择符:偏移量)形式的地址.

    selector's DPL : 选择符的描述符特权级0123

    present bit : P 或 NP 表示该描述符是否在内

    存中.

    Owner+Offset : 符号名或拥有者名和在它们中的

    偏移.

    点评: 参见GDTLDT.

    命令: LDT

    作用: 显示局部描述符表

    语法: LDT [selector]

    用法:

    selector: 指定LDT 选择符

    LDT 命令将显示局部描述符表的内容. SoftICE先读取

    局部描述符表寄存器的值再定位描述符表. 如果局部

    描述符表不存在会显示一个错误信息. 如果指定选择

    符则只显示该选择符所指向的描述符. 如果指定的选

    择符是一个全局选择符 则SoftICE将自动显示该全局

    选择符所指的描述符.

    输出:LDT 的线性基址和长度将显示在输出数据的顶行

    输出数据的每一行内容的说明:

    value: 最低两位即描述符特权级

    type : 描述符类型如下:

    ---------------------------

    Code16 : 16位代码描述符

    Data16 : 16位数据描述符

    Code32 : 32位代码描述符

    Data32 : 32位数据描述符

    CallG32: 32位调用门描述符

    CallG16: 16位调用门描述符

    TaskG32: 32位任务门描述符

    TaskG16: 16位任务门描述符

    TrapG32: 32位陷肼门描述符

    TrapG16: 16位陷肼门描述符

    IntG32 : 32位中断门描述符

    IntG16 : 16位中断门描述符

    Reserved: 保留的描述符

    ---------------------------

    base : 描述符中的段基址

    limit : 描述符中的段界限

    DPL : 描述符特权级0123

    present bit: P 或 NP 表示该段是否在内存中

    segment attributes: 段特性:

    ---------------------------

    RW: 数据段可读写

    RO: 数据段只读

    RE: 代码段可读可执行

    EO: 代码段只可执行

    B : TSS(任务状态段)忙置位

    ---------------------------

    点评:

    这段翻译并不完全用PDF手册上的.如"selector" 原指

    选择符(器)用来指向描述符表中的描述符而PDF手册

    中type 的说明全用到 selector. 说的意思虽是一样

    但和别的文献矛盾故认为不妥将其翻译成descriptor

    即描述符. 实际上可以看出一个选择符指向一个描述

    符两者是一致的. 描述符类型实际上也就是指向它的

    选择符类型.

    命令: LHEAP

    作用: 显示Windows 局部堆

    语法: LHEAP [selector | module-name]

    用法:

    selector : 局部描述符表数据选择符.

    module-name: 16位 模块名.

    LHEAP 显示Windows程序在全局堆中申请的数据信息.

    如果不跟选择符参数当前的DS 寄存器的内容(数据选

    择符)被做为缺省值. 用前次说过的 HEAP 命令找标有

    LH 的选择符来做为LHEAP的参数.如果用module-name

    做参数则SoftICE用此模块的缺省数据段进行堆遍历.

    输出:

    offset: 16位的偏移量(相对于相应的选择符基址)

    size : 堆入口(每个组成部分)的字节大小.

    type : 类型如下:

    ---------------------

    FIX : 固定的.

    MOV : 可移动的.

    FREE: 空闲的.

    ---------------------

    handle: 相应的句柄.对固定的堆组成部分来说 此值

    和offset 相等且是由 LocalAlloc()返回的.

    对于可移动的组成部分来说此值将会被做为

    LocalLock()的参数.

    点评: 无.(天气好热!翻译得好累!)

    命令: LINES

    作用: 改变SoftICE窗口的显示行数

    语法: LINES [25 | 43 | 50 | 60]

    用法:

    LINES 命令用来改变SoftICE窗口的显示行数. 默认为

    25行.可以有:

    25 行;43 行;50 行;60 行;435060行只适用于VGA卡.

    LINES 不带参数将显示当前行数.如果用 ALTSCR 命令

    切换显示器输出到单显SoftICE自动转为25行再转回

    VGA卡时要手工用 LINES 命令来恢复原值.

    点评:

    实际上 我的3.20用的是SoftICE自带的通用视频驱动

    程序行范围可以从25一直到128 !!(除非为SoftICE开

    的显存不够)

    命令: LOCALS

    作用: 从当前栈中列出局部变量

    语法: LOCALS

    用法:

    输出:

    Stack Offset : 栈偏移.

    Type definition: 类型定义.

    ValueDataor structure symbol({...})

    : 值数据或结构符号.

    SoftICE根据局部变量的类型来用不同的形式显示它们

    如果是指针则显示所指向的数据.如果是结构则显示

    结构符号.如果既不是指针又不是结构则显示本身值.

    命令: M

    作用: 传送数据

    语法: M source-address l length dest-address

    用法:

    source-address: 源数据的起址;

    length : 要传送的字节长度;

    dest-address : 目的数据块的起址.

    用 M 命令将数据块从源地址传送到目的地址.

    如M ds:1000 l 2000 es:5000

    将2000h个字节从DS:1000h传到ES:5000h处.

    点评: 无

    命令: MACRO

    作用: 定义一个宏命令使之执行一系列SoftICE指令.

    语法: MACRO [ macro-name] | [*] | [= "macro body"]

    用法:

    macro-name: 3-8个字符的宏名(不区分大小写);

    macro-body: 用分号隔开的一系列SoftICE指令 首末

    加冒号;

    * : 删除一个或所有的已定义的宏命令;

    = : 定义(或重定义)一个宏命令.

    MACRO 命令用于定义SoftICE指令的超集.macro-body

    可以包含SoftICE的指令也可包含宏定义甚至是当前

    的宏定义本身.(这当然会产生递归调用如果编得不好

    的话会产生错误也没有什么大意思).在这一系列命令

    之间用分号(;)隔开最后一个命令后不用加分号.

    macro-body中还可以带入命令行参数和DOS命令的%1

    %2...一样合法值在1-8之间.注意一点macro-body首

    尾是用冒号的.所以在宏定义体中如果要用到 \ " %

    时要在前加一 \这跟C语言的写法是一致的.

    macro_name参数用来代表宏名可以是字母或数字或下

    划线组成.可以是现有的宏名 那样的话就会重定义这

    个宏.宏名不可以和现有的SoftICE内部指令相同.会发

    生错误.MACRO * 表示删除当前定义的所有(有名字的)

    宏.(因为断点的DO 子句实际上也是宏 不过是无名字

    的它们不能就这样被删除了!)

    MACRO mnames * 删除当前名为 mnames 的宏.

    MACRO mnames 将编辑名为 mnames 的宏 在编辑过程

    中可以用ESC键取消改动.一个很有用的例子:

    :MACRO 1shot = "bpx %1 do \"bc bpindex\""

    用这个宏可以设一个一次性断点非常方便!

    点评: 宏病毒!

    命令: MAP32

    作用: 显示当前所有32位模块的内存映象(图).

    语法: MAP32 [module-name | module-handle |address]

    用法:

    module name : Windows模块名;

    module handle: 模块的基址;

    address : 落在可执行模块中的地址.

    MAP32 不带参数将显示所有的32位模块的信息.加参数

    将只显示指定模块的信息.

    输出如下:

    Owner : 模块名.

    OBJ Name: 可执行文件的区段名.

    Obj# : 可执行文件中的区段号.

    Address : 选择符:偏移量 格式的区段地址.

    Size : 区段的大小(字节)

    Type : 区段类型:

    --------------------

    CODE 代码

    IDATA 初始化的数据

    UDATA 未初始化的数据

    RO 只读

    RW 读/写

    SHARED 对象是共享的.

    --------------------

    点评: 无.

    命令: MAPV86

    作用: 显示当前虚拟机的DOS内存映象

    语法: MAPV86 [address]

    用法:

    address : 段:偏移量格式的地址

    MAPV86 不带参数将显示当前整个虚拟机的内存映象.

    加参数将显示指定包含所指定地址的内存区域的信息.

    有时侯DOS VM的页没有切进来所以会有 "PAGE NOT

    PRESENT"的出错信息所以可以再弹出一次.

    MAPV86 在配合SYMLOC命令时很有用因为在Windows

    启动前装载的程序Windows不会自动将它们的符号信

    息映射到V86内存用MAPV86命令就可以取得它们的代

    码段将符号表与之对齐就可以跟踪调试了.

    输出如下:

    VM ID : 虚拟机的ID.

    VM handle : 32位虚拟机的句柄.

    CRS pointer: 虚拟机的32位客户登记表的指针.(?)

    VM address : 32位线性地址.

    另外如果SoftICE弹出时CS:IP指向一个MAPV86的入口

    那一行的内容将高亮显示.

    点评: 无.

    命令: MOD

    作用: 显示Windows模块列表.

    语法: MOD [partial-name]

    用法:

    partial-name: Windows模块名(可以是开头的若干个

    字母).

    MOD 不带参数将显示所有的模块.若加 partial-name

    则符合要求的模块将被列出.输出如下:

    module handle: 16位的句柄.

    base : 线性基址.

    pe-header : 选择符:偏移量格式的PE文件头.

    module name : 模块名.(编程序时在.DEF中用NAME或

    LIBRARY命名的.)

    file name : 文件的路径(全名).

    点评: 无.

    命令: O

    作用: 向I/O端口输出数据.

    语法: O[size] port value

    用法:

    size : B 字节(缺省值);W 字;D 双字

    port : 端口地址.

    value: 要输出字节字或双字.

    O 命令将立即输出到硬件端口(当然那两个21h和A1h要

    等退出SoftICE窗口时才执行)(?)

    点评:

    关于21h和A1端口二者是关系到中断的 PDF文档在这

    写得不是很详细.实际操作情况是多种多样的.

    命令: P

    作用: 单步执行程序.

    语法: P [ret]

    用法:

    P 命令将单步执行程序.在汇编模式中当遇到 CALL

    INTLOOPREP指令时P将不跟踪进去直到这些指令执

    行完毕控制才返回SoftICE换句话说P命令是"跨"过

    这些指令的.P 后加RET 参数SoftICE将一直单步执行

    直到它找到一条返回语句(RETRETF).在源程序模式中

    P 命令将执行一个源程序表达式. 但也不跟踪到子例

    程中去.P 命令实际上是利用了单步标志 大多数情况

    下是如此.但碰到CALLINTLOOPREP指令时就用INT 3

    (一次性) 在这些指令的后面设一下.

    P 命令有快捷键 F10; P RET 命令有快捷键 F12.

    点评: F10可能是按得最多的键了好好保护你的键盘吧!

    命令: PAGE

    作用: 显示页表信息

    语法: PAGE [address [L length]]

    用法:

    address : 段:偏移量 或 选择符:偏移量 格式的地址

    length : 要显示页的数量.

    PAGE 命令用来列出当前页目录和各个页表的情况.(在

    Windows NT 中可以实现列出多个页目录的情况 这里

    就不涉及了) 在x86的体系中 一个页目录包含1024个

    页目录项(每个页目录项占4个字节)每个页目录项又指

    向一个页表每个页表包含1024个页表项 (每个页表项

    也占4个字节)每个页表项指向一个4KB大小的页.所以

    这样的体系管理着1024*1024*4=4GB大小的空间.

    PAGE 加地址参数将显示映射到相应地址处的页表项的

    内容包括以下部分:

    .由该页表项映射的页的线性虚拟地址.

    .由该页表项映射的页的物理地址.

    .该页表项的各种特性比如是否在内存中存取权限等.

    这里的特性是CPU架构时确定的.

    .该页的类型这个是页表项中的Windows定义位决定的.

    PAGE 加地址加L参数将显示连在一块的若干个页表项

    但要注意的一点是:PAGE命令在显示这样一块连续页表

    项区域时不会跨过页表界线. 也就是说显示出来的页

    表项有可能会少这时再用一个PAGE就可.

    PAGE 不加参数将显示当前页目录的内容. 第一行显示

    页目录的物理和线性地址.后面的每一行显示一个页目

    录项的内容.

    输出:

    physical address: 物理地址.如果显示的是页目录(

    即PAGE不加参数)这个地址是页目录项的物理地址即

    相应页表的地址. 如果显示的是页表(即PAGE 加地址

    参数) 则这个地址是内存中相应页的物理地址.

    linear address : 线性地址.如果显示的是页目录(

    即PAGE不加参数)这个地址是页目录项的线性地址即

    相应页表的地址. 如果显示的是页表(即PAGE 加地址

    参数) 则这个地址是内存中相应页的线性地址. 如果

    加L参数则此地址是第一个页的线性地址.

    attribute :下面是页目录项或页表项的属性:

    ---------------------

    P 在内存中

    NP 不在内存中

    D 又脏又快的DOS!

    A 存取位

    U 用户属性

    S 管理员属性

    R 只读

    ---------------------

    type :每个页表项在架构中都留有一个

    3bit的OS字段 作系统利用

    Windows就定义如下的类型:

    ---------------------

    System Private

    Instance Relock

    VM Hooked

    ---------------------

    系统 私有

    实例 重锁

    虚拟机 钩子

    ---------------------

    点评: 无

    命令: PAUSE

    作用: 满屏后是否暂停显示

    语法: PAUSE [ON | OFF]

    用法:

    PAUSE 命令将控制是否在SoftICE命令显示输出到达满

    屏后暂停.默认PAUSE 为ON即在满屏时暂停. PAUSE命

    令不加参数将显示当前状态.

    点评: 也可用SET PAUSE [ON|OFF]

    命令: PCI

    作用: 显示系统中每个PCI设备的情况.

    语法: PCI

    用法:

    PCI 命令显示系统中每个PCI设备的配置寄存器内容.

    不要在非PCI的系统上使用这个命令. 大多数输出的内

    容都一目了然少数的没有说明可以参考PCI详细的说

    明书.

    点评: 我倒是用它来看显卡的制造商.

    命令: PEEK

    作用: 从物理内存中读数据

    语法: PEEK[size] address

    用法:

    size : B 字节(默认值);W 字;D 双字;

    address: 物理内存地址.

    PEEK 命令显示从指定物理内存中来的指定大小的数据

    PEEK 命令在读取内存映象的I/O 寄存器的值时很有用.

    点评: 参见POKE

    命令: PHYS

    作用: 显示某个物理地址对应的所有虚拟地址.

    语法: PHYS physical-address

    用法:

    physical-address: 物理地址 是由x86的分页机构转

    换来的.这个物理地址是传到计算机的总线上的地址.

    而且在操作内存映象的硬件设备时(如显存 )显得特别

    重要.

    Windows用x86体系的虚拟寻址方式在虚拟地址(被程序

    用到)和物理地址(被硬件设备用到)之间建起一座桥梁.

    在很多情况下一段物理地址可能出现在多个页表项中

    所以就存在一个物理地址对多个虚拟地址.

    SoftICE在表达式中不接受物理地址所以应用PHYS 命

    令来进行转换.

    点评: 无.

    命令: POKE

    作用: 向物理内存写数据.

    语法: POKE[size] address value

    用法:

    size : B 字节(缺省值);W 字;D 双字

    address: 物理内存地址;

    value : 要输出字节字或双字.

    POKE 命令将往指定的物理内存地址处写指定大小的数

    据.这对在写内存映象的I/O 寄存器的值时很有用.

    点评: 无

    命令: Print Screen键

    作用: 打印屏幕内容

    语法: 按下PrintScreen键

    用法:

    这个功能将SoftICE屏幕上的内容输出到打印机. 默认

    的打印机端口是LPT1.可以用PRN命令来改变打印端口.

    由于SoftICE对外设的读写是直接往I/O端口的所以这

    个功能只能用于直接联接在COM口或LPT口上的设备而

    不支持网络打印.

    也可以用SoftICE Loader将内容记录到文件中去.

    点评:

    打印机我没有试过可用Loader将内容都记录下来是非

    常不错的有时记录一段小代码不必动用w32dasm了用

    Loader就可以代替非常好的我推荐您试一下!!!!

    命令: PROC

    作用: 显示系统中所有进程的简要信息

    语法: PROC [-xo] [task]

    用法: -x: 即-eXtended : 显示每个线程的扩展信息

    -o: 即-Objects : 显示在进程句柄表中的对象列表

    task : 任务名

    输出:

    Process : 任务名

    pProcess : 指向进程数据库的指针

    Process ID : 进程的Ring 3的ID

    Threads : 进程所拥有的线程数量

    Context : 地址区域

    DefHeap : 缺省堆

    DebuggeeCB : 调试块

    点评: 无

    命令: QUERY

    作用: 显示某个进程的虚拟地址映象

    语法: QUERY [[-x] address] | [process-type]

    用法:

    -x : 显示某个线性地址在所有有效的地址区

    域中的内存映象

    address : 线性地址

    processtype: 可被解释成进程的表达式

    QUERY 命令可以显示某个进程的虚拟地址映象或某个

    线性地址的映象.如果QUERY命令不加任何参数将显示

    当前进程的映象.

    输出:

    Base : 指向连续页的基址

    AllocBase : 由VirtualAlloc函数申请的内存的基址

    AllocProtect:在申请时被指定为存取保护

    Size : 有相同特性的页组成的内存区的大小Bytes

    State : 内存区中页的状态:

    ----------------------------------

    .Commit 受委托的页意即物理定位的.

    .Free 空闲的页可以被申请

    .Reserve 保留

    ----------------------------------

    Protect : 当前存取保护

    Owner : 内存区的所有者

    Context : 地址区域

    点评: 无

    命令: R

    作用: 显示或更改寄存器的内容

    语法: R [-d | register-name | register-name [=] value]

    用法:

    register-name: 以下任何一种:

    ----------------

    ALAH AXEAX

    BLBH BXEBX

    CLCH CXECX

    DLDH DXEDX

    DIEDISIESI

    BPEBPSPESP

    IPEIPFLDS

    ESSSCSFSGS

    ----------------

    value : 将要修改的寄存器内容.寄存器名除 FL

    (标志寄存器)以外其他所有的都是 16

    进制的值.如果是FL的话value应如下:

    ----------------

    O 溢出位

    D 方向位? I 中断位? S 符号位

    Z 零标志

    A 辅助进位

    P 奇偶位

    C 进位标志

    ----------------

    在相应的标志前加"+""-"号表示打开或关闭

    如: R FL +O 将溢出标志置位.如果不带"+-"

    号则将当前的状态反转.

    -d :在命令窗口中显示寄存器的值.

    如果 R 命令不加参数光标将移到寄存器窗口中进行

    实时修改.如果当前寄存器窗口不可见 那么这个命令

    将自动显示它.

    另外修改FL寄存器时参数不必按照顺序如:

    R fl=o+a-c 一次修改3个标志位.

    点评: 无.

    命令: RS

    作用: 暂时恢复程序屏幕

    语法: RS

    用法:

    RS 命令允许用户暂时恢复程序的视屏画面. 这个命令

    在调试频繁更新屏幕的程序时特别有用.当显示出程序

    的原画面后可以按任意键返回SoftICE.RS有个快捷键

    F4.

    点评: 无.

    命令: S

    作用: 在内存中搜寻特定数据

    语法: S [-cu][address L length data-list]

    用法:

    address :搜索的起始地址

    length :搜索的长度(字节长)

    data-list:可以是一系列字节也可以是字符串 字符

    串可以用单引号也可以用双引号括住.

    -c :使查找区分大小写

    -u :查找Unicode 编码的字符串.

    S 命令将从指定的内存地址开始查找指定内容的数据

    一直到超过指定的长度为止.如果查到相应数据会在

    当前的数据窗口中显示它并在命令窗口中显示信息.

    想要继续查找则只要打入 S 即可不需另外带参数.

    S 命令忽略被标记为不在内存中的页. 想搜索一大段

    内存的话请用一马平川的30做为选择符.

    点评: 无.

    命令: SERIAL

    作用: 将控制台转移到串口终端上

    语法: SERIAL [on [com-port] [baud-rate] | off]

    用法:

    com-port : 从1-4分别代表COM1COM2COM3COM4

    其中COM1是默认值.

    baud-rate: 波特率默认值由SoftICE自动侦测. 可能

    值为:12002400480096001920023040

    288003840057000115000.

    用一条电缆将两台机器的COM口联起来 有被调试程序

    的机器称为本地机(local) 另一台做为控制台的机器

    称为远程机(remote).在联接前 远程机上必须运行软

    件包中的serial.exe程序所以远程机至少要是MSDOS

    操作系统.Serial.exe 程序的命令格式和Serial 指令

    的格式一致. 当联接建立后本地机的屏幕将恢复被调

    试程序的屏幕(即windows屏幕) 而远程机将显示Sof-

    tICE的调试窗口.电缆的做法如下:

    25Pin的电缆

    ===========================

    远程 本地

    2 ---------------------- 3

    3 ---------------------- 2

    4 ---------------------- 5

    5 ---------------------- 4

    6 ---------------------- 20

    8 -----^

    20---------------------- 6

    ^------- 8

    7 ---------------------- 7

    ===========================

    9 Pin的接法:

    ===========================

    本地 远程

    2 ---------------------- 3

    3 ---------------------- 2

    5 ---------------------- 5

    7 ---------------------- 8

    8 ---------------------- 7

    6 ---------------------- 4

    1 ------^

    4 ---------------------- 6

    ^------ 1

    ===========================

    注:表中的^代表相接.如上面的

    表示6和1先相接再接对方的4

    远程机上总可以用CTRL+D 来激活调试.

    结束调试可以在远程机上打入SERIAL off

    远程机要退出serial.exe程序可以用CTRL+Z

    点评: 无

    命令: SET

    作用: 显示或改变SoftICE的内部参数

    语法: SET [keyword] [on | off] [value]

    用法:

    keyword : 内部变量

    value : 有些变量有数值量不是简单的ONOFF

    Set 命令用来设置SoftICE的内部变量. 不加参数将显

    示所有这些变量的当前状态 只加keyword将只显示当

    前变量的状态.

    变量列表

    ----------------------

    ALTSCR [ON|OFF]

    CASESENSITIVE [ON|OFF]

    CODE [ON|OFF]

    EXCLUDE [ON|OFF]

    FAULTS [ON|OFF]

    FLASH [ON|OFF]

    I1HERE [ON|OFF]

    I3HERE [ON|OFF]

    LOWERCASE [ON|OFF]

    MOUSE [ON|OFF][123]

    PAUSE [ON|OFF]

    SYMBOLS [ON|OFF]

    TABS [ON|OFF][12345678]

    THREADP [ON|OFF]

    VERBOSE [ON|OFF]

    ----------------------

    CASESENSITIVE ON 将使符号名对大小写敏感

    MOUSE 允许或禁止使用鼠标.还可以设定鼠标移动的速

    度1最慢3最快2是中速也是缺省值.

    SYMBOLS ON 将允许反汇编器在代码中显示符号名. 如

    果为OFF将只显示数字化的地址等.

    其余见它们各自的命令解释.

    点评: 无.

    命令: SHOW

    作用: 列出回溯跟踪历史缓冲区中的指令

    语法: SHOW [B | start] [l length]

    用法: start : 十六进制的值 用以确定从回溯跟踪缓冲区

    开始反汇编的指令序号. 为 1表示是缓冲区

    中的最新一条指令.

    length : 显示几条指令.

    SHOW命令将从SoftICE的回溯跟踪历史缓冲区中显示指

    令.如果有源程序的话将显示源程序与反汇编代码若

    没有则只显示汇编指令.

    结果将在命令窗口中显示所有指令都有一个数字前缀

    用来表示指令的序号.1 是最新的指令. 可以用上下光

    标键来浏览用ESC键退出.

    SHOW 不带参数或加B 参数将从缓冲区中最旧的一条指

    令开始显示. SHOW 带序号参数将从指定的序号开始显

    示指令.

    SHOW 命令只在回溯跟踪历史缓冲区不为空时才有用.

    用BPR 的 T TW参数来装满它!

    点评: 无

    命令: SRC

    作用: 在源程序反汇编代码两者混和之间切换显示.

    语法: SRC

    用法:

    SRC 命令将在程序源代码反汇编后的指令 或两者混

    合之间来回切换显示.SRC 的快捷键为 F3.

    点评:

    注意:要在当前程序有源文件时这一功能才能奏效 例

    如:用BORLAND C编程序时所调试的程序example.c;

    example.objexample.exe 都存在才可以.

    命令: SS

    作用: 在源程序文件中查找字符串

    语法: SS [line-number] ['string']

    用法:

    line-number :十进制数的行号

    string :用引号括起来的字符串

    SS 命令将从指定的line-number(行号)开始在当前的

    源程序文件中查找字符串.如果查找到附合要求的数据

    将在代码窗口的第一行处显示.

    如果不指定行号则SS将从当前代码窗口的第一行处开

    始查找.不带任何参数的SS命令将继续上次的查找.

    注意:在用SS命令之前必须使代码窗口可见 并使代码

    窗口显示源程序文件才可.

    点评: 无.

    命令: STACK

    作用: 显示某个调用栈

    语法: STACK [task-name | SS:[E]BP]

    用法:

    task-name :可以用TASK命令看到的任务名

    SS:[E]BP :某个有效的栈框的SS:[E]BP值

    STACK 命令用来显示DOS程序Windows任务 32位代码

    的调用栈.STACK命令不加参数的话当前的SS:[E]BP的

    值被默认为栈框的基址.也可以加任务名或SS:[E]BP来

    明确指定一个.

    点评: 无.

    命令: SYM

    作用: 显示或设置符号

    语法: SYM [[section-name] ! ] symbol-name [value]]

    用法:

    section-name : 有效的区段名.可以只打部分字母.

    区段名后要加!号如: SYM .TEXT!

    将显示可执行文件中.TEXT区段的

    所有符号.

    ! : 如果只加参数 ! 将只显示此符号

    表中的模块.

    symbol-name : 有效的符号名可以加*来模糊寻找.

    value : 用来将某个符号设为某个指定地址.

    SYM命令用来显示和设置符号地址.SYM命令在找寻某个

    你或许只记得部分名字的符号时特别有用可以用* 来

    代替末尾的字符也可以用 (逗号)来代替某一个字符

    点评: 无.

    命令: SYMLOC

    作用: 重定位符号基址

    语法: SYMLOC [segment-address | o | r | -c process-type | (section-number selector linear-address)]

    用法:

    segment address :段基址只在DOS中有用

    o :对16位的表起作用.使所有选择符

    恢复原序

    r :对16位的表起作用.改变所有段值

    为适当的选择符.

    -c :指定一个context值.

    section-number :32位表.PE文件中从1开始的区段

    selector :32位表.保护模式的选择符

    linear-address :32位表.区段的基址

    SYMLOC 命令可对一个已装载的符号表进行调整.

    点评: 无

    命令: T

    作用: 单步跟踪

    语法: T [=start-address] [count]

    用法:

    count :指定SoftICE将单步跟踪多少次才停止.

    T 命令是利用CPU的单步标志来进行单步跟踪的.

    如果指定 start-addressSoftICE 将从指定的地址处

    开始单步跟踪.如果寄存器窗口可见 则寄存器窗口将

    高亮显示哪些改变的寄存器的值.

    点评: 无.

    命令: TABLE

    作用: 改变或显示当前符号表

    语法: TABLE [partial-table-name] | autoon | autooff | $

    用法:

    partial-table-name:符号表的名字或开头的几个字符

    autoon :用来打开自动符号表切换功能

    autooff :用来关闭自动符号表切换功能

    $ :用$ 来表示切换到当前指令所在

    的表中.

    TABLE 命令当你有多个符号表装入内存的时侯很有用.

    SoftICE支持1632位WINDOWS程序DLLsVxDsDOS程序

    DOS设备驱动程序TSRs.

    每一时刻只能从一个符号表中取得符号你若是要用某

    个符号表中的符号必须先用TABLE命令选中!

    关键字AUTOON将使SoftICE每次弹出都自动切换到当前

    指令所在的符号表中.而AUTOOFF正相反.

    点评: 无.

    命令: TABS

    作用: 显示或修改在显示源文件时TAB键的宽度

    语法: TABS [tab-setting]

    用法: tab-setting : 从1到8表示TAB键的跨度

    用TABs命令或SET TABS都可设置TAB键的跨度(列) 默

    认值是8. TAB 命令不加参数将显示当前的TAB键设置.

    点评: 不过我用的3.20默认是4

    命令: TASK

    作用: 显示Windows任务列表

    语法: TASK

    用法:

    TASK 命令将显示当前机器中运行的所有任务. 当前的

    任务前面会有一个 * 号.这个命令在WINDOWS出现所谓

    的general protection fault 时可以帮助你确定是由

    哪个任务引起的.输出:

    Task Name :任务名

    SS:SP :该任务最后交出控制时的堆栈地址.

    StackTop :堆栈偏移的顶

    StackBot :堆栈偏移的底

    StackLow :当产生地址切换时最低的SP值

    TaskDB :任务数据基址的选择符

    hQueue :任务的队列句柄.

    Events :队列中事件

    点评: 无.

    命令: THREAD

    作用: 显示线程信息

    语法: THREAD [TCB | ID | task-name]

    用法:

    TCB :线程控制块

    ID :线程ID

    task-name :当前运行的32位过程.

    THREAD 命令将显示某个线程的信息.

    如果不带任何参数将显示当前系统中所有活动的线程

    如果将某个进程名作为参数将显示所有该进程的线程

    如果指定TCB或ID则 只显示指定的线程.

    Ring0TCB :Ring-0线程控制块的地址.

    ID :VMM线程ID

    Context :该线程所属进程的context句柄

    Ring3TCB :Ring-3线程控制块的地址

    ThreadID :Ring-3线程ID

    Process :拥有该进程的KERNEL32进程数据库的地址

    TaskDB :任务数据的选择符

    PDB :程序数据的选择符(PSP)

    SZ :线程的大小(1632)

    Owner :进程的所有者.

    点评: 无.

    命令: TRACE

    作用: 进入或退出摹拟跟踪模式

    语法: TRACE [b | off | start]

    用法:

    start :16进制的值.用来表示回溯跟踪历史缓冲区中

    指令的序号.1 表示最新的一条指令.

    TRACE 命令不带参数将显示当前摹拟跟踪的状态.

    TRACE OFF 将退出当前的摹拟跟踪模式回到正常的跟

    踪模式下.

    TRACE B 从最老的一条指令开始摹拟跟踪. TRACE 加

    数字将从指定的序号开始摹拟跟踪.

    只有当回溯跟踪历史缓冲区不为空时才能用TRACE命令

    参见BPR命令的说明.

    回溯(摹拟)跟踪中可以用XTXPXG来跟踪程序寄存器

    窗口中除了EIP改变外其他的都不变因为SoftICE 在

    回溯跟踪中不记录所有寄存器的值.SoftICE 的命令除

    了 XTGPHEREXRSET不能在回溯跟踪模式下用外其

    他都可以使用.

    点评: 无.

    命令: TSS

    作用: 显示任务状态段和I/O端口的挂接

    语法: TSS [TSS-selector]

    用法:

    TSS-selector :任何代表是个TSS的GDT选择符

    TSS命令通过读取TR命令来获得地址 从而显示任务状

    态段的内容.用GDT命令可以看到TSS选择符.如果TSS命

    令不加参数将显示当前的TSS.

    输出:

    TSS selector value :TSS选择符

    selector base :TSS的线性地址

    selector limit :TSS的大小

    下面四行显示TSS中寄存器的内容:

    LDT GS FS DS SS CS ES CR3

    EAX EBX ECX EDX EIP

    ESI EDI EBP ESP EFLAGS

    Level 0 1 and 2 stack SS:ESP

    下面将显示被VxD挂接的I/O端口

    port number :16位的端口号

    handler address :32位的I/O句柄地址

    handler name :句柄的符号名.

    点评: 无.

    命令: TYPES

    作用: 列出当前内存区域(context)中的类型名

    语法: TYPES [type-name]

    用法:

    type-name : 显示指定的类型名

    TYPES 命令不加参数将显示当前所有的类型名.如果加

    参数将只显示所指定的类型.如果参数是个结构TYPES

    将自动展开结构并显示其成员.

    点评: 无

    命令: U

    作用: 反汇编指令

    语法: U [address [l length]] | [symbol-name]

    用法:

    address : 段:偏移量或选择符:偏移量

    symbol-name : 将从指定的函数开始反汇编

    length : 反汇编的长度(字节)

    U 命令将从指定地址开始反汇编指定长度的指令.如果

    代码窗口可见则显示结果将在代码窗口中 否则在命

    令窗口中. U 命令跟symbol-name(符号名)如果当前符

    号表装载的话U 命令可以从指定的符号地址开始反汇

    编.

    点评: 可用U在命令窗口中反汇编再用LOADER32存盘

    命令: VCALL

    作用: 显示VxD可调用例程的名字和地址

    语法: VCALL [partial-name]

    用法:

    partial-name:符号表的名字或开头的几个字符.

    VCALL 命令将显示Windows VxD API例程的名字和地址.

    这些例程是Windows本身的VxD提供的并为为其他VxD准

    备的.所显示的地址只有当VMM VxD初始化过后才有效

    如果SoftICE的初始化字符串中没有一个 X;SoftICE将

    在Windows启动但VMM没有初始化时弹出.

    命令: WL

    作用: 打开或关闭本地窗口;设置本地窗口的大小

    语法: WL [window-size]

    用法: window-size : 十进制的行数

    WL 命令不加参数将使本地窗口在打开与关闭状态之间

    切换.WL 命令加参数将使本地窗口改变为指定大小.

    所谓本地窗口也可称局部(变量)窗口 它是从当前栈

    中取的.

    点评: 无

    命令: WMSG

    作用: 显示Windows消息的名字和消息代码

    语法: WMSG [partial-name| msg-number]

    用法:

    partial-name : Windows 消息名或消息名的前几个字符.

    msg-number : 十六进制数消息代码

    WMSG 用来察看Windows消息名和消息代码.这个命令在

    和BMSG配合下断点时非常有用.WMSG不加参数将显示所

    有Windows消息的名字如果加partial-name和msg-num

    参数则只显示附和条件的消息.

    点评: 无.

    命令: WR

    作用: 打开或关闭寄存器窗口

    语法: WR

    用法:

    如果当前寄存器窗口不可见 那么WR命令将使之可见

    反过来WR命令将使寄存器窗口不可见.

    寄存器窗口显示80386寄存器集CPU的FLAGS.

    该命令有快捷键 F2.

    点评: 无.

    命令: WW

    作用: 打开或关闭监视窗口;或改变监视窗口的大小

    语法: WW [window-size]

    用法:

    window-size : 十进制的窗口行数

    WW 命令不加参数 将使监视窗口在打开和关闭的状态

    之间切换.WW命令加参数将使监视窗口改变为指定大小.

    另外 ALT+W键将使光标在监视窗口和命令窗口之间来

    回切换.

    参见 WATCH

    点评: 无.

    命令: X

    作用: 从SoftICE窗口中退出

    语法: x

    用法:

    X 命令将退出SoftICE将控制交还给刚才被SoftICE中

    断的程序.SoftICE的窗口将消失若有断点的话再弹出.

    用SoftICE呼叫热键(默认CTRL+D)或在窗口中键入G 命

    令所取得的效果和 X 的效果一样.

    点评: 无.

    命令: XFRAME

    作用: 显示当前的异常出错句柄框

    语法: XFRAME. [except-frame* | thread-type]

    用法:

    except-frame* : 指向异常出错框的指针

    thread-type : 代表一个线程

    异常出错框是由微软结构化异常出错处理API建立的.

    点评: 无

    命令: XG

    作用: 在模拟(回溯)跟踪状态中运行程序到某一地址

    语法: XG [r] address

    用法:

    XG 命令意思是在模拟跟踪状态中的G命令.R 参数表示

    在回溯跟踪历史缓冲区中往回走.

    点评: 无.

    命令: XP

    作用: 在模拟跟踪模式中执行程序

    语法: XP

    用法:

    XP 命令在模拟跟踪模式中单步执行(P)

    点评: 无.

    命令: XRSET

    作用: 重置回溯跟踪历史缓冲区

    语法: XRSET

    用法:

    XRSET 必须用在非模拟跟踪模式中用来清除历史缓冲

    区.

    点评: 无.

    命令: XT

    作用: 在模拟跟踪模式中单步跟踪程序

    语法: XT

    用法:

    XT 命令在模拟跟踪模式中单步跟踪程序

    参数 R 表示反方向.

    XT和XP的区别参见P命令.

    点评: 无.

    命令: ZAP

    作用: 将内嵌的INT 1INT 3清为NOP

    语法: ZAP

    用法:

    ZAP 命令在跟踪程序时将程序中的INT 1INT 3指令换

    为相等数量的NOP这在用户为了调试程序方便而在程序

    中加杂INT 1或INT 3指令过后又不想要时特别有用.

    需注意:只有当INT 1INT 3出现在当前CS:EIP的前一条

    指令位置处才有用.

    (编辑:天命孤独)

最新文章