. 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的前一条
指令位置处才有用.
(编辑:天命孤独)
新闻热点
疑难解答
图片精选