请教DUBUG命令的详解
DEBUG命令使用解析及范例大全
Debug
启动 Debug,它是可用于测试和调试 MS-DOS 可执行文件的程序。
Debug [[drive:][path] filename [parameters]]
参数
[drive:][path] filename
指定要测试的可执行文件的位置和名称。
parameters
指定要测试的可执行文件所需要的任何命令行信息。
++
说明
使用 Debug 命令但不指定要测试的文件
如果使用没有位置和文件名的 Debug 命令,然后键入所有的 Debug 命令以响应 Debug 提示符,连字符 (-)。
Debug 命令
以下是 Debug 命令列表:
? 显示 Debug 命令列表。
a 汇编 8086/8087/8088 记忆码。
c 比较内存的两个部分。
d 显示部分内存的内容。
e 从指定地址开始,将数据输入到内存。
f 使用指定值填充一段内存。
g 运行在内存中的可执行文件。
h 执行十六进制运算。
i 显示来自特定端口的 1 字节值。
l 将文件或磁盘扇区内容加载到内存。
m 复制内存块中的内容
/n 为 l 或 w 命令指定文件,或者指定正在测试的文件的参数。
o 向输出端口发送 1 个字节的值。
p 执行循环、重复的字符串指令、软件中断或子例程。
q 停止 Debug 会话。
r 显示或改变一个或多个寄存器。
s 在部分内存中搜索一个或多个字节值的模式。
t 执行一条指令,然后显示所有寄存器的内容、所有标志的状态和 Debug 下一步要执行的指令的解码形式。
u 反汇编字节并显示相应的原语句。
w 将被测试文件写入磁盘。
xa 分配扩展内存。
xd 释放扩展内存。
xm 映射扩展内存页。
xs 显示扩展内存的状态。
分隔命令参数
所有 Debug 命令都接受参数,除了 q 命令之外。可以用逗号或空格分隔参数,但是只有在两个十六进制值之间才需要这些分隔符。因此,以下命令等价:
dcs:100 110
d cs:100 110
d,cs:100,110
指定有效地址项
Debug 命令中的 address 参数指定内存位置。Address 是一个包含字母段记录的二位名称或一个四位字段地址加上一个偏移量。可以忽略段寄存器或段地址。a,g,l,t,u 和 w 命令的默认段是 CS。所有其他命令的默认段是 DS。所有数值均为十六进制格式。
有效地址如下:
CS:0100
04BA:0100
在段名和偏移量之间要有冒号。
指定有效范围项
Debug 命令中的 range 参数指定了内存的范围。可以为 range 选择两种格式:起始地址和结束地址,或者起始地址和长度范围(由 l 表示)。
例如,下面的两个语法都可以指定从 CS:100 开始的 16 字节范围:
cs:100 10f
cs:100 l 10
++
Debug 子命令
选择 Debug 命令以获得详细信息。
Debug:A(汇编)
Debug:C(比较)
Debug(转储)
Debug:E(键入)
Debug:F(填充)
Debug:G(转向)
Debug:H(十六进制)
Debug:I(输入)
Debug:L(加载)
Debug:M(移动)
Debug:N(名称)
Debug:O(输出)
Debug:P(执行)
Debug:Q(退出)
Debug:r(寄存器)
Debug:s(搜索)
Debug:T(跟踪)
Debug:U(反汇编)
Debug:W(写入)
Debug:XA(分配扩展内存)
Debug:XD(取消分配扩展内存)
Debug:XM(映射扩展内存页)
Debug:XS(显示扩展内存状态)
Debug:A(汇编)
直接将 8086/8087/8088 记忆码合并到内存。
该命令从汇编语言语句创建可执行的机器码。所有数值都是十六进制格式,必须按一到四个字符输入这些数值。在引用的操作代码(操作码)前指定前缀记忆码。
a [address]
参数
address
指定键入汇编语言指令的位置。对 address 使用十六进制值,并键入不以“h”字符结尾的每个值。如果不指定地址,a 将在它上次停止处开始汇编。
有关将数据输入到指定字节中的信息,请单击“相关主题”列表中的 Debug E(键入)。
有关反汇编字节的信息,请单击“相关主题”列表中的 Debug U(反汇编)。
范例
a 命令支持所有形式的间接注册命令,如下例所示:
add bx,34[bp+2].[si-1]
pop [bp+di]
push [si] )
还支持所有操作码同义词,如下例所示:
loopz 100
loope 100
ja 200
jnbe 200
对于 8087 操作码,必须指定 wait 或 fwait 前缀,如下例所示:
fwait fadd st,st(3) ; this line assembles
; an fwait prefix
说明
使用记忆码
段的替代记忆码为 cs:、ds:、es: 和 ss:。远程返回的记忆码是 retf。字符串处理的记忆码必须明确声明字符串大小。例如,使用 movsw 可以移动 16 位的字串,使用 mov***(文字因故被系统屏蔽)***(文字因故被系统屏蔽) 可以移动 8 位字节串。
汇编跳转和调用
汇编程序根据字节替换自动将短、近和远的跳转及调用汇编到目标地址。通过使用 near 或 far 前缀可以替代这样的跳转或调用,如下例所示:
-a0100:0500
0100:0500 jmp 502 ; a 2-byte short jump
0100:0502 jmp near 505 ; a 3-byte near jump
0100:0505 jmp far 50a ; a 5-byte far jump
可以将 near 前缀缩写为 ne。
区分字和字节内存位置
当某个操作数可以引用某个字内存位置或者字节内存位置时,必须用前缀 word ptr 或者前缀 byte ptr 指定数据类型。可接受的缩写分别是 wo 和 by。以下范例显示两种格式:
dec wo [si]
neg byte ptr [128]
指定操作数
Debug 使用包括在中括号 ([ ]) 的操作数引用内存地址的习惯用法。这是因为另一方面 Debug 不能区分立即操作数和内存地址的操作数。以下范例显示两种格式:
mov ax,21 ; load AX with 21h
mov ax,[21] ; load AX with the
; contents of
; memory location 21h
使用伪指令
使用 a 命令提供两个常用的伪指令:db 操作码,将字节值直接汇编到内存,dw 操作码,将字值直接汇编到内存。以下是两个伪指令的范例:
db 1,2,3,4,\"THIS IS AN EXAMPLE\"
db THIS IS A QUOTATION MARK:\"
db \"THIS IS A QUOTATION MARK:\"
dw 1000,2000,3000,\"BACH\"
内容实在太多,楼主请看参考资料吧:
参考资料:http://www.lihuasoft.net/article/show.php?id=2783
这些命令参数的解释,网络上很多,而且都有示例
http://mirror.href.com/thestarman/asm/debug/debug2.htm#Q
这里看一下,相对较全面。我学习的时候,就是在这里找的,免费。书都省了。
以前保存的一篇,个人认为不错!
============================================
用好DEBUG是对那些开始学习Crack的朋友的最基本要求。对于大部分的人来说,DEBUG的使用应该不成问题,但也有不少初学者并不会熟练使用这个Windows自带的调试工具,看Help吧,又是一大堆E文。所以,在这里,我给那些不太熟悉此工具的朋友介绍一下各命令的用法,希望能对朋友有些帮助。
一、A(assemble):汇编命令
命令格式:a[<目标开始地址>]
功能:从address地址开始写入汇编命令,回车结束此行,进入下一内存地址的编译。如无address参数,则默认从cs:ip下一址开始编译。
例:a 1000:1000 从1000:1000地址开始输入汇编指令。
二、C(compare):比较命令
命令格式:c<范围><地址范围>
功能:比较指定内存地址(range address)的值。
例:c 100:0 100 10:0 比较从100:0开始的下100个地址与10:0开始的下100个地址。
三、D(dump):内存显示命令
命令格式:d[<目标开始地址][目标范围>]
功能:显示指定范围的内存值。
例:d 100:100 显示100:100地址及下个内存的值。
d 100 显示ds:100地址及下个内存的值。
四、e(enter):内存修改命令
命令格式:e<目标地址><目标范围>
功能:修改指定内存的值。
使用:空格编辑下一内存地址值,减号回到上一内存地址进行重编辑,回车完成编辑。
例:e 修改ds:ip的值;
e 100 修改ds:100内存的值。
五、F(fill):内存填充命令
命令格式:f<目标范围><填充值列表>
功能:填充指定范围内存的指定值。
使用: range:内存地址范围。list:填充值列表,多个值用空格隔开。依次列入指定地址,地址数,填充值数,则填充从头开始循环填入指定内存。
例:f 100 l 100 'ab''cd' 在从ds:100开始的下100个内存中分别填入'ab''cd'。
六、G(go):运行命令
命令格式:g[=开始地址][断点地址]
功能:从指定地址开始运行。可设定断点,DEBUG支持最多10个断点的设定。
例:g =100 200 300 从地址cs:100处开始执行,并分别在cs:200和cs:300处置断点。
七、H(hex):运算命令
命令格式:h<16进制值1><16进制值2>
功能:16进制加减的计算,使用后打印的两个值(16进制数)分别为16进制值1和16进制值2的和与差。
例:h ab cd 分别求16进制数ab+cd与ab-cd的值。
八、I(input):端口命令
命令格式:i<目标端口值>
功能:输入值(2byte)到指定端口。
例:i 10 从10号端口中读入一字节值
九、L(load):加载命令
命令格式:l [路径][磁盘号][扇区号][扇区数]
功能:加载指定磁盘号、扇区号和扇区数的磁盘内容到指定内存。
使用:address:指定要加载到的内存.drive:要加载的磁盘号,此处的磁盘号为:A:0号。B:1号,C:2号。依此类推。firstector:扇区号.number:扇区数,并置EAX:EDX为文件的大小,此处的eax:edx是将大小值的高位放到EAX,低位放到edx,而非指向eax:edx的内存地址。若加载的是*.exe或*.com文件未指定路径,则*.exe会加载到cs:100(此值不可更改),而*.com文件会在cs:ip处。
例:l c:\test.txt 2
十、M(move):内存copy命令
命令格式:m<地址范围><目标地址开始地址>
功能:拷贝指定内存值到指定内存地址。
使用:range address:两个地址范围。
例:m 0000:1 l 20 0010:0 把从0:1内存地址开始的长度为20的内存值复制到地址10:0开头的内存。此命令的目的地址与源地址有重叠也不会发生错误。
一一、N(name):命名命令
命令格式:n[路径]\[参数列表]
功能:将指定文件存入DEBUG的FCB(文件控制模块)中,以备以后加载(L)和存盘(W)。
例:n c:\test.txt将c:\test.txt放入FCB中。
l 将c:\text.txt载入内存,使cs:ip指向该文件开头,并置bx:cx为文件大小值。
此两条命令相当于:debug c:\test.txt。
一二、O(output):端口命令
命令格式:o[端口值]
功能:从指定端口输入一字节值。
例:o 71 从71号端口中输入一字节。
一三、P(proceed)
命令格式:P [=<地址>][<指令条数>]
功能:单步跟踪,执行指定的一条或多条指令,但遇到过程与中断不进入,而是继续下一条指令。
例:p =100 20 执行从cs:100开始的以下20条指令
一四、Q(quit):退出命令
命令格式:q
功能:没什么好说的了,就是退出DEBUG。
一五、R(registry):寄存器命令
命令格式:r [寄存器名]
功能:显示当前名寄存器(16位)值、8个标志位的状态,并反汇编cs:ip所指的下一条指令。后跟寄存器名可修改其值。
例:r ax 修改ax的值
一六、S(search):搜索命令
命令格式:s [范围]'搜索字符列表'
功能:搜索指定的字符串,若找到则显示地址与值,若无则什么也不输出,等待下一条指令。必须指定全部参数。
例:s 0000:1111 l 20 '32' 在0000:1111以后的20个地址中搜索字符串'32'。
一七、T(track):单步跟踪命令
命令格式:t [=<地址>][<指令条数>]
功能:单步跟踪,执行指定的一条或多条指令,遇到过程与中断进入到过程中去。每一步过程算一条指令。
一八、U(unassemble):反汇编命令
命令格式:u [开始地址][范围]
一九、W(write):写盘命令
命令格式:w[目标开始地址][目标磁盘号][扇区号][扇区数]
功能
功能:写从目标起始地址或cs:ip开始的,长度为bx:cx的内存内容到指定的磁盘。此命令很危险,稍有不慎可以毁坏文件或分区表,故应慎重使用。
例:w 1:100 把从0:100开始的,长度为bx:cx的内存内容写入已用debug或n+1加载的文件中,注意*.exe文件的写入方式很特殊,故此处的文件不可为*.exe文件。
---------------------------------------------
[范围]的说明:
范围有两种表示方式:
(1)开始地址结束地址;
(2)开始地址l(此处是L,非数字1) 偏移量;
如:地址:123:0到期123:fff可表示为:123:o fff或123:456 l 65535
[默认地址]:
(1)默认段地址:关于代码的命令,如:u,a等的默认地址一般为DS,而关于数据的命令所用的默认地址一般为CS中,如d,e,f等;
(2)默认偏移地址:一般为IP。
关于DEBUG:
(1)DEBUG所用的值均为16进制数值,且不跟后辍H,这一点要注意;
(2)DEBUG的命令与参数大小写均可,分隔符也只是在两个数字之间有必要才打。当然,你若愿意,打上也不算错;
(3)不可用作32位位的调试器;
(4)超越地址应分两行,先写段地址,再写代码。即:
mov ax,ds:[bx]
应写为:
ds:
mov ax,[bx]