Softice 命令速查表
命令 描述
. 在代码窗口中定位当前指令
? 计算一个表达式的值
A 写入汇编代码
ADDR 在SoftICE中显示或是切换内存区域
ALTKEY 改变用来呼叫SoftICE的热键
ALTSCR 切换SoftICE的视屏输出.
ANSWER 自动监控通讯端口及将输出转移到MODEM
BC 清除一个或多个断点
BD 使一个或多个断点失效
BE 使一个或多个断点恢复有效
BH 在SoftICE历史数据库中显示或是选择曾经设过的断点
BL 显示当前所设的断点
BMSG 在windows的消息上下断点
BPE 编辑一个已存在的断点
BPINT 在某个中断向量上下断点
BPIO 在输入输出端口上下断点
BPM 在内存单元上下断点
BPR 在一个内存范围上下断点
BPRW 在某个WINDOWS程序或代码段所在的内存区域上下范围断点
BPT 以前次的断点为模板,设定新的断点
BPX 在可执行语句上设定(或清除)断点
BSTAT 显示某个断点的状态
C 比较内存中两块区域的内容
CLASS 显示WINDOWS的类的信息
CLS 清除命令窗口中的字符
CODE 显示指令码
COLOR 显示或修改屏幕颜色
CPU 显示寄存器内容
CSIP 为所有断点设定一个界限(CS:EIP在其内)(16位程序)
D 显示某内存区域的内容
DATA 显示另一个数据窗口
DEX 在数据窗口中显示(或赋予)某个表达式
DIAL 将控制台重定向到MODEM
E 修改内存单元
EC 进入或退出代码窗口
EXIT 强行退出DOS程序或WINDOWS程序
EXP 显示DLL中的出口函数
F 填充某一块内存区域
FAULTS 打开或关闭错误跟踪功能
FILE 显示或切换当前源文件
FKEY 显示或修改当前快捷键定义
FLASH 在 P 和 T 命令执行过程中刷新Windows 屏幕
FORMAT 改变数据窗口的显示格式
G 执行到某一地址
GDT 显示全局描述符表
GENINT 强行产生一个中断
H 显示帮助信息
HBOOT 系统重新启动
HEAP 显示Windows全局堆
HEAP32 显示Windows全局堆
HERE 运行到当前光标所在行
HWND 显示窗口句柄的信息
I 从输入/输出(I/O)端口读入数据
I1HERE 遇到内嵌的INT 1指令时激活SoftICE
I3HERE 在遇到INT 3 指令时激活SoftICE
IDT 显示中断描述符表
LDT 显示局部描述符表
LHEAP 显示Windows 局部堆
LINES 改变SoftICE窗口的显示行数
LOCALS 从当前栈中列出局部变量
M 传送数据
MACRO 定义一个宏命令,使之执行一系列SoftICE指令
MAP32 显示当前所有32位模块的内存映象(图).
MAPV86 显示当前虚拟机的DOS内存映象
MOD 显示Windows模块列表
O 向I/O端口输出数据
P 单步执行程序
PAGE 显示页表信息
PAUSE 满屏后是否暂停显示
PCI 显示系统中每个PCI设备的情况.
PEEK 从物理内存中读数据
PHYS 显示某个物理地址对应的所有虚拟地址
POKE 向物理内存写数据
Print Screen 键打印屏幕内容
PROC 显示系统中所有进程的简要信息
QUERY 显示某个进程的虚拟地址映象
R 显示或更改寄存器的内容
RS 暂时恢复程序屏幕
SERIAL 将控制台转移到串口终端上
SET 显示或改变SoftICE的内部参数
SHOW 列出回溯跟踪历史缓冲区中的指令
SRC 在源程序,反汇编代码,两者混和之间切换显示.
SS 在源程序文件中查找字符串
STACK 显示某个调用栈
SYM 显示或设置符号
SYMLOC 重定位符号基址
T 单步跟踪
TABLE 改变或显示当前符号表
TABS 显示或修改在显示源文件时TAB键的宽度
TASK 显示Windows任务列表
THREAD 显示线程信息
TRACE 进入或退出摹拟跟踪模式
TSS 显示任务状态段和I/O端口的挂接
TYPES 列出当前内存区域(context)中的类型名
U 反汇编指令
VCALL 显示VxD可调用例程的名字和地址
VER 显示SoftICE版本号
VM 显示虚拟机的信息
VXD 显示Windows VxD 映象
WATCH 加入一个监视窗口
WC 打开或关闭代码窗口;或改变代码窗口大小
WD 打开或关闭数据窗口;或改变数据窗口大小
WF 以浮点或MMx形式显示浮点栈
WHAT 用来确定一个名字或表达式是否是已知类型
WL 打开或关闭本地窗口;设置本地窗口的大小
WMSG 显示Windows消息的名字和消息代码
WR 打开或关闭寄存器窗口
WW 打开或关闭监视窗口;或改变监视窗口的大小
X 从SoftICE窗口中退出
XFRAME 显示当前的异常出错句柄框
XG 在模拟(回溯)跟踪状态中运行程序到某一地址
XP 在模拟跟踪模式中执行程序
XRSET 重置回溯跟踪历史缓冲区
XT 在模拟跟踪模式中单步跟踪程序
ZAP 将内嵌的INT 1,INT 3清为NOP
////////////////////////////////////////////////
◆ Softice预定义功能组合键的作用 ◆
F1:帮助
F2:寄存器显示/关闭切换
F3:源程序/反汇编代码切换(程序有源程序时可用)
F4:Softice界面/屏幕原始画面显示切换
F5:退出Softice窗口
F6:进入/退出代码窗口
F7:程序运行到光标所在处
F8:单步跟踪
F9:在光标所在位置设断点
F10:单步执行(跳过子程序CALL)
F11:程序执行到ES:ESP指向的地方
F12:程序执行到RET指令处,即从子程序CALL中返回
SHIFT+F3:改变数据窗口的显示格式,按照“字节->字->双字->短实型->长实型->10字节实型”的方式循
环显示
CTRL+F8:模拟跟踪模式中单步跟踪
CTRL+F9:退出当前模拟跟踪模式
CTRL+F10: 模拟跟踪模式中单步执行
CTRL+F11: 从历史跟踪缓冲区的最后一条开始显示指令
CTRL+F12: 从最初的一条指令开始模拟跟踪
ALT+F1:显示/关闭寄存器窗口
ALT+F2:显示/关闭数据窗口
ALT+F3:显示/关闭程序窗口
ALT+F4:显示/关闭监视窗口
ALT+F5:清除命令窗口中的字符
ALT+F8:模拟跟踪模式中反方向单步跟踪
========================================================================
设定断点和目标断点
本节向你展示如何设置两个常用类型的断点:一次性断点和附着断点。
设定一个一次性断点
下面的步骤演示如何设置一次性断点。一次性断点再触发之后即被清除。
1. 将焦点移到代码窗口,使用鼠标在窗口上单击或按Alt+C键。
如果你想将焦点再移回命令窗口,再按一次Alt+C。
2. 使用方向键向下滚动或用U命令将光标放置在61行上--第一次调用API函数Re
gisterClass的地方。使用U命令如下:
:U .61
SoftICE将61行置于代码窗口顶端。
3. 使用HERE命令(F7)执行61行。
HERE命令从当前指令执行到光标位置。HERE指令在源代码的的指定位置设置一个
一次性断点,并执行到断点位置。断点触发后,SoftICE自动清除它以免再次触发
。
下面是突出显示的当前行:
if(!RegisterClass(&wndClass))
注意:你可以用G(go)命令指定要执行到的地址或行数来完成相同的功能:
:G .61
设定附着断点
下面的步骤演示了另一种类型的触发断点:附着断点,你必须明确指明需要清除
的断点。
1. 下一个RegisterClass调用在第74行上。将光标放在74行,输入BPX命令(F9
)设置一个执行断点。BPX命令通过在源代码中插入一个INT 3的指令来设置一个
执行断点。注意设置了断点的行被突出显示了。
2. 按F9键清除这个断点。
如果你使用了奔腾级的处理器,你可以用鼠标在代码窗口的任意一行双击来设置
或清除断点。
3. 在74行设置断点,然后用G或X命令(F5)执行指令直到断点触发:
:G
当INT 3指令执行是,SoftICE窗口弹出。
同HERE指令不同,它只是设置了一个一次性断点,BPX指令设置了一个附着断点,
它将保留到你清除它为止。
4. 要看当前设置的断点信息,使用BL命令:
:BL
00) BPX #0137:00402442
注意:你看到的地址可能不同。
从BL的输出来看,一个断点已设置在地址0x402442。这个地址相当于源文件INIT
.C的第74行。
5. 你可以使用SoftICE的表达式计算器将行数转换成地址。要找到第74的地址,
使用?命令:
:? .74
void * = 0x00402442
6. RegisterClass函数的实现相对而言很直接,所以没有必要跟踪它的每一行源
码。使用P命令和RET参数返回到函数调用处:
:P RET
P命令的RET参数使SoftICE执行指令到函数调用结束。因为RegisterAppClass是在
WinMain函数里调用的,SoftICE返回到WinMain函数中紧跟着RegisterAppClass函
数的下一条语句。下面是WinMain中突出显示的行:
Msg.wParam = 1;
7. 使用BC命令和通配符参数清除所有断点:
:BC *
使用SoftICE信息命令
SoftICE提供了非常广泛的信息命令显示程序或系统状态的细节。本节教你其中的
两个命令:H(help)和CLASS。
1. H和CLASS命令需要有足够大的窗口来显示信息。所以用WL命令将本地窗口关
闭。命令窗口将自动调整它的尺寸。
2. H命令提供了关于SoftICE所有命令的一般性帮助和一些指定指令的帮助细节
。要看关于CLASS命令的细节,将CLASS作为H命令的参数:
:H CLASS
Display window class information
CLASS [-x] [process]|thread|module|class-name]
Ex:CLASS USER
帮助的第一行提供了关于命令的介绍。第二行是使用的细节,包括命令的选项和
参数。第三行是关于这个命令的例子。
3. RegisterAppClass函数的目的是要注册由GDIDEMO程序创建窗口所使用的win
dows类模板。使用CLASS命令检验由GDIDEMO所注册的类:
:CLASS GDIDEMO
Class Name Handle Owner Wndw Proc Styles
------------------Application Private------------------
BOUNCEDEMO A018A3B0 GDIDEMO 004015A4 00000003
DRAWDEMO A018A318 GDIDEMO 00403CE4 00000003
MAZEDEMO A018A280 GDIDEMO 00403A94 00000003
XFORMDEMO A018A1E8 GDIDEMO 00403764 00000003
POLYDEMO A018A150 GDIDEMO 00402F34 00000003
GDIDEMO A018A0C0 GDIDEMO 004010B5 00000003
注意:这个例子仅显示由GDIDEMO程序所指定注册的类,由其它Windows模块所注
册的类,如USER32,被忽略了。
CLASS命令的输出为GDIDEMO进程活动所注册的widnows类提供了总结性信息。它包
括类名、内部WINCLASS数据结构的地址、注册类的模块、类的windows程序缺省地
址和类状态标志的值。
注意:要得到关于windows类定义更确定的信息,使用CLASS和-X选项,如下:
:CLASS -X
使用符号和符号表
现在你熟悉了如何使用SoftICE来单步调试、跟踪和建立触发断点。现在是探索符
号和表的时候了。当你载入一个程序的符号时,SoftICE建立了一个包含所有程序
所定义的符号的符号表。
1. 使用TABLE命令看载入的所有符号表:
:TABLE
GDIDEMO [NM32]
964657 Bytes Of Symbol Memory Available
当前活动的符号表用粗体显示。符号表用来解析符号名。如果当前表不是你想引
用的符号表,使用TABLE命令和指定的表名来激活它:
:TABLE GDIDEMO
2. 使用SYM命令在当前符号表中显示符号。随着GDIDEMO被设为当前表,SYM命令
产生如下类似的简化输出:
:SYM
.text(001B)
001B:00401000 WinMain
001B:004010B5 WndProc
001B:004011DB CreateProc
001B:00401270 CommandProc
001B:00401496 PaintProc
001B:004014D2 DestroyProc
001B:004014EA lRandom
001B:00401530 CreateBounceWindow
001B:004015A4 BounceProc
001B:004016A6 BounceCreateProc
001B:00401787 BounceCommandProc
001B:0040179C BouncePaintProc
列表中的符号名来自.text的可执行部分。.text部分典型用于过程和函数的。本
例中显示的符号都是GDIDEMO的函数。
设定条件断点
GDIDEMO程序中定义了一个LockWindowInfo函数的符号。这个例程函数的目的是得
到指向一个窗口的特别常量的指针值。
要学习条件和内存断点,你需要完成以下步骤:
在LockWindowInfo函数中设置一个BPX断点。
编辑断点以使用条件表达式,就是设置一个条件断点。
设置一个内存断点以监视关键信息的访问。参考后面设定读写内存断点的叙述
。
设置BPX断点
设置条件断点之前,你需要在LockWindowInfo上设置一个BPX风格的断点。
1. 在LockWindowInfo函数上设置一个BPX风格的断点:
:BPX LockWindowInfo
当GDIDEMO的一个窗口要在它的客户区写信息时,它调用LockWindowInfo函数。每
一次LockWindowInfo被调用,SoftICE窗口都会弹出以供调试。GDIDEMO窗口不断
更新,所以这个断点经常被触发。
2. 使用BL命令查看设置的断点。
3. 用X或G命令退出SoftICE
因为LockWindowInfo函数的关系,SoftICE的窗口几乎立刻又会弹出。
编辑断点
从47行LockWindowInfo函数的原型,你能接受一个HWND的参数并返回一个void类
型的指针。这HWND参数是要往自己客户区写信息的窗口的句柄。现在,你想去修
改存在的断点,增加一个条件断点以隔离指定的HWND的值。
1. 在设定条件表达式之前,你要得到关于POLYDEMO窗口的HWND的值。HWND命令
提供了关于程序窗口信息。用HWND命令并指定GDIDEMO进程:
:HWND GDIDEMO
下面的例子描述你使用Windows NT所看到的情况。使用Windows 95的话,输出可
能会不同:
Handle Class WinProc TID Module
07019C GDIDEMO 004010B5 2D GDIDEMO
100160 MDIClient 77E7F2F5 2D GDIDEMO
09017E BOUNCEDEMO 004015A4 2D GDIDEMO
100172 POLYDEMO 00402F34 2D GDIDEMO <---(就是这个)
11015C DRAWDEMO 00403CE4 2D GDIDEMO
POLYDEMO窗口句柄是粗体并带有下划线。你将使用这个句柄来建立条件表达式。
如果POLYDEMO窗口没有出现在HWND的输出中,退出SoftICE并重复步骤1直到窗口
建立为止。
本例中所使用可能与你所输出的值不同。为了是调试正常进行,你必须使用HWND
命令得到HWND的实际值。
使用POLYDEMO窗口句柄,你可以设置条件表达式以监视LockWindowInfo函数的调
用,寻找匹配的句柄值。当LockWindowInfo函数调用时含有被POLYDEMO窗口的句
柄,SoftICE将弹出。
2. 因为你已经在LockWindowInfo处设置了一个断点,用BPE命令(Breakpoint
Edit)修改存在的断点:
:BPE 0
当你使用BPE命令修改存在的断点时,SoftICE将断点的定义放置在命令行里以便
它可以很容易的编辑。BPE命令的输出如下:
:BPX LockWindowInfo
光标停在命令行末尾等待你输入条件表达式。
3. 记住用HWND命令找到的POLYDEMO窗口句柄的值来替代本例中的值(100172)
。你的条件表达式和下面例子类似。条件表达式用粗体打印:
:BPX LockWindowInfo IF ESP-> == 100172
注意:Win32在堆栈和函数的入口点传递参数。第一个参数相对ESP寄存器有正的
偏移量4。使用SoftICE的表达式计算器,以这样的形式表达:ESP->4。ESP是CPU
的堆栈指针寄存器,"->"操作符使左边的表达式(ESP)定位在右边表达式(4)
所指定的偏移量上。要得到更多关于SoftICE表达式计算器的信息,参考第八章。
4. 使用BL命令检验断点和条件表达式正确设置了。
5. 用G或X命令退出SoftICE。
当条件表达式为TURE(真)时,SoftICE窗口弹出。
设定读写内存断点
================================================================================
呼出SoftICE窗口
一旦SoftICE载入了,它在下面的情况下会自动弹出:
在SoftICE载入时。缺省状态下,SoftICE的初始化字符串包含X(Exit)命令,
因此它在打开后立即又关闭了。参考后面"修改SoftICE初始化设置"一节。
在你按下Ctrl+D时。这个热键控制SoftICE屏幕的开关。
在满足断点条件时。
当SoftICE捕捉到系统的致命错误时。
在Windows NT下当系统崩溃而导致"蓝屏"模式时。
当SoftICE屏幕弹出后,在你的计算机上所有后台活动都被挂起了,所有中断都被
禁止。由SoftICE通过直接硬件访问来完成视频和键盘的输入/输出。
提示:使用ALTKEY命令改变SoftICE缺省的呼出键(Ctrl+D)。
启动时禁用SoftICE
如果你在Windows NT下将SoftICE安装为启动或系统驱动程序模式,你可以在启动
时取消它:在"蓝屏文本"状态时当屏幕底部显示如下消息后按ESC键:
Press ESC cancel loading SoftICE
如果在Windows NT下你将SoftICE安装为自动驱动程序,你不能取消它,除非你改
变它的启动模式并重启计算机。在看起来不象是因为SoftICE导致的启动问题,在
Windows NT启动菜单中选择下面的选项:
Last known good configuration
(附注:NT 4.0 用空格键来选择这个选项)
使用SoftICE窗口
SoftICE屏幕居中显示以便调试。它提供七个窗口和一个帮助行来观察和控制调试
过程中的不同方面。这些窗口按重要性顺序列表如下:
------------------------------------- -
SoftICE窗口 使用
命令窗口 输入用户的命令并显示信息
代码窗口 显示反汇编指令和源代码
本地窗口 显示当前堆栈结构
观察窗口 使用WATCH命令观察变量的值
寄存器窗口 显示和编辑当前寄存器和标志位的状态
数据窗口 显示和编辑内存
FPC堆栈窗口 显示当前FPU(浮点单元)堆栈状态和/MMX寄存器
帮助行 提供关于SoftICE命令的信息
------------------------------------- -
缺省时,SoftICE显示帮助行和命令、代码、本地窗口。你可以在需要的时候打开
或关闭其它的窗口。
调整窗口大小
缺省时,SoftICE屏幕共25行以显示信息于不同的窗口。如果你的显示选择不是单
色屏幕,你可以使用LINES命令将SoftICE屏幕在43、50、60行之间转换,替换标
准的25行。单显屏幕限制在25行上。
例子: LINES 60
控制窗口
你可以对SoftICE窗口做如下操作:
除命令窗口外,打开或关闭所有其它窗口
调整代码、数据、本地和观察窗口的大小
滚动代码、命令、数据、本地和观察窗口
SoftICE提供了两种方式控制这些窗口:鼠标和键盘输入。
打开和关闭窗口
要打开SoftICE窗口,使用下表中合适的命令。要关闭窗口,重复命令或利用鼠标
,如果有的话。用鼠标关闭窗口,选择窗口底部的行,拖它超过本窗口顶部即可
。
命令 窗口
WC 代码
WD 数据
WF FUP堆栈
WL 本地
WR 寄存器
WW 观察
重调窗口
要重调窗口,拖住窗口底部的行向上或向下。你可以使用和你打开或关闭窗口一
样的命令来调整窗口大小。键入命令,跟着十进制的窗口行数。
例子: WD 7
注意命令窗口的行数在你调整窗口时自动调整。虽然你不能明确调整命令窗口大
小,其它窗口大小的改变会自动重调命令窗口。
在窗口中移动光标
缺省下关闭定位在命令窗口。要将光标移动到其它窗口,在你想放置光标的地方
单击鼠标。如果光标位于命令或代码窗口,你可以使用Alt键和下表中的按键组合
来移动光标。重复同样的组合将光标返回命令或代码窗口。
------------------------------------- -
窗口 Alt键组合
代码 Alt+C
数据 Alt+D
FPU堆栈 不能将光标移到FPU堆栈窗口
本地 Alt+L
寄存器 Alt+R
观察 Alt+W
------------------------------------- -
滚动窗口
你可以滚动代码、命令、数据、本地和观察窗口。FPU堆栈和寄存器窗口不能滚动
。它们固定是4行和3行。
SoftICE提供两种方式滚动窗口:键盘序列和鼠标滚动箭头。下表是详细介绍:
--------------------------------------- -
滚动方向和距离 键盘序列 鼠标活动
前页 PageUP (呵呵...和Windows操作差不多。
后页 PageDown 有箭头符号,敲鼠标就好了。)
上一行 UpArrow
下一行 DownArrow
跳到源文件开始 Home 不支持
跳到源文件末尾 End 不支持
左移一个字符 LeftArrow
右移一个字符 RightArrow
==========================================================================
调整窗口行数:lines 60
鼠标直接拖动边框调整窗口;
symbol loader->open(exe,sys)->module->setting
-->tranlation->package source file with symbol table
->module->translate
->load->*.nms
start softice->
file * ->src切换源代码显示->鼠标移动到指定行上->F9设断点
============================================================================
阅读(1152) | 评论(0) | 转发(0) |