阅读:1328回复:8
调试高手
欢迎使用解释型跟踪调试软件----TR
如果你用过DEBUG,SYMDEB,TD(TURBO DEBUG),CV(CODE VIEW )或 SOFT-ICE, 你应该试试TR。 TR(将)具有以上调试软件的一切功能,支持它们的所有命令。而且,最重要的是,TR提出了九大新的思想: 一、解释跟踪 TR对程序是解释执行的。TR就象是一个CPU, 能读懂每一句程序代码并正确解释执行,不需要使用INT1,INT3,不需要使用386调试寄存器DR0-DR7,不需要进入保护模式(是不会)。理论上,TR永远不会被应用程序发现,永远不会有跟踪不下去的程序。因为所有的程序都要交给CPU去解释执行,只要CPU认识的指令,TR也要认识,TR会想象CPU 处在这种状态会怎么作,那我也那么去作。如果你发现TR作错了,那是TR还尚待完善。 传统的跟踪方式有太多的弊病: (1)那些使用单步中断INT1的调试软件,因为它们独占INT1和TF,所以那些需要INT1的应用程序便无法跟踪,应用程序也可以通过检测TF来发现自己是否正在被跟踪。 (2)那些使用断点中断INT3的调试软件, 需要在应用程序中插入代码INT3(0CCH),如果应用程序破坏INT3的中断向量,或检测自身代码便无法跟踪。 (3)SOFT-ICE不使用以上两种方法,而是用386硬件中断, 效果要好多了。跟踪那些对386一无所知的程序不成问题。但许多要求EMM386、DPMI、DOS4GW 等的软件的运行受到了极大的限制,甚至根本不能在SOFT-ICE 下执行。 更重要的是,SOFT-ICE很容易被发现。 总之,现有跟踪调试软件都是利用INTEL的CPU手册上提供的规范的调试方法进行工作,它们只适合调试那些规规矩矩的、愿意被跟踪调试的程序。如果应用程序不予合作,便不能跟踪。TR则不同,TR要跟踪所有CPU能处理的程序,甚至TR 能嵌套跟踪另一个TR。 另一方面,传统的跟踪方法是设置好一些断点(不管是何种断点),然后GO到应用程序中去执行,并期望程序运行到适当地方,CPU能产生一个中断, 返回主程序。至于能否返回,或返回前程序干了些什么,只有天知道。用解释的方法跟踪,控制权永远牢牢掌握在TR的手中,监控着所有程序流程,并由此才能设置一些高度复杂的断点。 解释跟踪是TR与其它调试软件的最本质的区别。也是TR高性能的根本所在。 二、批处理 尽管批处理的概念很早就有,在各种软件中应用极为广泛,却无人把它作到调试软件中。在TR中,可以把要执行的命令序列放到一个文本文件中,用DO命令执行。当然还有自动批处理AUTORUN.TR。 三、G OFFSET 对G 100命令,大家都知道是执行到100停下,其它的调试软件认为是到当前段的100停下,TR却不管段址如何,只要IP是100 便停下。 这样一般的COM外壳只要一条G 100便解决。这个功能看起来简单,却极为有用。有了这条命令,再也不用去记复杂的跟踪路径,只要把当前跟踪到的IP记下,下一次一G便到。 四、汇编指令作为命令 搞汇编语言的人满脑子都是汇编,复杂的调试命令可能不愿去记。能用汇编指令作为命令当然是个好主意。用R AX 1234当然不错,用MOV AX,1234岂不更有意思?其它CLI\MOV [WORD 1234],4567\IN AL,21都是不错的命令。 五、允许对调试程序作注解 CALL 7F2E看起来当然没有CALL OPEN_FILE容易理解,但跟踪调试却不得不面对大串的莫名其妙的代码。即使某个过程经过跟踪已经知道是干什么的,也只能写到纸上。如果能把跟踪结果写到屏幕上,那是什么概念!整个程序变成了你手上的一篇文章,可以对它任意地圈圈点点。每一次跟踪都添加一些新的见解,最后,整个程序一目了然。参见命令LABEL和CMT。 是这个功能使跟踪变成了一项真正可以做的工作。 六、自动跳转 最近加密界出现了一种新的技术,用JMP指令把代码扯乱。这样跟踪者一次只能看到一条指令和一个JMP,看不见来路也看不见去路,跟踪工作变得异常"艰难困苦"。TR的自动跳转技术使得在执行过程中不显示JMP指令,而把JMP后的指令直接放在JMP指令原来的位置。经过TR的重组,提高了代码的可读性。 参见命令AUTOJMP。 七、历史记录 TR可以把执行过的每一个CS:IP记录下来,以便静态分析。如果程序出错, 可以查历史记录向前回溯,找到问题所在。更有功能强大的LOGPRO,可以把程序的关键指令整理出来。被跟踪程序再无任何秘密可言。 参见命令LOG、LOGS、VLOG、LOGPRO。 八、把内存代码写成EXE文件 从内存中重构EXE文件的技术已经十分成熟,各种万能脱壳软件到处都是,但都是盲目地脱。随便拿到一个文件在INT21\AH=30处脱一下是不能解决问题的。脱壳应该是跟踪调试软件的一项功能,跟踪到了,再脱,万无一失。 九、复杂的断点,一次性断点。 各种调试软件所能设置的断点都是INTEL当初设计CPU时就想好的几种,远远不能满足高级跟踪的要求。TR创造性地提出了许多断点: (1)BP CONDITIONS 条件断点。如: BP IP>4000 ;代码较长,只跟踪后半部 BP AH=2 DL=80 CH>30 (2)BPINT intnum [CONDITIONS]中断断点 (3)BPXB BYTES [CONDITIONS] 遇到指定指令就停下。如:MOV AX,????的机器码为B8????,可用 BPXB b8 其它: BPXB cd ;所有中断 BPXB 33 C0 ;XOR AX,AX (4)BPREG REG|SEG [CONDITIONS] 如果指定的寄存器改变,则暂停。BPREG CS可以找到所有的段跳。 BPREG CS AX=0 ES=# ;#指当前PSP 可以找到带外壳程序的真正开始。 (5)BPM [SEG:]OFFSET 如果访问指定地址则暂停。如BPM 20将使MOV AX,[20]停下。 (6)BPW SEG:OFFSET 如果指定地址改变,则暂停。有些操作(如INT)对内存的改变只有一次次检查是否改变才能找到。 (7)BPIO port [conditions] (8)BPKNL [count] 如果发现新的程序内核,则暂停。 特别重要的是,如果一个断点只用一次,把设断点命令前面的'BP'改为'GO'或'GS'便可直接执行。有了这个一次性断点,一般根本不需要专门设置断点。 以上这些新增的断点,千百倍地提高了跟踪的效率,再也不需要苦苦地跟踪了! TR是真正的跟踪调试软件!尽管我们上面提到了DEBUG,SYMDEB,TD,CV,S-ICE,但哪一个是真正的跟踪调试软件?DEBUG和SYMDEB当然不能算是, 因为我想跟踪软件至少应该是全屏幕的。TD居然没有命令行输入,没有什么鼠标操作能比一行命令F CS:DX,DX+CX 00更能简单准确地表达你的意图。在DEBUG中至少还可以L100 0 01检查软盘BOOT区,可以L400或W400把一个文件调入指定内存或把内存写成文件, 在SYMDEB中还可以用一个>号把反汇编结果存起来, 可惜这些非常有用的功能其它软件都做不到。TD和CV不象是专门的调试软件,更象是为了对各自的C语言排错用的。S-ICE应该算是一个不错的跟踪调试软件了,但总是感觉386CPU 的调试功能就是为S-ICE而留,而S-ICE也就是仅仅为了演示386CPU的调试功能。只有TR,真正为跟踪者着想,就软件的跟踪技术提出了九大新的思想,第一次使程序跟踪成为了一项真正可以为之的工作,TR是真正的跟踪调试软件! TR现在不支持386保护模式,不能处理WIN95程序。如果你要跟踪DOS保护模式程序,16位Windows程序,32位Windows95程序,请使用TR for Win95: http://trw.yeah.net 在以后的版本中,这些问题将一一解决。 我一直在努力使TR达到完美,每天TR都有大的改变。请与我联系,你将获得最新版本。 作者: 刘 涛 涛 地址: 河南安阳彩玻公司资料室 邮编: 455000 电话: 0372-3932916-2273 EMAIL: liutt@iname.com ayliutt@nease.net 主页: http://tr.kstar.com http://www.nease.net/~ayliutt ICQ UIN: 3434573 98.3.3 ---------------------------------------------------------------------- 须 知 一、TR支持Turber Debuger调拭信息。如果调试一个带调试信息的C语言程序,可以用g _main快速进入现场。 二、支持32位指令(见命令r32) 三、从TR中退出后,用户程序修改过的所有中断都将被自动恢复,占有的内存自动释放。 四、如果系统有XMS,TR自动使用,可以节省一些内存空间。 五、所有数字输入均采用十六进制。 运行TR需要386以上的CPU,在DOS下运行,也可以在WINDOWS和WINDOWS95的DOS窗口中运行,不过速度会更慢。与HIMEM或EMM386或任何其它的XMS/EMS内存管理软件兼容。可以很好地在SOFT-ICE下运行。TR只会跟踪实模式下的DOS程序,对保护模式和WINDOWS程序,请使用TR for Win95。 ---------------------------------------------------------------------- TR的屏幕显示 EAX=00003000 EBX=00000000 ECX=00000000 EDX=00002755 SP=007E EBP=00000000 ESI=00000000 EDI=00000000 FS=0000 GS=0000 DS=2640 ES=2640 SS=2785 CS=2650 IP=000A o d I s z a p c t 2640:0000 CD 20 FF 9F 00 9A F0 FE-1D F0 1E 44 FD 07 6D 01 ............ 2640:0010 13 06 78 01 13 06 13 06-01 01 01 00 02 FF FF FF ..x......... 2650:0000 BA5527 MOV DX,2755 2650:0003 2E89168B02 MOV [CS:DGROUP@],DX 2650:0008 B430 MOV AH,30 2650:000A CD21 INT 21 Get MS-DOS Version Number 2650:000C 8B2E0200 MOV BP,[0002] 2650:0010 8B1E2C00 MOV BX,[002C] 2650:0014 8EDA MOV DS,DX 2650:0016 A37D00 MOV [007D],AX 2650:0019 8C067B00 MOV [__psp],ES 2650:001D 891E7700 MOV [__envseg],BX 2650:0021 892E9100 MOV [0091],BP 2650:0025 E85101 CALL 0179 2650:0028 A17700 MOV AX,[0077] 2650:002B 8EC0 MOV ES,AX 2650:002D 33C0 XOR AX,AX Super Program Trace (test version), Written by Ld. 06/16/97 Press '?' for Help r32 Welcome !!! Tel:0372-3932916-2273 EMAIL: ayliutt@hotmail.com 以上是TR的典型屏幕显示。主要有寄存器区、内存区、代码区、命令区、状态行。 一、寄存器区 屏幕的最上端是寄存器区。缺省为16位方式显示,可以用R32命令改为32 位方式。 用R命令置寄存器值,如: R AX 1234 R ebx 12321456 R ch 87 R dl ah R ip ip+1 R fl z 对标志寄存器用ODISZAPCT,最近改变过的寄存器以不同颜色表示。 二、内存区。 内存区以十六进制和ASCII码方式显示内存内容。可以用E命令把光标转到内存区编辑,可以按左、右、上、下、上下翻页、HOME、END等键移动光标, 按字母数字键修改内存,按TAB键十六进制ASCII码转换。也可以用e offset 'content'直接修改。 用WD num改变内存区的行数。 内存区有两种显示方式,一种是普通的段不变偏移连续变化的方式,另一种是段以10H变化,偏移为0的方式。普通方式下,用E命令使光标到内存区, 如果当前OFFSET小于0F按向上箭头,变为第二种显示方式。用D命令恢复。 三、代码区 屏幕中央是代码区,显示程序的汇编代码。支持386指令, 可以显示标号和注解,对常用中断进行解释。 四、命令区 用于输入命令。可以按F5键放大,按左、右、上、下、上下翻页、HOME、 END等键移动光标,用DEL和BACKSPACE修改。 如果要多次执行一条命令,把光标放到那条命令上按ENTER。 五、状态行 显示命令是否正常执行。 六、以上是TR的主要窗口,另处还有F4显示用户屏幕,VIEW命令列文件内容,STACK命令显示STACK窗,VLOG显示历史窗等等。 ---------------------------------------------------------------------- 常用按键 执行一句汇编指令,等同于命令T。 执行一个过程,等同于命令P。 显示用户屏幕,等同于命令RS。 命令窗<-->代码窗。 如果光标在代码窗,执行到光标位置(HERE)。 最大当前窗口。当前窗口可以是命令窗、代码窗、内存窗。 如果光标在代码窗,设置(或清除)光标所在位置为断点。 Ctrl+D 暂停程序的运行,返回TR。注意,TR只会停留在被跟踪程序的代码中, 而不会停留在系统代码中,所以按热键Ctrl+D后有时不会马上返回。 ---------------------------------------------------------------------- 常用符号 <$>: 在TR的命令中,可以用美元符'$'代表当前的CS:IP。命令 D CS:IP 与命令 D $ 是等效的。命令U $可以用命令.来代替。 <*>: 在TR的命令中,星号'*'代表当前指令的操作地址。如果当前的CS:IP为 ****:**** mov ax,[di] ;1234:5678=**** 并且此时DS=1234,DI=5678,则命令 D * 与命令 D DS:DI 或 D 1234:5678 等效。 <@>: 取地址的指针。比如,如果 1234:5678 11 22 33 44 则@1234:5678表示4433:2211。 可以用@0:21*4表示中断21的地址。 如果刚刚进入一个CALL FAR或INT,可以用@ss:sp返回。 <#>: 在TR的命令中,井号'#'代表当前程序的PSP值。 例: D #:0 <;>: 分号';'代表注解,命令中分号后面的部分将不被解释。 AUTORUN.TR: 每次TR运行,都会自动执行当前目录下文件AUTORUN.TR中的命令。把你总是要 执行的命令加入AUTORUN.TR。如R32,AUTOINT1 ON等。 ---------------------TR定制命令-------------------- COLOR [01 02 03 04 05 06 07 08 09 10] 如果不带参数,显示当前TR的颜色设置。如果带参数,必须是9个值,分别表示 1:寄存器区 寄存器名 2:寄存器区 寄存器值 3:寄存器区 改变过的寄存器值 4:代码区 一般代码 5:代码区 当前CS:IP 6:代码区 标号或注解 7:代码区 断点 8:命令区 一般命令 9:命令区 注解 a:状态栏 如:color 7 b e 7 e 2 4 17 36 76 MSG [x y] 显示信息窗。主要用在DO命令文件中作演示用。以后的命令都作为要显示的信息,空回车返回。X,Y为信息框的位置,-1为自动右上角,-2为居中。例: msg 20 5 this is first line message THIS IS SECOND LINE And third ;空回车 VER 显示版本信息。 R32 16位寄存器/32位寄存器切换。如果是16位状态,寄存器窗口显示为 AX=1234 BX=1234 CX=1234 DX=1234 SP=1234 BP=1234 SI=1234 DI=1234 DS=1234 ES=1234 SS=1234 CS=1234 IP=1234 o d i s z a p c t 32位状态的显示为: EAX=12345678 EBX=12345678 ECX=12345678 EDX=12345678 SP=1234 EBP=12345678 ESI=12345678 EDI=12345678 FS=1234 GS=1234 DS=1234 ES=1234 SS=1234 CS=1234 IP=1234 o d i s z a p c t 无论何种状态,都不影响系统运行。缺省为16位,如果你喜欢32位状态,把R32加入文件AUTORUN.TR。 REDRAW 屏幕重画。 WD [lines] 设定内存窗口的行数。 ---------------------输入/输出 命令-------------------- A [address] 汇编。虽然代码窗能够识别32位代码,A命令暂时不能处理32位代码。 将在以后的版本改进。可以直接用'BEGIN:'的方法定义标号。 A cs:0 start: ;define label mov ax,bx ;any asm code ;return to command mode D [address|range] [>filename]] 以十六进制和ASCII码方式显示内存,加'>'号把结果输出到文件, 如: D cs:ip D * D 1234:5678>myfile.txt D cs:0lffff>file D >file 如果指定文件不存在,则自动生成;如果已经存在,则追加。 缺省长度40H。 E [[ptr] bytes] 内存修改。如果不带参数,光标移到数据区,这时可以按左、右、上、下、 上下翻页、HOME、END等键移动光标,按字母数字键修改内存,按TAB键十六 进制ASCII码转换。例: E cs:0 12 23 45 'abc' E b800:200 36 24 E 234 'def',0d,0a,'$' 缺省段为DS。 F range bytes 填充。把内存区域用给定字串填充,如 F cs:0,ffff 12 23 45 'abc' F b800:0L200 36 24 F 234 'def',0d,0a,'$' 如果未指定长度,给定字串至少填充一次,相当于E命令。 缺省段为DS。 L [[SEG]:OFFSET] [FILENAME] 读文件到内存。注意与RELOAD的区别,L仅仅是把文件读到指定内存区,而 RELOAD是找到一块空闲内存调入,建立PSP,设置寄存器,准备执行。 缺省段为DS,缺省地址DS:100。 例: N c:\autoexec.bat L 100 N c:\command.com L 200 L DS:300 MYFILE.BIN L [SEG]:OFFSET DRIVE STARTSECTER SECTERS 从指定物理驱动器读取指定物理扇区。 例: L 100 0 0 1 ;读A盘BOOT区 L 100 2 0 1 ;读C盘BOOT区 N [filename] 如果不带参数,显示当前文件名。如果带参数,置文件名。如: N MYFILE.EXT 参见:W,L,RELOAD RELOAD [filename] 重新调入文件。如果文件名已被N命令修改,则调入新文件。 重置所有中断向量、内存区、寄存器。 有时程序上一次申请的内存不能完全释放,导致调入失败。可以 退出TR再进,EXE2,RELOAD,仍然可以MKEXE。 U [address|range] [>filename]] 反汇编,加'>'号把反汇编结果输出到文件,如: u cs:ip u $ u 1234:5678>myfile u cs:0lffff>file u >file 如果不给出反汇编长度,缺省20H。 如果指定文件不存在,则自动生成;如果已经存在,则追加。 W W [SEG]:OFFSET W [SEG]:OFFSET filename W [SEG]:OFFSET length filename 写内存到文件。文件长度为BX:CX或length。 缺省段为DS,缺省地址DS:100。 例: N test.com W 200 W es:300 myfile.com W cs:ip dx test.com W [SEG]:OFFSET DRIVE STARTSECTER SECTERS 向指定物理驱动器写指定物理扇区。 例: W 100 0 0 1 ;写A盘BOOT区 WREG filename 把当前寄存器区内容写入文件。如文件存在则追加。 WMEM filename 把当前内存窗口内容写入文件。如文件存在则追加。 WCOD filename 把当前代码窗口内容写入文件。如文件存在则追加。 WCMD filename 把当前命令窗口内容写入文件。如文件存在则追加。 ---------------------RUNTIME 命 令-------------------- DELAY [time] 用于DO命令文件中,起延时作用。如果命令文件中改变了DELAY状态,切 记在文件尾用DELAY 0恢复。 注意设定延时为16进制。 DO filename *新概念* 执行批处理。指定一个文本文件,里面可以包含所有合法的TR命令(甚至 另一个DO),让TR自动执行。每次TR运行,都会自动执行当前目录下文件 AUTORUN.TR中的命令,相当于每次TR启动,都会自动执行一个 DO AUTORUN.TR 在批处理文件中,如果一个命令行以空格开始,TR直接处理该命令而不在 命令窗口显示(第一个空格被去掉)。 特别用法:把一个汇编程序前面加个A〈回车〉,让TR去汇编。 参见:DELAY,KEY KEY num 用于DO批处理文件中,模拟按键。给定的值为MOV AX,0\INT 16返回的值, 如: KEY 1C0D ;回车 ---------------------其 它 命 令-------------------- 所有汇编指令 TR支持几乎所有汇编指令作为命令。虽然我们不一定非要这么做,但有时候 确实很方便,试试下面命令: mov ah,4c jmp 200 cli 定义标号或过程名: 命令行中,输入一个字串加冒号,定义当前的CS:IP为给定标号。 在A命令后的汇编状态中,定义的是当前正在汇编的地址。 例,如当前IP=100,输入'START:',则CS:100为START,所有JMP 100都将 译为JMP START。 在命令行中,这是'LABEL CS:IP labelname'的简写。 参见:LABEL,CMT . 在代码窗显示当前CS:IP。 相当于U CS:IP或U $。 ? [expresion] 帮助。如果不带参数,TR自动ZOOM命令窗口,简要显示每一条命令的语法和 功能。可以用Up/Down/PageUp/PageDown上下滚动窗口,F5恢复。 如果带参数,TR对参数计算后显示结果,如: ? ax 显示AX内容 ? cx+dx 显示CX+DX的结果 ? # 显示当前PSP ? @0:21*4 ? $+5 显示CS:IP+5 CMT [SEG:]OFFSET COMMENT_STRING *新概念* 对程序进行注解。 地址如果不提供段址,默认当前CS。如果地址小于PSP:0或大于PSP+2000:0, 认为是相对地址,否则认为是绝对地址。 注解串可以是任意长度的字串,但命令总长度不能超过79。如果包含空格或 保留小写,请用单引号''括住。 对程序所作注解全部存入文件'当前文件名.cmt',这是一个文本文件,可 以直接编辑。下次TR调入程序时自动装入。 如果定义当前CS:IP名,可直接用'标号名:'。 例: cmt cs:200 'This is my comment string' PROC1: 参见:LABEL,SYMBOLS LABEL [SEG:]OFFSET LABEL_NAME *新概念* 定义标号或过程名。 如果定义了标号或过程名,代码窗中将在该地址前留一行显示其名子,并把 所有JMP和CALL到该过程的语句翻译为'CALL 过程名'而不是通常那样 'CALL ????'。 程序标号全部存入文件'当前文件名.cmt',这是一个文本文件,可以直接 编辑。下次TR调入程序时自动装入。 例: LABEL cs:200 file_open 参见:cmt,SYMBOLS LOG [ON|OFF] *新概念* 是否记录历史。如果LOG ON,则TR将把以后执行的每条指令地址记录下来, 可以用VLOG命令查看。本命令只记录最后25条地址,如果要所有记录,请 用LOGS命令。 利用TR的LOG功能可以使用一种新的分析程序的方法,那就是"走后门"。 比如一个程序错误退出,如果用通常的办法从程序开始进行跟踪,要走很 长的路才能找到问题所在。而用TR的LOG功能,就可以在程序异常退出后分 析程序最后执行的什么过程,快速找到关键。 LOGS [ON|OFF] *新概念* 是否记录历史。如果LOGS ON,则TR将在当前目录下建一文件LOG.DAT, 并把以后执行的每条指令地址以十六进制存入该文件。方便以后分析程序 流程。视程序复杂度,该文件可能会很长。请使用专门的十六进制浏览器 浏览该文件,或用TR的VIEW命令。 当LOGS ON时,因为执行每一条指令都会有一次存盘,速度较慢,一般情况 下,用LOG ON就足够了。LOGS ON时,LOG自动为ON。 LOGPRO [0|1|2|f] *新概念* 功能:把程序执行过的关键代码记录下来,便于分析。特别适合于正确 流程和错误流程的比较。 如果不带参数,则显示当前选项。各选项的意义: 0: 不LOG 1: 只LOG以下几条指令call,ret 2: 只LOG以下几条指令call,ret,condition jmp,jmp far 注意:对CONDITION JMP只有条件为真时才LOG f: LOG所有指令 LOGPRO把LOG的指令存到文件LOGPRO.DAT,每条记录长16字节,格式: 位置 大小 意义 0 DW IP 2 DW CS 4 DW SP 6 DB ? 7 DB ? 8 8 byte 指令码 在DOS提示符下执行LOGPRO.EXE,读取LOGPRO.DAT,生成LOGPRO.TXT。 这就是程序的关键代码。 特别感谢LX首先提出这个思想。 M RANGE [SEG]:OFFSET 内存复制。如: M $L200 8000:100 ;复制CS:IP开始长度200到8000:100 M DS:0,800 ES:200 ;复制DS:0,800到ES:200 Q 退出TR。也可以按ALT+X。 用户程序修改过的所有中断都将被自动恢复,占有的内存自动释放。 R REG [num] 改寄存器值。可以是8位16位32位通用寄存器、标志寄存器FL或段寄存器。 对标志寄存器的操作可以是ODISZAPCT。 例: R ax 1234 R ebx 12321456 R ch 87 R dl ah R fl z RS 显示用户屏幕(Restore Screen),热键F4。按任意键返回。 S range bytes 在内存中查找指定内容,如: s cs:0,ffff 12 34 45 ;在CS:0到ffff中寻找12 34 45 s ds:200l100 23 ;在DS:200长度100中寻找23 SYM [ON|OFF] 是否调入EXE文件的调试信息。缺省为ON。如果不想调入文件的调试信息, 先不带参数执行TR,然后: SYM OFF N myfilename RELOAD 因为有些错误的调试信息会使TR发疯。 SYMBOLS 如果程序带有调试信息或用label,cmt命令自定义了符号,则显示所有符号名。 参见:CMT,LABEL VLOG 显示LOG ON或LOGS ON命令记录的历史信息。 VIEW filename.ext 浏览文件。可以以十六进制和ASCII方式查看文件内容。 STACK *新概念* 显示当前子程序嵌套状况。 比如,可以用GOIO 378找到关键指令,用STACK看当前CS:IP是经过几次 CALL过来的,迅速找到关键子程序。 参见:PRET --------------------------------------------------------------------- 跟踪执行命令 G G [seg:]offset G conditions *新概念* 执行程序,也可以用命令GO。如果条件满足,则暂停。 注意:在程序中加入INT3并不能使G命令的运行中止。 特别推荐:G OFFSET。只要程序执行中IP等于设定的OFFSET,就会停下。你 不用担心段址在哪儿,代码是否动态生成。只要知道它会经过那儿,就会停 下。例: G 100 G CS:100 G BX G AH=4C G AX=0 BX=0 CX=0 G IP>400 参见:GS GO??? *新概念* 任何设置断点的命令BP???都可以用GO???来使用,用为一次性断点。 例: GOREG CS GOINT 21 AH=30 GOW ES:DI GOXB CD 13 AH=2 参见:GS??? GS G命令在执行前会恢复用户屏幕,执行结束后再保存用户屏幕。有些程序破 坏了BIOS,这样保存的屏幕信息无法正常恢复,对此问题TR还找不到好的解 决方法,于是增加了一个GS命令。GS命令相当于G命令,只是不恢复屏幕。 等价于执行多个T。 GS??? 同GO???命令,只是不恢复屏幕。参见:GS GO??? T 执行一句汇编指令,相当于按F8。 注意,TR的T命令与其它调试器不太一样。TR并不会真的去执行这条指令, 而是完成每条指令的功能而已。如果遇到了TR无法识别的指令,只有用TT 命令了。 如果遇到INT指令,T命令不会进入系统的中断例程,因为我认为我们一般感 兴趣的是被跟踪程序,而不是系统。如果程序修改了INT地址,T命令会进入 被改后的地址。如果真是需要进入中断,可以用GG,如 GG @0:21*4 ;进入INT21 GG [[SEG:]OFFSET] 无条件执行,TR不对执行过程作任何控制。 缺省段为CS。如果指定地址,那么TR在指定地址插入CALL FAR指令,然后JMP 到应用程序中去,希望它能执行到这个CALL FAR由TR重新控制。之所以不用 INT3是为了防止应用程序修改INT3中断向量。 因为这时程序的执行已不是TR的解释执行,所以运行速度正常。 仍然可以希望CTRL+D能回到TR的控制。 P 执行一个过程(F10)。如果当前指令是一条CALL或CALL FAR,则执行整个过 程直到返回。如果是其它指令,同T。 如果确实想执行到下一步为止,比如遇到一个LOOP,请用命令PP。 PP 执行直到下一条指令。相当于G IP+本指令长度。 PRET 执行程序直到RET、RETF或IRET指令。用于快速退出子程序。 参见:STACK TT 使用单步中断执行一条指令。 不推荐使用。 参见:int1 AUTOINT1 [ON|OFF] 这是一个标志,可以设为ON或OFF。缺省为OFF。 当为ON时,如果TR遇到一条不可识别指令,则自动用INT1单步中断去执行。 参见:TT,INT1 INT1 [ON|OFF] 这是一个标志,可以设为ON或OFF。缺省为OFF。 当为ON时,TR不再解释每一条指令,而是用INT1单步中断去执行。 不推荐使用ON的状态。如果你确认TR对某条指令的解释有误,可用状态ON 继续执行。如果只在此状态下执行一条指令,用命令TT。 影响命令:T,G,P等 参见:TT,AUTOINT1 AUTOJMP [ON|OFF] *新概念* 设置是否自动跳转。如果为ON,在执行过程中TR将不显示JMP指令,而把JMP 后的指令直接放在JMP指令原来的位置,并在该指令前加"-〉"符号以示区别。 这样在一些JMP过多的场合能使你容易保持清醒。如果你不习惯,让它OFF。 缺省为ON。 --------------------------------------------------------------------- 断点命令 **** 如果断点只使用一次,把BP????改为GO????或GS???? **** BL 列出所有断点。最多可设8个断点。 实际上是9个断点,断点0被GO系列命令占用。 BC [NUM] 清除所有断点或指定断点。 BD [NUM] DISABLE所有或指定断点。 BE [NUM] 允许所有或指定断点。 BPW segment:offset *新概念* 监视内存变化,如果指定位置的字(WORD)发生改变,则暂停。 如果设定此类断点,TR每执行一条语句都会进行一次比较。 BP [seg:]offset *新概念* 如果执行到CS:IP=SEG:OFFSET或IP=OFFSET,则暂停。 用BP seg:offset时,TR不会象通常的调试程序那样,插入一个INT3,TR从 来不那样做,所以不用担心应用程序会发现或破坏INT3地址而不能返回。 用BP offset是个好主意,这样就不用关心它的段址是如何变化,在此之前 有多少代码的扭曲,断点区是否动态生成,都不用去管它。只要程序执行 过程中IP=offset,就会停下来。 这个断点实际上是下面BP conditions的一种特殊情况,也可以写作 BP ip=?? cs=?? TR把它们作为一种情况进行处理。 惯用法:对COM文件脱壳,用BP 100或直接G 100。 例: bp cs:200 bp $+20 bp dx BP ip>200 BP conditions *新概念* 如果指定条件满足,则暂停,如 bp ax=1234 ;当ax等于1234H时停 bp ax=0 bx=0 cx=0 ;当AX,BX,CX同时为0时停 bp ah=3 dx=80 > -------------------------------------------------------------------------------- 传输中断! 型 |
|
沙发#
发布于:2004-10-14 11:19
路过 看看路过 看看路过 看看路过 看看路过 看看路过 看看路过 看看路过 看看路过 看看路过 看看路过 看看路过 看看路过 看看路过 看看路过 看看路过 看看路过 看看路过 看看路过 看看路过 看看
|
|
|
板凳#
发布于:2004-10-14 11:47
更厉害的是硬件调试卡!
|
|
地板#
发布于:2004-10-14 16:38
瓦赛,硬件调试卡!
以后加密是要更加复杂了 |
|
地下室#
发布于:2004-10-14 19:20
9X下还有TRW2000,不过到了2K以后就没消息了,现在还贴这个未免老土了.
|
|
|
5楼#
发布于:2004-10-15 09:05
9X下还有TRW2000,不过到了2K以后就没消息了,现在还贴这个未免老土了. 已经停止开发了,朱XX在北京开公司了,多媒体方面的! |
|
6楼#
发布于:2004-11-14 04:22
LTT好象在苏州.
|
|
|
7楼#
发布于:2004-11-14 09:42
ltt在苏州?
朱xx呢?具体在北京哪儿? |
|
|
8楼#
发布于:2004-11-15 17:30
北京众晶数迅数码科技有限公司
|
|