精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>● 软件使用>>★软件课堂★>>Soft-ice使用手册>>Soft-ice使用手册 三章二回7

主题:Soft-ice使用手册 三章二回7
发信人: sanvador()
整理人: webfan(2000-08-08 20:49:11), 站内信件

设定断点和目标断点
本节向你展示如何设置两个常用类型的断点:一次性断点和附着断点。
  设定一个一次性断点
下面的步骤演示如何设置一次性断点。一次性断点再触发之后即被清除。
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做完,不过过于求快效果一定不好。我还有一大堆
的资料和文章没有读,等我慢慢把汇编做完了,什么都晚了。这些天我一直想看
几部好的录象,可惜是一点时间也没有,烦死我了。要是有个人帮助我一下的话
,情况或许会好的多了...唉,谁会主动和我合作啊?!

Sanvaodr.KT

--
无意苦争春
一任群芳妒
零落成泥碾作尘
依旧香如故

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.137.190.240]

[关闭][返回]