发信人: sanvador()
整理人: CyberCowBoy(2000-08-08 20:53:08), 站内信件
|
叶眉上的格言:
Mistakes are a fact of life. It is the response to error that counts.
Nikki Giovanni
第六章 使用SoftICE
同时调试多个程序
Symbol Loader允许你一次载入多个符号表。因此,你可以调试包含数个不同组件 的比较复杂的系统软件集。如应用程序、DLLs、驱动程序。
使用TABLE命令查看当前载入的所有符号表列表并选择一个不同的符号表。当你在 程序中遇到断点并且此程序有相应的符号表,输入TABLE命令跟着符号表名的前几 个字母,将当前符号表改为与程序相匹配的符号表。
如果你不知道那一个表是当前表,输入TABLE命令(不带参数)列出所有载入的表 。当前表突出显示。
你也可以将表转换为一个与你当前执行的代码不匹配的符号表。这在向一个不是 你当前执行的程序中设置断点时比较有用。
跟踪错误
SoftICE对下面类型的代码提供错误跟踪支持:
Ring-3 32位保护模式(Win32程序)
Ring-0 驱动代码(内核模式设备驱动程序)
Ring-3 16位保护模式(16位Win程序)
SoftICE不为DOS窗口提供错误跟踪。这包括直接的V86程序和DOS扩展应用程序。
下面的部分介绍了错误跟踪支持。
Ring-3 32位保护模式(Win32程序)
SoftICE跟踪所有无法处理的异常,它们通常导致出现错误对话框。SoftICE自动 重执行导致错误的指令,弹出SoftICE窗口并显示如下类似的指令和消息:
Break due to Unhandled Exception NTSTATUS=STATUS_ACCESS_VIOLATION
(因为无法处理的异常而中断)
NTSTATUS域包含与状态码相对应适当的错误消息。(参考Windows NT DDK下的包 含文件NTSTATUS.H以得到状态码的完整列表)
如果在SoftICE跟踪到错误之后程序继续执行,SoftICE忽略此错误并让系统做正 常的异常处理。例如,可能弹出一个应用程序错误对话框。
Ring-0 驱动代码(内核模式设备驱动程序)
SoftICE处理所有因为调用KeBugCheckEX而导致的Ring-0异常。KeBugCheckEX是W indows NT下显示"蓝屏"的例程。
如果KeBugCheckEX错误码是由页错误、GP错误、堆栈错误或有效的opcode导致的 ,SoftICE尝试重执行错误指令。控制停止在实际出错的指令上,所有寄存器都保 持它们的原始状态。如果代码在同样的指令上继续出错,重启或者选择EIP尝试忽 略这个错误,或修复错误条件。
如果KeBugCheckEX错误码不是由于页错误、GP错误、堆栈错误或有效的opcode导 致的,指令不能重新执行。SoftICE弹出并显示在KeBugCheckEX中的第一条指令和 如下类似的消息:
Break Due to KeBugCheckEX (Unhandled kernel mode exception) Error = 1E
(KMODE_EXCEPTION_NOT_HANDLED) P1=8000003 P2=804042B1 P3=0
P4=FFFFFFFF
错误域是十六进制的错误码和错误的描述。错误码的定义包含在Windows NT DDK 的包含文件bugcodes.h中。
P1到P4域是传递到KeBugCheckEX例程中的参数。这些域没有定义标准的含义。
如果你想从这一点(错误点)继续,Windows NT显示蓝屏然后挂起。如果你想在 蓝屏之后得到控制权,打开I3HERE (设置I3HERE为ON);Windows NT在显示蓝屏 之后执行一个INT 3的指令。
Ring-3 16位保护模式(16位Win程序)
SoftICE处理16位错误的跟踪(方式)不同于跟踪32位错误。当一个16位错误发生 时,Windows NT最终显示一个对话框描述这个错误,并让你选择CANCEL(取消) 或CLOSE(关闭)。
如果你单击CANCEL,错误指令重新执行,Windows NT产生一个调试通知以告知跟 踪错误指令。SoftICE使用调试器堆弹出并显示错误指令。换句话说,SoftICE在 你接到崩溃对话框并选择CANCEL之后才弹出,不是之前。
如果你选CLOSE,Windows NT并不重新执行错误指令,SoftICE也不会弹出。因此 ,如果你想调试错误,一定要单击CANCEL。
一些错误在Windows NT下显示多个对话框。如果出现这种情况,第一个对话框提 供了CLOSE和IGNORE(忽略)的选择。选择IGNORE使Windows NT忽略错误指令并继 续执行程序。选择CLOSE使Windows NT显示第二个对话框,如前所述。
地址关系
Windows 95和Windows NT给每一个进程分配它自己的地址空间,从0GB到2GB。并 且,Windows 95为每一个虚拟机(DOS和它的驻留驱动程序)保留前4MB。内存从 2GB到4GB是由进程共享。
指定进程的虚拟地址空间已知为_address context_(或_process_)。SoftICE在屏 幕底部状态栏的右边显示当前进程的名字。注意当前关系不一定是你的应用程序 的关系--特别是在你用热键进入SoftICE的情况下。如果当前关系不是你的程序的 关系,在检验和修改你的程序数据或在你的程序代码中设置断点之前用ADDR命令 转换到你的程序中去。
SoftICE在下列情况下自动为你转换地址:
如果你使用TABLE命令转换到一个32位表,SoftICE将当前地址关系设为那个模 块的地址关系。
如果你使用FILE命令从一个32位表中显示源文件,SoftICE将当前地址关系设为 那个模块的地址关系。
如果你在一个表达式中使用了一个符号名,SoftICE将地址关系改变为合适的关 系。这包括通过Symbol Loader载入导出符号。
当你改变地址关系时,当你在应用程序的私有地址空间(Windows 95的线形地址 为0x400000~0x7FFFFFFF,Windows NT是0到0x7FFFFFFF)观察代码或数据位置时 可能会感到迷惑。这是因为数据或代码的显示改变了,而selector:offset地址没 有变。这是正常的。线形地址保持不变,但潜在的系统页面表现在反映了指定地 址关系的实际内存(情况)。
SoftICE不允许你将地址关系指定为表达式的一部分。如果你在表达式中使用了纯 粹的地址,要确定当前地址关系正确设置了。例如,D 137:401000显示位于当前 地址关系401000的内存。
警告:在你使用纯粹的地址来设置断点之前,确定是在正确的地址关系中。Soft ICE使用当前关系来翻译地址。
使用INT 0x41 .DOT命令
在Windows 95下,Microsoft提供一系列的扩充以允许VxD或32位DLL和内核级调试 器通信。(看随Windows 95 DDK发布的DEBUGSYS.INC文件)。.DOT API允许VxD提 供指定的VxD的调试信息或通过内核级调试器的标准用户界面提供交互式扩展命令 。虽然API最初是为Microsoft的WDEB386设计的,SoftICE支持.DOT API的一个丰 富的子集。因此,你可以使用SoftICE访问VMM和VxD .DOT命令,以及许多你为你 自己的VxD实现的.DOT命令。
警告:所有.DOT的扩展调试功能都内置于VMM或其它VxD中。它不是SoftICE的一部 分。因此,SoftICE不能保证这些扩展正确工作。而且,.DOT扩展可能无法完成错 误校验,这样如果键入了无效输入可能导致系统崩溃。最后,SoftICE不能判定是 否一个.DOT扩展需要系统在某个指定状态下。因此,在不正确的时候使用.DOT扩 展可能导致系统崩溃。
SoftICE在Windows 95下支持以下的.DOT命令:
寄存器.DOT扩展
要得到寄存器dot命令列表,使用下面的命令:
.?
Debug_Query .DOT扩展
要调用这些.DOT句柄,在句点之后键入VxD名。许多这些命令,如果实现的话,会 显示菜单。例如,下面的VxDs在Windows 95零售和调试版本中都有有.DOT句柄:
.VMM
.VPICD
.VXDLDR
要决定一个VxD是否有.DOT句柄,试一下。在DDK的调试版本中的.DOT句柄有时提 供了比零售版本更多的功能。
VMM内嵌.DOT扩展
VMM在调试和零售版本中提供了许多.DOT扩展。要得到VMM支持的.DOT扩展列表, 使用下面的命令:
..?
在Windows 95零售版本中,..?命令产生下列.DOT扩展
.DOT扩展 介绍
.R[#] 显示当前线程的寄存器
.VM[#] 显示完整的VM状态
.VC[#] 显示当前的VMs控制块
.VH[#] 给出列表句柄,显示VMM链表
.VR[#] 显示当前VM的寄存器
.VS[#] 显示当前VMs虚拟模式堆栈
.VL 显示所有VM句柄列表
.DS 按标签倾卸保护模式堆栈
.VMM VMM状态信息菜单
.<dev-name> 显示指定设备信息
理解从R-3到R-0的转变
Windows 95下,在跟踪代码时很多次你会到达INT 0x30或ARPL。两种都是从Ring -3模式转换到Ring-0模式。当你希望跟随Ring转换时,你可以使用G命令执行到显 示在反汇编中的地址以节约通过大量VMM代码的时间和精力。
Windows 95使用下面的方式将Ring-3代码转换成Ring-0代码:
对于V86代码,Windows 95使用ARPL指令。它能引发一个无效的opcode错误。这 个无效的opcode句柄传递控制权给合适的VxD。ARPL指令通常用在ROM中。Window s 95仅使用一个ARPL,它改变V86的segment:offset来指示不同的VxD地址。例如 ,如果ARPL是在FFFF:0,Windows 95使用地址FFFF:0、FFFE:10、FFFD:20、 FFFC:30等等。
下面的例子显示一个反汇编的ARPL的输出样本:
FDD2:220D ARPL DI,BP ; #0028:C0078CC9 IFSMgr(01)+0511
对于PM代码,Windows 95使用中断0x30H。段0x3B什么也没有,除了中断0x30指 令。每一条这样的指令都将控制传给VxD。
下面的例子显示反汇编segment:offset 3B:31A的输出样本:
003B:031A INT30 ; #0028:C008D4F4 VPICD(01)+0A98
003B:031C INT30 ; #0028:C007F120 IOS(01)+0648
003B:031E INT30 ; #0028:C02C37FC VMOUSE(03))00F0
003B:0320 INT30 ; #0028:C02C37FC VMOUSE(03))00F0
003B:0322 INT30 ; #0028:C023B022 BIOSXLAT(05)=0022
003B:0324 INT30 ; #0028:C230F98 BIOSXLAT(04)=0008
003B:0326 INT30 ; #0028:C023127C BIOSXLAT(04)=02EC
--------------------------------
大概还有九天时间就可以完工了...很难熬哦!
因为我用拼音打字,所以有时候不仔细的话就容易打错。因为时间的原因吧,我 没有检查译过的文章。所以如果那里有大的错误、讹漏的话,请批评指正!
Sanvador.KT
[email protected]
-- 无意苦争春
一任群芳妒
零落成泥碾作尘
依旧香如故
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.137.191.225]
|
|