※黑客攻防指南※===>工具介绍==>SoftICE命令中文解说(二)

SoftICE命令中文解说(二)

SoftICE for WIN95中文命令解说(五)

命令: 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 长度的数据,如果数据不够长度,将重复数据,直到达到长度为止.

点评: 无

SoftICE for WIN95中文命令解说(六)


命令: 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 又调用显示驱动程序时,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-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-5fhGENINT强行产生一个中断,用于SoftICE和别的DEBUGGER协作的时侯,如:GENINT nmi 将使SoftICE将控制返还给CodeView For Dos.(对其他DEBUGGER,请尝试0,1,2,3)GENINT还用于测试中断例程.但SoftICE不检测一个中断是否有效,它只是摹拟中断的产生,所以当用此命令时要注意相应的中断例程是否存在.

点评: 无
SoftICE for WIN95中文命令解说(七)


命令: 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 命令.


SoftICE for WIN95中文命令解说(八)


命令: 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根据局部变量的类型来用不同的形式显示它们,如果是指针,则显示所指向的数据.如果是结构,则显示结构符号.如果既不是指针,又不是结构,则显示本身值.

点评: 无.


SoftICE for WIN95中文命令解说(九)


命令: 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可能是按得最多的键了,好好保护你的键盘吧!

主目录 分目录

Copyright By「黑白网络工作室」2002 All Rights Reserve