我记不住的那些命令-xxdod

2024-03-16 04:44
文章标签 命令 记不住 xxdod

本文主要是介绍我记不住的那些命令-xxdod,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景:

这里记录一下具体的xxd和od命令参数和使用方法,我想我肯定是记不住这些参数的。

零、文件

我们这里有一个示例文件README.txt,内容如下图所示:

一、xxd(查看、编辑二进制文件)

1.  十六进制显示(默认)

我们发现上面的显示,总共由 8 列组成,每一列是2个字节,这一行是16个字节的数据,左侧是相应的地址。

重点:磁盘上的这些十六进制的内容英文字母使用ascii码来显示,例如:'bochs-2.8'   0x626f 6368 732d 322e 38,每一个字母使用一个字节来表示,0x0a代表是换行,两次换行后就是中文,而中文内容使用utf-8编码来表示, 例如:"生成一个硬盘"即如下图所示,是使用Python来将这一句话转换为utf-8编码。

综上: xxd查看磁盘上文件的十六进制,英文是ASCII编码,中文是utf-8编码。

2.  二进制显示

-b  以二进制进行显示

我们发现这种是 由 6 列组成,每一列是 1 个字节,这一行是 6个字节的数据,左侧是相应的地址。

问题: 从十六进制看和二进制看,发现每一行的字节数是无法一一对应上的,我们需要修改列数和每列的字节数来保持同一个文件的不同格式的查看。

3. 每行的总字节数(-c),每列的字节数(-g)

我们根据二进制的显示,发现每行是6列,每列是一个字节,所以这里的 -c 6  -g 1  如上图所示。

这样能解决,二进制和十六进制的同时查看且每行数据都放置在了相同行,没发生错行。

-g  每一列显示几个字节,默认是2个字节

-c   每一行显示的总共的字节数

如下图所示,一行是8个字节,每一列时候2个字节,总共是4列数据。

每一行是8个字节,每一列是1个字节,总共是8列数据,如下图所示:

4. 长度(-l),偏移量(-s)

从0x00000010开始,长度为32个字节

我们从完整文件中取出了第2行和第3行数据。

-s (+/-)value  偏移量,如果是正值则是从开始计算,如果是负值则是从末尾进行计算

5. 朴素方式显示(-p) plane

没有任何行号标记以及解码,直接就是显示十六进制的值。

6. 大写(-u)

将十六进制的字母大写

7. 恢复(-r)
7.1  部分修改

我们看到原始内容是60MB,下面的操作修改二进制将60MB改成120MB

我们发现60MB改成120MB,只需要将 “空格6”变为“12”即可, “空格6”为 0x2036, ASCII码中0x20代表空格,ASCII码中0x36代表6,得到 “12”的ASCII为 0x3132

这里的44:3132,代表在0x44的字节开始,写入0x3132的值。

将README.txt在0x44字节开始,写入0x3132

我们再次查看文件十六进制,发现已经改为了120MB了

创建一个新文件,这个文件在第0x100字节写上A:

我们再次查看 test.txt :

7.2 全部修改

这里我们以MBR二进制文件来编辑,不再使用文本文件来编辑(因为文本文件直接修改就行,无需转换为十六进制修改)。

先查看 mbr.img的十六进制信息

将十六进制信息保存为一个文件dump

xxd mbr.img mbr.dump

vim mbr.dump进行修改,直接修改

注意: 修改左侧的十六进制的ASCII码或者UTF-8码才会生效,而修改右侧的英文或中文则没有效果。

我们将baby改为haha ,   0x62616279 --->>>  0x68616861  ,只改左侧的十六进制码值,右侧的文字不用改动,如下图所示:

将这个文件mbr.dump恢复为新的二进制文件:

xxd -r mbr.dump > newmbr.img 或 xxd -r mbr.dump newmbr.img

我们把这个newmbr.img放到bochs试一下:

将newmbr.bin复制到硬盘文件上,然后启动机器,如下图所示

8.搭配vim使用

我们使用vim打开的二进制文件,然后会看到一些乱码和一些错乱的内容,我们使用:%!xxd 命令来查看二进制文件的十六进制码值的显示。

vim -b binaryfile   // 设置二进制方式来读取和编辑文件,它与 vim binaryfile的区别在于, vim binaryfile会多显示一个最后的换行符,在windows下是 0x0d 0x0a ,在Linux下是0x0a

或者

vim binaryfile  

:set binary 或 :set bin  // 进入到二进制模式

综上:这是两种不同的打开二进制文件的方式。

然后在底部输入 :%!xxd进行编辑即可, %表示操作整个缓冲区,! 表示执行外部的命令

我们这次将 haha改为fafa,0x68616861 --->>> 0x66616661

修改完毕后,底部输入命令 :%!xxd -r 直接进行修改,  或者  :%!xxd -r > newmbr2.img 修改保存到一个新二进制文件中。

完成。

9. 输出为C代码(-i)

将二进制文件直接输出为 C代码

二、od

1. 版本(--version)

--version 显示版本

2. 帮助(--help)

--help  帮助

3. 输出格式(-t)

-t x1   输出十六进制,每一列是一个字节,x代表是十六进制,1代表每列是一个字节

同理 -t x2  输出十六进制,每列是两个字节,这里有一个关键的区别千万要注意,如下图所示:

而 xxd -g 2 mbr.img如下所示:

我们发现xxd的双字节是和右侧的字符按照从左到右的顺序是一一对应,而od的双字节是按照书写的方式进行0x36d8,这里面蕴含着大端和小端的概念。关于这部分知识可以查看 基础知识-大小端

4. 每行的总字节数(-w)

-w 默认是16个字节

5. 长度(-N),偏移量(-j)

-j 字节数,代表偏移

-N 字节数,代表长度

6. 全部(-v)

默认情况是00会被显示"*",它不带有什么意义。如果想全部显示内容,增加-v即可。

7. 大小端(--endian)

--endian  big/little(略)

8. 地址(-A)

默认是以十六进制的地址来显示偏移量,如下图:

我们使用-A d来将左侧的地址变为十进制

三、总结

在Linux下除了xxd和od这两个命令可以查看二进制,还有hexdump命令可以查看,咱们不再这里再次赘述了,使用起来都差不多,用哪一个都行,大家加油,完结。

这篇关于我记不住的那些命令-xxdod的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/814324

相关文章

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

PHP执行php.exe -v命令报错的解决方案

《PHP执行php.exe-v命令报错的解决方案》:本文主要介绍PHP执行php.exe-v命令报错的解决方案,文中通过图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录执行phpandroid.exe -v命令报错解决方案执行php.exe -v命令报错-PHP War

CentOS系统使用yum命令报错问题及解决

《CentOS系统使用yum命令报错问题及解决》文章主要讲述了在CentOS系统中使用yum命令时遇到的错误,并提供了个人解决方法,希望对大家有所帮助,并鼓励大家支持脚本之家... 目录Centos系统使用yum命令报错找到文件替换源文件为总结CentOS系统使用yum命令报错http://www.cppc

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

linux 判断某个命令是否安装

linux 判断某个命令是否安装 if ! [ -x "$(command -v git)" ]; thenecho 'Error: git is not installed.' >&2exit 1fi

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚