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(见稍后)命令看代码,记
录原来的代码和改过的代码后再用工具软件如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, 9600,19200,23040,
            28800,38400,57000,115000
            其中38400为默认波特率.
.I=INIT     MODEM的初始化字符串.

解决方案 »

  1.   

    二、SoftICE常用命令简介由于SoftICE命令操作较多,在此就把几个常用的命令介绍一下,其它详细说明请参考附录的"SoftICE手册"。
    1、 G命令
    语法:G [=start-address] [break-address]
    作用:执行程序,后面如果加地址,则执行到该地址为止。
    注意: TRW2000 中G命令与SoftICE稍有不同,SoftICE中G命令必须是在当前段中,这时IP(EIP)为指定值才中断;而TRW2000则不管段址如何,只要IP(EIP)是指定的值便停下,TRW2000这个特性大大方便我们的操作。
    2、P命令
    语法: P [ret]
    作用:单步执行程序。
    只执行P时,相当于按下F10键。在汇编模式中,当遇到 CALL、INT、LOOP、REP指令时,P将不跟踪进去,直到这些指令执行完毕,控制才返回SoftICE,换句话说,P命令是"跨"过这些指令的。
    P RET 命令相当于快捷键 F12。SoftICE将一直单步执行直到它找到一条返回语句(RET、RETF),也就是说让SoftICE一直执行代码,直到出现 RET (XXXX) 命令,再跳出来拦截,这时,当前 IP(EIP) 会是停在 RET (XXXX) 后的某一条语句上,通常是在某一个CALL XXXXXXXX 后面。由于我们通常用SoftICE在某些底层的Windows函数上设置断点,所以 F12 是很管用的。因为程序的作者用的是高级语言,Windows又是提倡"透明",不希望程序员知道底层的操作,而只提供给他们高层的接口,而相当多的高级函数调用某个一定的底层函数,所以当你在底层函数上下断点,再用F12,就可以知道他用的是什么函数了。
    3、T命令
    语法:T [=start-address] [count] 
    start-address:执行起始地址;
    count:指定SoftICE将单步跟踪多少次才停止。
    作用:单步跟踪。
    T命令相当于功能键F8,如没指定起始地址,将从CS:IP(EIP)指向的指令开始执行,此时当遇到 CALL、LOOP等指令时,T将跟踪进去。
    注意: F8和F10功能键的主要差别就在这,遇到 CALL、LOOP等指令时,F10是路过,而F8是跟进去。
    4、BPX命令
    语法:BPX [address] [IF expression] [DO "command1;command2;..."] 
    address :断点所在的线性地址;
    IF expression:条件表达式,只有条件为"真"时,SoftICE才在断点处弹出;
    Do command:当SoftICE弹出时,自动执行的一些命令。
    作用:在可执行语句上设置(或清除)断点。
    BPX 用来在指令处下断点,程序一旦执行到此,SoftICE就会弹出。当光标在代码窗口中时,直接打入BPX就会在光标所在语句处设断点,再打BPX 就取消。BPX的快捷键是 F9,当光标在代码窗口中时,按F9就是设定(取消)。
    BPX 也可用函数名来作地址参数:格式为"BPX 函数名"。
    这个函数名可以是任意一个API函数、虚拟机指令、DLL文件的引出函数等等,功能强劲。例:
    :bpx messageboxa(不用区分大小写)//只要程序调用了此函数,SoftICE将中断;
    :bpx GetWindowTexta if EAX==8 // 当调用GetWindowTexta函数时EAX=8,SoftICE将中断;
    :BPX GetWindowTexta do "d EAX"// 当 GetWindowTexta被中断,自动显示EAX的值。 
    注意: TRW2000与SoftICE条件格式有点不同,如在SoftICE下的是:bpx loadlibrarya do "dd esp->4",而相同的用法在TRW2000中是:bpx loadlibrarya do "dd *(esp+4)" 。另外SoftICE中用鼠标双击指令行可设断,而TRW2000中不行,只能按F9.
    5、BPM命令
    语法:BPM[size] address [条件表达式] DO[执行的命令]
    size:内存单元大小,B为字节(默认);W 为字;D 为双字;
    verb:所进行的操作,R为读;W为写;RW为读写(默认);X 为执行。
    作用:设置内存访问断点。
    注意: BPM用了DR3-DR0寄存器,所以最多只能设四个断点。
    6、BMSG命令
    语法:BMSG window-handle [条件表达式] DO[执行的命令]
    window-handle:消息发向的窗口句柄,即消息名
    作用:在Windows的消息上下断点。
    Windows本身是由消息驱动的, 所以跟踪一个消息会得到相当底层的答案。如:
    我们执行记事本程序(Notepad),然后Ctrl+D激活SoftICE输入:
       :bmsg wm_char 
       :g 
    然后回到Notepad中,随便按一个键,SoftICE就激活了;原因在于我们在按键消息上设置了断点(退出SoftICE别忘下命令"BC *"清除刚才下的断点)。
    7、BL命令
    语法:BL
    作用:显示当前所设的断点
    注意: SoftICE会把所有断点按从0开始的编号列出,而TRW2000是从1开始编号列出。
    8、BC命令
    语法:BC list | *
    list:可以清除指定编号的断点,多个时中间用空格或逗号隔开。
    * :清除所有的断点。
    作用:清除一个或多个断点
    9、BD命令
    语法: BD list | *
    list:可以是单个,也可以是一系列断点,中间用空格或逗号隔开。
    * :禁止所有的断点
    作用:使一个或多个断点失效。
    10、BE命令
    语法:BE list | *
    作用:使一个或多个断点恢复有效。
    用来恢复前次用 BD 命令使之失效的断点。 (每当新定义断点或编辑断点时,系统自动将其置为有效)
    11、BPE命令
    语法:BPE index_number(断点索引号)
    作用:编辑一个已存在的断点。
    12、R命令
    语法:R 寄存器名
    作用:显示或更改寄存器的内容。 
    其可更改所有的寄存器的值。此命令较常用的一个功能是更改状态寄存器(PSW )的值,格式:R FL 标志位。比如当前 Z标志位(零位)为置位状态,执行"r fl z"之后会被清除;如果C标志位为清除状态,那么"r fl c"将使之置位。
    注意: 利用此命令很方便在一些跳转指令上改变方向。
    13、A命令
    语法:A [地址]
    作用:进入小汇编状态,可直接写入汇编代码。
    如不加地址值,直接在当前CS:IP(EIP)处汇编。用SoftICE内置的汇编器在内存中写入汇编代码。汇编器支持标准的80x86指令集,包括386、486、Pentium、Pentium-Pro、MMX协处理器,新版的SoftICE还支持AMD的3D Now!、PII、PIII的特有指令集。
    14、D命令
    语法:D[size] [address [l length]]
    size:B 字节;W 字;D 双字; S 短实型;L 长实型;T 10b长实型
    作用:显示某内存区域的内容。
    15、S命令
    语法:S [-cu][address L length data-list]
    address:搜索的起始地址
    length :搜索的长度(字节长)
    data-lis:可以是一系列字节,也可以是字符串,字符串可以用单引号,也
    可以用双引号括住.
    -c :使查找区分大小写
    -u :查找Unicode 编码的字符串.
    作用:在内存中搜寻特定数据,如果找到数据,那将在数据窗口中显示出来,如果在找到后,你还要继续查找,使用不带参数的S命令。由于S命令忽略不在内存中的页面,因此你可以使用32位平面地址数据段描述符30h在整个4GB(0~FFFFFFFFh )空间查找。如:
    s 30:0 l FFFFFFFF "78787878" //在此令在内存中查找字串"78787878"位置。
    注意: TRW2000中S命令的字串应是单引号(而SoftICE皆可)。如:s 30:0 l FFFFFFFF '78787878'.
    16、E命令
    语法:E[size] [address [data-list]] 
    作用: 修改内存单元
    17、U命令
    语法:U [address [l length]] | [symbol-name]
    address :段:偏移量或选择符:偏移量
    symbol-name:将从指定的函数开始反汇编
    length :反汇编的长度(字节)
    作用: 反汇编指令 
    你可以利用此命令抓取汇编代码,运行LOADER32后,将历史缓冲区(history buffer)调大些(默认为256,不能放足够多的缓冲数据)。然后切换到SoftICE调试画面下,来到你要抓取的地方,反汇编这些代码,如:U CS:EIP L 1000 ,立即按Ctrl+D返回到Windows环境,再次来到symbol loader程序,选择"File/Save SoftICE History As…"。
    注意: 在TRW2000下可以直接反汇编代码输出到一个文件:
    u 401000,402000 >路径/myfile。
    18、FAULTS命令
    语法:FAULTS [on | off] 
    作用:打开或关闭错误跟踪功能 
    由于SoftICE做为一个DEBUGGER,FAULTS 默认为ON,所以一旦CPU有非法指令,SoftICE就会不停地弹出。
    19、?命令
    语法:? 表达式
    作用:计算一个表达式的值
    一个非常高级的计算器,另外由于可以显示ASCII,所以可以很方便地在各种数制之间察看。
    20、.命令
    语法: .
    作用:在代码窗口中定位当前指令 
    当你在代码窗口中上下浏览时,有可能走得很远,那么这时一个"."命令会让你在下一瞬间回到SoftICE当前所在的CS:EIP处。
    21、EXP命令
    语法: EXP [函数名]
    作用: 显示DLL中的出口函数
    函数名可以指定出其前几个字符, 可以用?来做替代不定字符,这样你就可查找相关函数及其是哪个DLL文件了。这对于你在Win2K系统上非常实用,Win2K系统的KERNEL32.DLL中许多函数形式和Windows 9x可能不同,用此命令你就可找到正确的函数名了。
    22、PMODULE命令(TRW2000特有命令)
    作用:'pret'(相当于按<F12>) 直至CS:EIP位于模块中,但比F12更实用,其可以快速回到你的当前程序领空,不用按多次F12了
    23、SUSPEND命令(TRW2000特有命令)
    作用: 暂停当前的线程,并退出 TRW2000,按热键返回,此命令相当方便。
    24、ver blue命令(TRW2000特有命令)
    如你的TRW2000背景颜色很暗,可通过此命令来调整背景。