TRW2000是一个运行于Window 9x的系统级高级调试工具。什么是系统级?它意味着TRW2000是工作于操作系统和硬件之间的,因此TRW2000 能够调试或跟踪任何运行于Winodws平台上的程序代码(包括 DOS COM、DOS EXE、DOS 保护模式程序、16位的NE程序、32位的PE程序和工作于0级系统核心的VxD等等,也包括其他的系统级调试器)
欢迎访问我们的网站以取得有关TRW2000的最新信息。
作者:
刘涛涛 , P.R.China
朱南灏, P.R.China
非常感谢帮助过我的朋友们,他们是 yaodong , zhoutao , Herz buren ... 特别的,我要感谢我的朋友 Zhangyl,是他教会了我许多的有关GDI和显示的知识,才得以完成TRW的图形驱动程序。 另外,我非常怀念和Zhangyl、lee 以及 adrain一直玩Quake2的那些快乐的日子。。。
本手册的完成是在TRW2000的英文版的Readme的基础上翻译和整理而成,其中得到了吴朝相兄的大力支持;另外本文中一些指令的解释参考了Tianwei兄的SICEW的说明,在此一并表示衷心感谢。
--------------------------------------------------------------------------------
更新
1999.12,25 第一个发布版本 (1.00)
--------------------------------------------------------------------------------
用法
TRW2000 发布版本是一个ZIP压缩包。只要将其解压缩到一个目录下,然后运行TRW2000.EXE即可 , 无须安安装或者重启计算机。
如果您使用是智能鼠标,请在TRW2000.INI中设置 INTELLIMOUSE=ON in
如果您发现您的鼠标有问题或工作不正常,不妨试试在TRW2000.INI中设置 WINMOUSE=ON , 但我们不推荐您这样做,因为这样会降低稳定性。
如果您需要使用图形驱动,请在TRW2000.INI中设置 GRAPHICS=ON 。
设置 HOTKEY=XXXX 可以更改0级的热键,默认的0级热键是 Ctrl+M 。
设置 R3HOTKEY=XXXX 可以更改3级的热键, 默认的是 Ctrl+N
--------------------------------------------------------------------------------
简介
比SoftICE更加强大:
. 基于开放系统设计,支持插件(plug-ins) (测试版暂不支持)
. 动态装载,动态卸载,随时运行
. 自动显示所有 32位/16位 调用函数名
. 支持所有类型的显示适配器
. 支持即时写文件
. 支持更多的新命令: PDLL32 PNEWSEC TRNEWTCB TRNEWDOS PMODULE SUSPEND
--------------------------------------------------------------------------------
测试
测试一: Dos保护模式程序测试
1. 运行 TRW2000
2. 在Win95下打开一个DOS窗口
3. 在TRW2000的菜单中选择 'trnewdos'
4. 在DOS提示符下运行 PMODE.EXE
5. 返回 TRW2000中, 您会发现您已经停在该DOS应用程序的入口处了。
此时您可以有2种选择:
选择 1:
g 342
t
g 342
再按 <F8> 键数次, 就可以进入 16位的保护模式了!
如果使用'g 4dd', 再按 <F8> 键数次,则会进入 32位保护模式!
选择 2: 只要:
g if cs<100 ;进入 PM16
g if cs!=cs ;偿试进入 PM32
g if cs!=cs ;再来一次,现在就是 PM32 了
tes测试二:
运行 NOTEPAD.exe, 再在菜单中选择 "help"|"about notepad", 出现关于NOTEPAD的对话框。
运行 TRW2000 , 并按Ctrl+N 键激活 TRW2000
此时我们也有2种选择:
选择 1:
hwnd
从 hwnd 列表中找出'(Dialog)'的句柄
bpmsg <the_hwnd> wm_destroy
bl
g
回到 NOTEPAD 中, 按"OK", 此时便激活 TRW2000
按 F12(相当pret命令) 数次,我们就可以找到这个对话框来自以下的调用
shell32.dll call [DialogBoxParamA]
notepad.exe call [ShellAboutA]
选择 2:
在菜单中选"pmodule", 然后我们迅速回到 notepad.exe 中,就会发现停在调用代码 "call [ShellAboutA]"之后了.
tes测试三: 特权级3级的热键和 'SUSPEND'命令
运行 TRW2000
运行 NOTEPAD.exe,
按 特权级3级的热键 Ctrl+N 激活 TRW2000,
执行"PMODULE"命令
现在我们停在 NOTEPAD 的领空了!
再执行'SUSPEND'命令,我们将会返回 Windows ,
现在您会发现 NOTEPAD 被暂停了!!
此时您除了不能关闭它之外可以对它做任何事了,
再按一次 Ctrl+N , 您会发现我们又回到对NOTEPAD的跟踪高度状态中了。
tes测试四: 捕获新线程
在TRW2000的菜单中选择 'trnewtcb'
现在您无论是运行任何 32位或者 16位程序,TRW2000 都能马上捕获这个新线程并停在操作码的入口处。
tes测试五:
如果用鼠标右击缩小在系统栏中的TRW2000图标,会出现一个弹出菜单来,但假设我想知道系统是如何做的话,
只要运行 TRW2000, 用鼠标右击r系统栏中的任何一个用户图标,就会弹出相应的菜单来,再按Ctrl+N 激活TRW2000.然后执行'pmodule'命令,再用鼠标点击弹出菜单以外的任意地方使弹出菜单关闭,此时 TRW2000 便被激活并显示出这个弹出菜单的来源是调用'TrackPopupMenu'.
--------------------------------------------------------------------------------
热键
1. Ctrl + M
特权级0级的热键,能够立即中断Win9x。
相当于 Soft-ICE 的热键 Ctrl+D.
2. Ctrl + N
特权级3级的热键。
在绝大多数时候,我们并不需要在0级上中断。<ctrl+N> 可以中断Windows的特权级3级的前台线程。
这应该是我们最常用的。
如果在Win95的DOS窗口中按<Ctrl+N>, TRW将会中断当前正在运行的 DOS 或者 DPMI 程序。
如果在全屏幕的DOS方式下按<Ctrl+N>,将不会产生任何动作。
如果您按了<Ctrl+N>但却没有任何反应的话,可以再任意键或者动动鼠标,看看会发生些什么事哦 :D
相关内容:
HotKey命令
--------------------------------------------------------------------------------
代码窗口
在代码窗口中,
<F9>: 在当前的操作码设置断点,等同于
BPX cs:eip
<F7>: 运行到当前的操作码处,等同于
GOX cs:eip
--------------------------------------------------------------------------------
命令
.
?
ADD
ADDR
BC
BD
BE
BL
BP
BPE
BPIO
BPM
BPMSG
BPMX
BPX
CLEARDR
CODE
D
E
EC
EXP
EXP16
EXP32
FKEY
FILE
FONT
G
GDT
H
HBOOT
HELP
HotKey
HWND
IDT
LDT
LINES
MakePE
MOD16
MOD32
NAME
P
PAGE
PageIn
PDLL32
PEDump
PHYS
PMODULE
PNEWSEC
PRET
PROC
R
RS
S
SRC
SRCLINES
SS
Suspend
SYM
T
TABLE
task
thread
TRNEWDOS
TRNEWTCB
TRTCB
U
VCALL
VER
VM
VXD
VXDSYM
W
WC
WD
WMSG
WR
WS
X
. 代表当前值(如当前进程,当内存区域等)
? 帮助,相当于“HELP”或“H”命令
ADD STACK|DATA|DASM
增加一个堆栈/数据/反汇编窗口
例:ADD STACK
ADD DATA
ADD DASM
ADDR 内存句柄|过程名
显示或是切换内存区域
用来察看某一个任务的私有内存区域, 或是加参数[内存区域句柄|过程名]在TRW2000中切换某一任务的私有内存区域为当前可寻址的内存区域。
一些参数的显示: .HANDLE 内存区域控制块的地址
.PGTPTR 每个任务私有页表的起址
.TABLES 每个私有页表中的表项数目
.MINADDR 每个任务的线性地址的起址
.MAXADDR 每个任务的线性地址的终址
.MUTEX VMM用于页表管理的句柄
.OWNER 使用这块内存区域的实例的名字。如果有多个相同名字的实例运行,ADDR带OWNER名字切换的话,切到表中的第一个有此NAME的实例所占的内存区域。所以带HANDLE切换的话比较精确。
当用ADDR加参数后,可以用上面提到过的"."命令来回到TRW2000弹出时所属的任务内存区域。
BC list|*
清除一个或多个断点
用法:清除断点后,用BL命令就看不到断点列表,且被清除的断点不再起作用。
参数: list: 可以是将要清除的一系列断点,中间用空格或逗号隔开。
* : 清除所有的断点。
BD list|*
使一个或多个断点失效
使某个断点失效与 BC 命令的清除不同,暂时失效的断点可以用 BE 命令来恢复。而 BC 命令是彻底清除。
参数:list: 可以是单个,也可以是一系列断点,中间用空格或逗号隔开。
* : 禁止所有的断点。
BE list|*
恢复被 BD 命令使之失效的断点。(每当新定义断点或编辑断点时,系统自动将其置为有效)
参数:list: 可以是单个,也可以是一系列断点,中间以空格或逗号隔开。
* : 恢复所有的断点。
BL 显示当前所设的断点
用 BL 命令显示当前所有断点的序号(这个序号就是使用BC BD BD等命令时要指定的)、类型、是否被禁止等信息。
如果是被BD禁止的断点,会在序号后出现一个"*"号。
BP [address][if (condition)]
设置通过执行地址或所设条件激发的断点。
例:BP if (eip>10000)
BPE number
编辑一个已存在的断点。
用BPE命令可以很方便地修改一个已经存在的断点。
但要注意一点: BPE 在执行时,会先将你所要修改的断点清除,然后再将改过的使能。
如果你在修改时按ESC键退出修改,那么原先的断点也就不存在了, 修改错误的结果也是一样的,会造成原先的断点消失。
BPIO port
设置一个由I/O端口触发调试寄存器断点。
相关内容: BreakPoint Overall
BMSG hwnd [msg] hwnd为句柄 msg为用于触发的消息
BPMSG hwnd [msg]
设置由Windows消息触发的断点
相关内容:
WMSG
BreakPoint Overall
例:
BMSG 12c wm_destroy
BPM address R
BPM address W
BPM address X
通过DRx设置一个硬件断点
相关内容: BreakPoint Overall
BPMX 地址
通过DRx设置一个可执行的断点
等同于命令 'BPM address X'
BP [[seg:]address]
BPX [[seg:]address]
执行时断点
TRW 会在代码中相应位置插入一条 int3(0xcc) 指令。
相关内容:
BreakPoint Overall
BPMX
CLEARDR 清除DRx寄存器
CODE [ON|OFF|number]
设置代码窗口的显示方式
设为ON则显示16进制的机器码,设为OFF则不显示16进制的机器码
number决定显示代码的风格(方式),可以以各种方式显示
D [address]
D range >filename
将内存某处的内容映像到数据窗口或者将内存某处的内容映像到文件中。
例:
d 401000
d cs:402000
d 401000,402000 >myfile
d 401000 L 100 >myfile
E [address [partern]]
编辑内存
例: E ds:edi 'nothing',0
EC 打开或关闭子窗口
如果当前子窗口不可见,那么EC命令将打开它,反过来,EC命令将关闭它。
EXP !
Exp module-name!
Exp partial_export_name
显示一个模块所有的API。
搜索所引用的所有模块输出的 API 函数名
EXP !
Exp kernel32!
Exp *
Exp Get*
Exp *window*
EXP16 显示16位的exp
EXP32 显示32位的exp
FILE [source-filename]
选择/显示源文件。
FONT 1|2
设定TRW2000用于显示的字体,默认为2。
FKEY [function-key strings]
显示/设置功能键
例:
FKEY
FKEY f10 "d 2;U 3;"
G
运行
G address ;运行到由address指出的地址, 等同于 'gox address'命令
G if conditions ;如果 conditions 满足则运行
GDT [Selecter]
显示指定全局选择子GDT的详细信息。
H [command]
HELP [command]
显示所有命令的帮助,后面跟命令名则显示该命令的详细说明。
HOTKEY
显示当前有效的热键,也可以显示新按键。
相关内容:
Hot Keys
HBOOT 重新热启动计算机
HBOOT 将重新启动计算机,等同于按 Ctrl+Alt+Del 组合键。
HBOOT 一般都能成功,只有特殊情况下(某些插卡需要重加电)才用机器上的RESET或POWER键
HWND [HWND]
显示Winodws句柄信息。
IDT number
显示IDT的信息
LDT number
显示LDT的信息
Page [address [L length]]
显示页表信息。
address : 段:偏移量 或 选择符:偏移量 格式的地址
length : 要显示页的数量.PAGE 命令用来列出当前页目录和各个页表的情况.
PageIn <address>
将非当前页调入内存。
例:PageIn cs:401000
LINES [25 | 43 | 50 | 60]
设置/显示当前显示的屏幕行数。
例: lines 43
相关主题:
Ini file
MOD16 [hmod|mod_name]
显示16位模块列表,
如果后跟mod_name则显示指定模块的详细信息。
用法:
MOD16
MOD16 1cf
MOD16 KERNEL
MOD16 . ; .是指当前模块
MOD32 [hmod|mod_name]
显示32位模块列表,
如果后跟mod_name则显示指定模块的详细信息。
用法:
MOD32
MOD32 1cf
MOD32 KERNEL32
MOD32 . ; .是指当前模块
MAKEPE
从内存中整理出一个名为 'newpe.exe' 的PE格式的exe文件。
每次使用该命令前应先删除当前目录下的 'newpe.exe' ,否则 TRW2000 会将新的文件附加在原文件的后面。
当前的 EIP 将成为新的程序入口。
该命令将在当前目录下生成文件,但生成文件的 Import table 已经重新生成过了。
NAME address newname
定义指定地址的新符号名
PDLL32
运行到32位的 DLL 的入口。
用法:
PDLL32 mydll32.dll
PEDUMP
将PE文件的内存映像直接映像到文件'DUMP1.EXE',
您只要使用 MakePE 命令就可以重新整理出一个可用的 PE 可执行文件来。
BP if condition
条件断点,当条件满足时产生中断
例: bp if (eax>=3456787)
bp if (dx<543)
bp if (ch==23)
go if (ah!=34)
P 单步跟踪指令
P 命令将单步执行程序。在汇编模式中,当遇到 CALL,INT,LOOP,REP指令时,P将不跟踪进去,直到这些指令执行完毕,控制才返回TRW2000。换句话说,P命令是"跨"过这些指令的。
P 后加RET 参数,SoftICE将一直单步执行直到它找到一条返回语句(RET,RETF)。
在源程序模式中,P 命令将执行一个源程序表达式,但也不跟踪到子例程中去。P 命令实际上是利用了单步标志。 大多数情况下是如此.但碰到CALL,INT,LOOP,REP指令时,就用INT 3(一次性)在这些指令的后面设一下。
P 命令对应的有快捷键 F10
PNEWSEC
运行直到进入一个 PE 程序内存的新的 section (这个词不知如何描述:D)时产生断点
PMODULE
'pret'(相当于按<F12>) 直至CS:EIP位于模块中。
PRET
运行到遇到 RET,RETF,IRET指令时停下。
快捷键: F12
R [-d | register-name | register-name [=] value]
显示或更改寄存器的内容。
如果 R 命令不加参数,光标将移到寄存器窗口中,进行实时修改。如果当前寄存器窗口不可见, 那么这个命令将自动显示它。
另外,修改FL寄存器时,参数不必按照顺序,如: R fl=o+a-c 可以一次修改3个标志位。
RS
显示用户屏幕。 (快捷键为<F4>).
S
在内存中搜索指定内容
例: S 0 L -1 'window'
S 100,200 'bug12',34
SRC
切换源代码模式,可以是源代码|混合代码|单纯的可执行代码
SUSPEND
暂停当前的线程,并退出 TRW2000,按热键返回。
SYM
显示所有的调试符号列表。
T [startaddress][count]
单步跟踪指令。T 命令是利用CPU的单步标志来进行单步跟踪的。如果指定 startaddress,将从指定的地址处开始单步跟踪。如果寄存器窗口可见,则寄存器窗口将高亮显示哪些改变的寄存器的值。
快捷键为<F7>
TABLE [table name]
选择/显示调试符号表
TASK
显示任务列表
THREAD
显示线程的有关信息。
用法:
THREAD [TCB]
THREAD . ; .代表当前线程
TRNEWDOS
捕获另外的DOS程序。
TRNEWTCB
捕获一个新的线程的入口操作码
支持 32位和16位程序
不要在DOS提示符下运行 Windows 程序,否则 TRW2000 会捕获 START.EXE。
TRTCB <thread_handle>
跟踪一个正在运行的线程。
U [address]
U range >filename
在代码窗口反汇编程序或将反汇编的代码输出到一个文件。
例: u 401000
u cs:402000
u 401000,402000 >myfile
u 401000 L 100 >myfile
VER 显示TRW2000的版本信息
VCALL
用法:
Vcall * -显示所有的 VxD 调用
Vcall num -如果指定的num<10000h, 显示所有的 VxD 调用
-如果指定的num>10000h, 则显示所指定的 VxD 调用
Vcall partial-name(这个小弟没有用过,不知如何译了^_^)
例:
Vcall 0d
Vcall 100001
Vcall *sys*
VM [VMID]
显示虚拟机的信息。
如果VM命令不加参数,将显示系统中所有虚拟机的信息。如果加 VMID 参数,该VM的寄存器值将被显示。
这里的寄存器值是在VM控制块用户区中的寄存器值。所以,这些寄存器表示的是最后当有内存地址切换时存入该控制块时的值。
当TRW2000弹出时正好某个VM 正在运行的话,在寄存器窗口中的值才是真正当前的值,而不是用VM命令在命令窗口中看到的值。
有一点要注意:如果你在某个中断例程中的头几句指令处,而此时这个VM的寄存器值正在被存入控制块,那么可能当前只有CS:IP的值(由VM显示)是真的。其余的有可能还没有存入控制块。
VXD [VXDNAME]
显示Windows VxD 映象。
VXD 命令将显示指定的某个VxD的信息。如果不加参数,VXD命令将显示系统中所有的虚拟设备驱动程序的映象。动态装载的VxD将显示在静态装载的VxD后面。
W range filename
将内存内容写入指定文件
例: w ds:401000,402000 myfile
w 401000 L 100 c:/myfile.bin
WC [codewindow_lines]
设置代码窗口的行数,如果不带参数则切换其开/关状态。
例:
wc 25
wc
WD [datawindow_lines]
设置数据窗口的行数,如果不带参数则切换其开/关状态。
ex:
wd 25
wd
WR 打开或关闭寄存器窗口
如果当前寄存器窗口不可见,那么WR命令将使之可见,反过来,WR命令将使寄存器窗口不可见。
寄存器窗口显示80386寄存器集。
WS 打开或关闭堆栈窗口
如果当前堆栈窗口不可见,那么WS命令将使之可见,反过来,WS命令将使堆栈窗口不可见。
WMSG - 显示Windows消息
用法:
WMSG [partial-name] [WMSG-number]
例:
WMSG 12
WMSG wm_destroy
X 退出当前调试状态,返回Windows
--------------------------------------------------------------------------------
所有断点语法
几乎所有的断点都可以通过如下的语法:
BP?? <parameters> [IF (conditions)] [DO "statement"]
而且开始的2个字母 'BP' 可以代换成 'GO',即:
GO?? <parameters> [IF (conditions)] [DO "statement"]
来设置条件断点。 TRW2000 能够根据要求设置、使用和清除这些断点。
conditions:
条件必须用闭括符括起来,判断条件可以是
>,<,==,>=,<=,!=
Do statement:
<statement> 可以是任何有效的 TRW2000 的命令,但必须用双引号""引起来。
例:
BPX cs:401000 if (eax>200) do "d eax"
GOX 401000 if (cs!=28) do "d ss:esp"
G if (eip<1000)
--------------------------------------------------------------------------------
INI 文件
参数文件trw2000.ini 必须和TRW2000.EXE位于相同目录下。
举例如下:
; TRW2000 Initialize file
; Please modify it as your habit .
;PLUGS=C:/MY_PLUGS/HELLO.SYS
F1=^HELP ; Command length CAN'T be longer than 15 characters !
; This command length is 5 charcaters .
F3=^SRC
F4=^RS
F5=^X
F6=^EC
F7=^HERE
F8=^T
F9=^BPX
F10=^P
F12=^PRET
;HOTKEY=320D ;Ctrl+M
;R3HOTKEY=310E ;Ctrl+N
GRAPHICS=ON
;INTELLIMOUSE=OFF
WINMOUSE=ON
LINES=50 ;十进制
--------------------------------------------------------------------------------
调试符号
TRW2000 会自动装载它所在目录下的所有 *.SYM 文件。当然您也可以通过'LOAD'按钮来加载一个新的 .SYM 文件。如果 .SYM 包含有行号信息, TRW2000 会尝试加载源文件。推荐您最好使用 Microsoft MAPSYM 6.0 来生成 .SYM 文件。
TRW2000 支持PE文件中的COFF格式的调试信息。
相关主题:
TABLE,FILE,SRC,SYM命令
trw2000帮助文档
最新推荐文章于 2014-12-23 19:36:02 发布