首页  编辑  

Sofice For Win95命令解说

Tags: /计算机文档/软件应用限制解除/   Date Created:
SoftICE for WIN95中文命令解说(一)  
命令: .
作用: 在代码窗口中定位当前指令
语法: .
用法:
当代码窗口可见时, .命令(点命令)使得当前的CS:EIP所指向的指令可见, 并且高亮显示. 另外,此命令也把SoftICE 从其他内存区域中切回原先弹出的内存区域.详见后面的ADDR命令.
点评:                
当你在代码窗口中上下浏览时,有可能走得很远, 那么这时一个"." 命令会让你在下一瞬间回到SOFTICE当前所在的CS:EIP处,再也用不着按PGUP,PGDOWN很多次了!
命令: ?
作用: 计算一个表达式的值
语法: ? 表达式
用法:                
计算一个表达式的值.并以十六进制,十进制,带符号的
十进制(<0时有)和ASCII值多种形式显示计算结果.
点评:                
一个非常高级的计算器, 诸如46578*1999+ESI 之类的计算不会再让你烦恼,另外由于可以显示ASCII,所以可以很方便地在各种数制之间察看.
命令: A
作用: 写入汇编代码
语法: A [地址]
用法:                  
用SICE内置的汇编器在内存中写入汇编代码.汇编器支持标准的80x86指令集.包括386,486,Pentium,Pentium-Pro,MMX,协处理器,新版的SICE还支持AMD的3D Now!,PII,PIII的特有指令集.汇编将在A后的地址处开始.如果在A后没有加地址, 那么汇编将在你上次汇编结束处开始.如果你是第一次键入A命令,且没有追加地址那么汇编将在当前CS:EIP处开始.另外,键入A命令后, 在单独一行指令栏中键入USE16或USE32,将告诉汇编器是采用16位还是32位指令,默认是和当前的CS寄存器的模式一致.
点评:                
这是和DOS下DEBUG.EXE的用法一样的命令.一般改程序时,用A命令写入,再用CODE ON(见稍后)命令看代码,记录原来的代码和改过的代码后再用工具软件如PCTOOLSHACKVIEW之类查找修改.
命令: 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, 9600,19200,23040,
           28800,38400,57000,115000
           其中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中将上面所说的BootGUI置为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: 条件表达式,只有条件为"真"时,SoftICE才在断点处弹出
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: 条件表达式,只有条件为"真"时,SoftICE才在断点处弹出
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: 条件表达式,只有条件为"真"时,SoftICE才在断点处弹出.
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: 条件表达式,只有条件为"真"时,SoftICE才在断点处弹出
Do command   : 当SICE弹出时,自动执行的一些命令.
BPR 用来在一段内存区域上下断点它没有 X 参数, 但可用 R 参数代替. T,TW是记录回溯跟踪的参数, 具体可见TRACE命令.BPR 有时会极大地降低系统效能,因为所有对断点所在页的内存操作都会被SoftICE截获分析.如果程序中用到频繁的内存操作,机器就会相当慢.当条件满足,SoftICE弹出时,CS:EIP停在发生内存操作的那条指令上. BPR 断点是下在当前被激活的页表上,如果你下的RANGE在物理4MB以下,断点就会在各虚拟机中,这样,BPR就对LDT,GDT,IDTs,页表本身不起作用.另外,VMM中0级堆栈和严重(?)内存区域(critical areas)也不允许下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: 条件表达式,只有条件为"真"时,SoftICE才在断点处弹出
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: 条件表达式,只有条件为"真"时,SoftICE才在断点处弹出.
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"来设断,而在断点处 mysymbol 这个变量所在的内存由于释放或其他操作而无法访问,就会产生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标准类的话,如LISTBOX,它会在任务特定的系统冗余列表中得到一个拷贝,这样就不会影响到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就能派上用场.
点评: 无
命令: D
作用: 显示某内存区域的内容
语法: D[size] [address [l length]]
用法:                
size: B 字节; W 字; D 双字; S 短实型; L 长实型;T 10b长实型
D  命令在所指定的内存区域开始显示指定长度的内存单元内容. 格式将根据size来变.对于双字类型, 将分两种情况:
1.如果指定地址为32位的段, 格式为32bytes的16进制值(即8位16进制值)
2.如果指定地址为16位的段, 则格式为16:16指针的形式(即4:4位16进制值)
如果没有指定地址,D 命令将继上次命令后的地址开始显示.如果数据窗口可见,则结果在数据窗口中显示,否则显示在命令窗口中.但若用了参数L 和长度, 则结果不论数据窗口可见还是不可见,都显示在命令窗口中.
点评: 无
命令: DATA
作用: 显示另一个数据窗口
语法: DATA [window-number]
用法:                
window-number: 所要选择的窗口号,0,1,2,3
SoftICE最多支持4个数据窗口.每一个窗口可以独立按自己的格式显示数据. 但同一时刻只能显示一个窗口.如果用DATA窗口不带任何参数, 将按0,1,2,3的次序显示各个窗口中的内容.在数据窗口的右上角的横线上有窗口序号的提示.
点评: 可以很方便地对多个目标的进行观察
命令: DEX
作用: 在数据窗口中显示(或赋予)某个表达式
语法: DEX [data-window-number [expression]]
用法:                
data-window-number: 即DATA命令中所讲的0,1,2,3号数据窗口
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:  1200,2400,4800, 9600, 19200, 23040,28800,38400(默认),57000,115000
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.在代码窗口中时,也可用上下光标键,PageUp,PageDn来翻页,上下浏览.另外,当用户调试源文件时,可以用:
Ctrl+Home    , 到源程序的第一行
Ctrl+End     , 到源程序的最后一行
Ctrl+左右光标, 水平察看源程序
点评: 实际上可以用Ctrl+光标,Ctrl+PgUp,Ctrl+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自动加载KERNEL,USER,GDI的出口函数表.你也可以通过WINICE.DAT或SoftICE 的LOADER (加载器)来加载更多的出口函数列表.
点评:                
比较常用的DLLs,DRVs都在WINICE.DAT中有了, 用户只要修改为相应的路径就能每次开机自动带入.这样带来的好处是:
1.可以在反汇编时直接看到调用接口.
2.可以直接在函数上下断点
命令: F
作用: 填充某一块内存区域
语法: F address l length data-list  
用法:                
length   : 字节长度
data-list: 所要填的数据. 可以是用单引号或双引号括起来的字符串执行F 命令将向所指定的内存区域填充length 长度的数据,如果数据不够长度,将重复数据,直到达到长度为止.
点评: 无
命令: FAULTS
作用: 打开或关闭错误跟踪功能  
语法: FAULTS [on | off]  
用法:                
FAULTS 命令将打开或关闭SoftICE的错误跟踪功能.不加参数将显示当前的开关状态.
点评:                
由于SoftICE做为一个DEBUGGER,FAULTS 默认为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 又调用显示驱动程序时,SoftICE才重新刷新屏幕. 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中返回.如果带参数breakaddress,则SoftICE将在所指定的地址处下一个一次性断点; 如果带=start-address,SoftICE 将从指定的地址处开始执行,否则从当前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  : 描述符特权级,0,1,2,3
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,请尝试0,1,2,3)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是例外,它不进行读取,而是返回SoftICE弹出时的值.
点评: 参见 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的状态.缺省为OFFI1HERE 在与如BoundsChecker 之类的调试工具分工协作时很有用,因为BoundsChecker用到 INT 3,为了防止冲突应使用INT 1. 另外,VMM,Windows内存管理的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  : 选择符的描述符特权级,0,1,2,3
present bit     : P 或 NP, 表示该描述符是否在内存中.
Owner+Offset    : 符号名或拥有者名,和在它们中的偏移.
点评: 参见GDT,LDT.
命令: 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        : 描述符特权级,0,1,2,3
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 行;43,50,60行只适用于VGA卡.LINES 不带参数将显示当前行数.如果用 ALTSCR 命令切换显示器输出到单显,SoftICE自动转为25行,再转回VGA卡时要手工用 LINES 命令来恢复原值.
点评:                
实际上, 我的3.20用的是SoftICE自带的通用视频驱动程序,行范围可以从25一直到128 !!(除非为SoftICE开的显存不够)
命令: LOCALS
作用: 从当前栈中列出局部变量
语法: LOCALS
用法:                
输出:
Stack Offset   : 栈偏移.
Type definition: 类型定义.
Value,Data,or 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,INT,LOOP,REP指令时,P将不跟踪进去,直到这些指令执行完毕,控制才返回SoftICE,换句话说,P命令是"跨"过这些指令的.P 后加RET 参数,SoftICE将一直单步执行直到它找到一条返回语句(RET,RETF).在源程序模式中,P 命令将执行一个源程序表达式. 但也不跟踪到子例程中去.P 命令实际上是利用了单步标志, 大多数情况下是如此.但碰到CALL,INT,LOOP,REP指令时,就用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: 以下任何一种:
       ----------------    
        AL,AH, AX,EAX
        BL,BH, BX,EBX
        CL,CH, CX,ECX
        DL,DH, DX,EDX
        DI,EDI,SI,ESI
        BP,EBP,SP,ESP
        IP,EIP,FL,DS
        ES,SS,CS,FS,GS
       ----------------
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,分别代表COM1,COM2,COM3,COM4
          其中COM1是默认值.
baud-rate: 波特率,默认值由SoftICE自动侦测. 可能值为:1200,2400,4800,9600,19200,23040,
          28800,38400,57000,115000.
用一条电缆将两台机器的COM口联起来, 有被调试程序的机器称为本地机(local), 另一台做为控制台的机器称为远程机(remote).在联接前, 远程机上必须运行软件包中的serial.exe程序,所以,远程机至少要是MSDOS操作系统.Serial.exe 程序的命令格式和Serial 指令
的格式一致. 当联接建立后,本地机的屏幕将恢复被调试程序的屏幕(即windows屏幕), 而远程机将显示SoftICE的调试窗口.电缆的做法如下: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   : 有些变量有数值量,不是简单的ON,OFF
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][1,2,3]
       PAUSE         [ON|OFF]
       SYMBOLS       [ON|OFF]
       TABS          [ON|OFF][1,2,3,4,5,6,7,8]
       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.obj,example.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-address,SoftICE 将从指定的地址处开始单步跟踪.如果寄存器窗口可见, 则寄存器窗口将高亮显示哪些改变的寄存器的值.
点评: 无.
命令: TABLE
作用: 改变或显示当前符号表  
语法: TABLE [partial-table-name] | autoon | autooff | $
用法:                
partial-table-name:符号表的名字或开头的几个字符
autoon            :用来打开自动符号表切换功能
autooff           :用来关闭自动符号表切换功能
$                 :用$ 来表示切换到当前指令所在的表中.
TABLE 命令当你有多个符号表装入内存的时侯很有用.SoftICE支持16,32位WINDOWS程序,DLLs,VxDs,DOS程序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         :线程的大小(16,32)
Owner      :进程的所有者.
点评: 无.
命令: TRACE
作用: 进入或退出摹拟跟踪模式  
语法: TRACE [b | off | start]
用法:                
start  :16进制的值.用来表示回溯跟踪历史缓冲区中
       指令的序号.1 表示最新的一条指令.
TRACE 命令不带参数将显示当前摹拟跟踪的状态.
TRACE OFF 将退出当前的摹拟跟踪模式,回到正常的跟踪模式下.
TRACE B 从最老的一条指令开始摹拟跟踪.  TRACE 加数字将从指定的序号开始摹拟跟踪.只有当回溯跟踪历史缓冲区不为空时才能用TRACE命令参见BPR命令的说明.回溯(摹拟)跟踪中可以用XT,XP,XG来跟踪程序,寄存器窗口中除了EIP改变外,其他的都不变,因为SoftICE 在回溯跟踪中不记录所有寄存器的值.SoftICE 的命令除了 X,T,G,P,HERE,XRSET不能在回溯跟踪模式下用外其他都可以使用.
点评: 无.
命令: 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没有初始化时弹出.
点评: 无.
命令: VER
作用: 显示SoftICE版本号  
语法: VER  
用法:
用Loader32的ABOUT也可以显示详细的信息.
点评: 无
命令: VM
作用: 显示虚拟机的信息  
语法: VM [-S] [VM-ID]  
用法:                
-S    : 切换到由VM-ID标识的VM
VM-ID : 虚拟机的序号.从1开始,并且1是赋予Windows系统VM的.(Windows应用程序在这个VM上运行)
如果VM 命令不加参数,SoftICE将显示系统中所有虚拟机的信息.如果加 VM-ID 参数,该VM的寄存器值将被显示.这里的寄存器值是在VM控制块用户区中的寄存器值.所以,这些寄存器表示的是最后当有内存地址切换时存入该控制块时的值.当SoftICE弹出时正好某个VM 正在运行的话,在寄存器窗口中的值才是真正当前的值, 而不是用VM命令在命令窗口中看到的值. 有一点要注意:如果你在某个中断例程中的头几句指令处,而此时这个VM的寄存器值正在被存入控制块,那么可能当前只有CS:IP的值(由VM显示)是真的.其余的有可能还没有存入控制块.命令窗口中显示两组CS:EIP和SP的值. 分别代表保护模式和实模式.两者的排列是由VM最后的执行模式决定的.如果最后是在保护模式中切出来的,那么先显示PROT.反过来就先显示REAL.一般情况下,除了系统VM之外,其他的VMs只有一个V86线程.但是DPMI程序会从V86转到保护线程.VM命令在调试VxDs,DPMI程序,DOS程序时比较有用.如果一个DOS程序在运行时挂起,你可以用VM命令看到该VM最后执行的一条指令.
输出:
status:
---------------------------------
0001H 独占模式
0002H 后台运行
0004H 正在建立
0008H 暂时终止
0010H 部分被破坏
0020H 执行保护模式指令
0040H 执行保护模式程序
0080H 执行32位保护模式程序
0100H 从VxD中调用CALL
0200H 后台高度优先权
0400H 信号阻断
0800H 阻断唤醒
1000H V86程序的部分可换页
2000H V86程序其他的部分被锁定
4000H 时间切片
8000H 空闲,已释放时间片
---------------------------------
点评: 无.  
命令: VXD
作用: 显示Windows VxD 映象  
语法: VXD [VxD-name]  
用法:                
VxD-name : 虚拟设备驱动程序的(部分)名字
VXD 命令将显示指定的某个VxD的信息.如果不加参数,VXD命令将显示系统中所有的虚拟设备驱动程序的映象.动态装载的VxD将显示在静态装载的VxD后面.
输出:
VxDName   : VxD 名字
Address   : 段基址
Length    : 段的长度
Seg       : 可执行部分的区段数
ID        : VxD的ID
DDB       : VxD描述符块的地址
Control   : 控制分配句柄的地址
PM        : Y表示该VxD有一个保护模式的API,N相反
V86       : Y表示该VxD有一个V86API,N相反
VXD       : 实现的VxD服务数
Win32     : 实现的Win32服务数
点评: 无.
命令: WATCH
作用: 加入一个监视窗口  
语法: WATCH expression
用法:                
WATCH 命令监视所指定表达式的值.目标数的大小由它本身的类型信息提供. SoftICE在无法确定大小时默认为双字.SoftICE一次最多支持8个表达式.每次SoftICE弹出,表达式的当前值就会在监视窗口中显示出来.表达式的信息:
.表达式
.类型
.当前的值,以指定格式显示.
如果类型前有个+号,则此类型可扩展.用鼠标双击或用ALT+W切进监视窗口,用光标移动到该类型上去,再按回车键.
如果要求的表达式当前无法计算,SoftICE会显示:"Error evaluating expression"要删除某个监视的表达式,选中它,再按DEL键.
点评: 无.
命令: WC
作用: 打开或关闭代码窗口;或改变代码窗口大小  
语法: WC [window-size]
用法:                
window-size   : 窗口大小,十进制值
WC 命令不加参数将打开或关闭代码窗口.
WC 命令加参数将改变代码窗口的大小.
点评: 无.
命令: WD
作用: 打开或关闭数据窗口;或改变数据窗口大小  
语法: WD [window-size]
用法:                
window-size   : 窗口大小,十进制值
WD 命令不加参数将打开或关闭数据窗口.
WD 命令加参数将改变数据窗口的大小.
点评: 无  
命令: WF
作用: 以浮点或MMx形式显示浮点栈  
语法: WF [-d] [b | w | d | f | *]
用法:                
-d     : 在命令窗口中显示结果,另外加上FPU状态字
        和FPU控制字.
b      : 以字节形式显示
w      : 以字形式显示
d      : 意双字形式显示
f      : 以10byte实数形式显示
*      : 按顺序以下一种形式显示.
以10bytes的实数显示时,会标记有ST0-ST7
以别的形式显示会有 MM0-MM7
点评: 无.
命令: WHAT
作用: 用来确定一个名字或表达式是否是已知类型  
语法: WHAT [name | expression]
用法:                
name      :任何符号名(不能被解释成表达式)
expression:任何表达式
WHAT 命令将分析它的参数,并和它已知的名字相比较,枚举每一个可能的匹配,显示出结果.
点评: 无.
命令: 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 1,INT 3清为NOP  
语法: ZAP
用法:                
ZAP 命令在跟踪程序时将程序中的INT 1,INT 3指令换为相等数量的NOP,这在用户为了调试程序方便而在程序中加杂INT 1或INT 3指令,过后又不想要时特别有用.需注意:只有当INT 1,INT 3出现在当前CS:EIP的前一条指令位置处才有用.
点评: 无.