debug命令(debug命令e的使用)

Hello大家好,我是程序员cxuan!这篇文章我们来进行实际操作一下Debug。

我们以后将会用到很多 debug 命令,这里我们先来熟悉一下它们。

Debug 是什么

Debug 是 Windows / Dos 操作系统提供的一种功能。使用 Debug 能让我们方便查看 CPU 各种寄存器的值、内存情况,方便我们调试指令、跟踪程序的运行过程。

接下来我们会用到很多 debug 命令,但是使用这些命令的前提是,你需要在电脑上安装一下 debug,Windows/Mac 都可以安装,获取链接我已经给你找出来了。阿,忘记说了,我们这里使用的是 Dos box来模拟汇编的操作环境。

传送门(Mac 和 Windows 都是):https://www.dosbox.com/download.php?main=1

debug命令(debug命令e的使用)

下载完成后打开 DosBox ,打开之后是这样的。

debug命令(debug命令e的使用)

Debug 命令有很多,不过常用的一般就上面这几个。

好了,现在我们直接进入正题,开始在 Dosbox 上正式进行 Debug 操作,首先打开 Dosbox。

嗯。。。。。。这个界面我们打开很多次了。

那我写个命令呢?好吧,没演示过,下面就来了!

Debug -r

亲,用 Debug -r 就可以查看和修改 CPU 寄存器内容了呢。

debug命令(debug命令e的使用)

查看寄存器内容。

debug命令(debug命令e的使用)

这里需要注意一下 -r 大小写的问题,Debug -r 是查看寄存器内容。而 -R 则是无效指令。

上图列出来了很多寄存器,你可能觉得无从下手,不要乱,我们先从最基本的开始入手,也就是 CS 和 IP,CS(Code Segment)是代码段寄存器,一般也被称为段基址,可以认为是程序访问的入口,CPU 需要从 CS 中找到从哪个位置开始取指执行,但是我们还不知道要取哪一段,这时候 IP 的作用就体现出来了,IP(Instruction Pointer)就是指令指针寄存器,也叫做偏移地址,它会告诉我们从段基址开始,取哪一段的地址。

可以使用段基址:偏移地址来确定内存中的指定地址。

这里我们只是简单聊一下这两个寄存器的概念,要了解这两个寄存器的具体作用,可以看笔者的上一篇文章

使用 -r 也能够修改寄存器的内容,如下所示

debug命令(debug命令e的使用)Debug -e

上面说的都是查看内存中指定位置或者区域的值,下面我们要来改写一下内存值。

使用 -e 可以改写内存值,比如我们想要改写 1000:0 ~ 1000:f 中的内容,可以使用 -e 1000:0 0 1 2 3 4 5 6 7 8 9 0 a b c d e f 这种方式,如下图所示。

debug命令(debug命令e的使用)

我们使用 -e 写入之后,使用 -d 查看内存值,可以发现我们刚刚写入的值,但是却看不到机器码,所以机器码该如何看呢?

别急,还有个 -u 命令,这个就是看机器码的,如下图所示,我们使用 -u 命令显示我们写入的机器码。

debug命令(debug命令e的使用)NjaFfSPStDFmtE1JU60V__vQjh3XOTzqYU6eXMlzcd97sCW4WMp1lWHg7UElGPDA6agVNB6xLKJEQxBBZ5VghLBlGasYGS7GkenoMbEdYrvqcQhQQCXSEngfYC1lUXqaVpijktFclbySLOIso2rMM-3c8f-XrPFNHRn2cCV45kdCsjglakJkxNJhPSJ1wQQpfd2FFkS67ejD-nRzJCtB_IERTKfVDX9Bhns3HxiB3NHy_V_zlMg0nN0PzAlQeuarMC8OSmscF4yyvFWukzQtRKltoLZ1LHjFZz3MMKHxJKjn0CGvphNTwnVs8Ef21mkNPfmfky-U76T6PWGbWQcFnG1iGglKrvgX1m2-nYSfTQODZFzvSjreMIhyHD6HnbbY817E–PauVxHuS4s1r5Te-YOnXr4CgAA__8xMik0″ >

可以看到 1000:0000 ~ 1000:0006 这个内存地址使我们写入的机器码,-u 这个命令就是将内存单元的内容翻译为汇编指令并显示。

-u 输出的结果分为三部分显示:

最左侧是每一条机器指令的地址;中间是机器指令;最右侧是机器指令执行的汇编指令。

1000:0 处存放的是写入的机器码 B8 01 00 组成的机器指令,对应的汇编指令是 MOV AX,0001。

1000:0003 处存放的是写入的机器码 B9 02 00 组成的机器指令,对应的汇编指令是 MOV CX,0002。

1000:0006 处存放的是写入的机器码 C1 C8 所组成的机器指令,对应的汇编指令是 add ax,cx。

Debug -t

上面介绍的一系列指令包括我们上面提到的 Debug -e 机器码都是向内存中进行写入,那么如何执行这些指令呢?

我们可以使用 Debug -t 来执行写入的指令。使用 Debug -t 可以执行由 CS:IP 指向的指令。

既然是 -t 能够执行从 CS:IP 指向的命令,所以我们有必要将 CS:IP 指向 1000:0(因为我们前面将指令写在了 1000:0 处)。

首先我们需要执行 -r cs 1000 ,-r ip 0 把 CS:IP 赋值为 1000:0。

然后执行 -t 指令,下图是已经执行过的指令截图。

debug命令(debug命令e的使用)NnamiZWJ_7vF_VyuS8XrIJPfczLx8c5HzlHUFKSLzLBGd8A_wiUSArg_wUrKfPCN4wctgrONrrMlOQ44ynToyw1llRinhTGzjRKZJtGzqIWTzGjBolNAiOTQNeL7U8x9OzYJpbrLiGC0Mbo84L_D6DltZ1mLLI0wELyKKH6ldjct-g-54IWgeWatulZDrKa-4sDlkrQgPxBPRF2h85PXpbTSbgZYmf8W63JmDVgD2i1-dPN5xpQggMf3G-onzMEJw1ULjHBgtEnzqIkqA__dRXJFV9uf_2YyP5hhEL25fvXm7ZY-z7k-9ZaVa9zXHKlUnJt64y4PKsgtFujrEp-dGiWV2zz_rd0fIAjvkbTTmcwm2WHQaMd7uyb1lwbP2w8P2nXa_ous7qW2viDWrQ7f6HXU3l6CQAA__9OniLU” >

可以看到,执行完 -t 指令之后,MOV AX,0001 这条指令被执行,当前 AX 寄存器的内容变为了 0001,这条汇编指令的意思就是把 0001 移动到 AX 寄存器中。

继续执行 -t 之后,我们可以看到寄存器的变化。

debug命令(debug命令e的使用)NP5TzNFr33UYPYw1xrj3wuv9_Huy_cAaSCUZYA5wAKEefAeQcbKbPc0bTM7OSMJqpMC8lwyjhVg5RrMRaUaBkNOoxjSjQfGShAZuD3I4JsEvlhAKFldLtQt2wcoX9r9uGaes-w2pFIuYuFZEFM1JBIzOJ21SFVxgTJXb0LEezplq23q_NmLAtB3MnrCJJoZHhvfDzdb4czjKOh-Tyd66hljoDSeO_qXSmgEAw4oK4LHBUgNwX3a7R1_v4P_z3w0NzMwgTvrXRCN0mIvIHfMoYl2r7MrrqtRnyz-FJYXdmpsB3xs3WTWSO-X2bqqbFLa9_fy9O0L1-ulVDb2QjWnqtcG-3PF916tHbCSn1Qiiop-o_75eLp_3jOvUX_Ybu8KoVG_uvy1fH4GQAA__8gMSdF” >Debug -a

毕竟机器指令不是那么好懂,写入很不方便,所以有没有办法能够支持我们直接写入汇编指令呢?还真有,Debug 提供了 -a 这种方式来实现汇编指令的写入。如下图所示

debug命令(debug命令e的使用)NwbQ9IsaTObtktT7RS_-9ANr-2GXvU-kF_y_OHZg1zymGfA34NKpiXwn0GiVFH6ul5Y_ZLHmabySnGccxFrJBd6imVM9SImfS5wTHUHIeRhaA4MJ7IJ87DlOlGEmGkwx7WdwZ8V3wWW4ZlOl8lcBFgqTlKqvVKFedqt-7QuuKRlYCBoQ89wXKNbn27GqpI0eMt260VIO2a4-Zfjekj-o8XjePgw8gSfdawx6LXiq4tfeqCSHPigqQwcekAllYgaFHY6f8PXi8xDc3hH-AROnt5DNlmOyHT4F9qQXDSt1vsr77mtpq5jW1saFas2sNZ7jcC0Y13nyhpvyi9-qW-gvnVteMMPoXA-TdisY4aj4n6h1ox87MrxcjagCdpeNMLWfhX7OcWfG7-jPHwGAAD__ww4GbY=” >

可以看到,我们使用了 -a 命令来对 1000:0 进行写入,分别输入 mov ax,1 mov bx,2 mov cx,3 add ax,bx add ax,cx add ax,ax 指令,然后按回车进行确定执行。

我们使用 -d 1000:0 f 可以看到从偏移地址 0 处开始的第 f 个内存指令(因为最大写入的地址只是 f)。

debug命令(debug命令e的使用)NDOuaOel-f5NflDDoALRtkWuAeQizgD7gdYS5lmLoRpt5MxulUlzyXDnCVUDXkCYywogSkNOyzBlMAQRw4ikeX0zMBEhhFYxAhsAyMbIzu0tX9Ltve6umNY7ZXgiYeFZGFM1IhIzOJ21SFVygTJPN3WTM3RLaS3q_NmLHNBvGwn–Vm84jfna2c-3t_NPNHc_-V9Wir2wdK472rd6GAXDDggroucFSAXOdJUKOt8_d_-O8rEr5NEBpOuJiYpY-eMaVRy_AHHP2fXXVbjfhm8aWwurJTYSUJ0mWTWSO-X2bqqbFLa9_fy9O0L18GCw2WyNRqz1Wujfbni2492rG1J9HTIJ4WhT6e6rvhQyULwaqXqXlVCo381-WL4_EzAAD__-OlJ88=” >

上图中的 1000:000F 为什么有值呢,因为我们上面已经执行过这个写入了。

另外,使用 -a 可以从一个预设的地址处开始输入指令。

总结

今天和大家聊了一下 Debug 的基本用法,主要包括

-r 查看、修改寄存器中的内容-d 查看内存中的指令-e 修改内存中的内容-u 可以将内存中的内容解释为机器指令和对应的汇编指令-t 执行 CS:IP 处的指令-a 以汇编得形式向内存写入内容

汇编指令的选项有很多,上面介绍的这些属于经常用到的指令,这些指令要能够熟练使用。

本站部分内容由互联网用户自发贡献,该文观点仅代表作者本人,本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如发现本站有涉嫌抄袭侵权/违法违规等内容,请联系我们举报!一经查实,本站将立刻删除。