使用strings查看二进制文件中的字符串
今天介绍的这个小工具叫做strings,它实现功能很简单,就是找出文件内容中的可打印字符串。所谓可打印字符串的涵义是,它的组成部分都是可打印字符,并且以null或者newline结尾。
对于普通文本文件来说,strings没有任何意义,因为文本文件中的任何内容实际都是可打印的字符串。strings最常用的场合就是列出动态库或者可执行程序等二进制文件中出现的字符串,结合grep即可实现查找。
strings的使用方法很简单,strings [文件]即可,它会默认输出长度大于4的字符串,每行一个。
此外它还有几个参数。
-n number 仅输出长度大于number的字符串
-t d/o/x 除了字符串之外,还额外输出字符串的位置(十进制/八进制/十六进制)
下面我用C语言写一个很简单的hello world程序:
#include
int main()
{
printf("hello world\n");
return 0;
}
编译过程中,hello world作为一个静态字符串会保存在全局数据区。使用strings查看,即可看到”hello world”这个字符串:
[leconte@localhost test]$ strings test
/lib/ld-linux.so.2
__gmon_start__
libc.so.6
_IO_stdin_used
puts
__libc_start_main
GLIBC_2.0
PTRh
[^_]
world world
除了hello world之外还有许多字符串,这些都是二进制文件test里包含的,它们都是编译,链接期间从glibc等动态库或其他地方引入的。
更为过分的是,我们可以用sed等编辑器对字符串进行修改:
[leconte@localhost test]$ gcc -g -o test a.c
[leconte@localhost test]$ ./test
hello world
[leconte@localhost test]$ sed -i 's/hello world/linuxers.cn/g' test
[leconte@localhost test]$ ./test
linuxers.cn
可见我将hello world改成了linuxers.cn,执行test后输出已经变成了linuxers.cn,我们成功修改了可执行程序。但是这种修改必须很小心,通常字符串的长度在修改前后必须严格相等,否则很有可能产生段错误,因为毕竟我们修改的是数据而非代码逻辑。假如我像下面这样修改,执行后就会段错误:
[leconte@localhost test]$ sed -i 's/linuxers.cn/linux/g' test
[leconte@localhost test]$ ./test
段错误
使用strings查看二进制文件中的字符串的更多相关文章
- linux查看日志中特定字符串以及前后信息内容命令
在项目实施过程中,我们经常会查看日志,更是经常会根据某些特地字符串去查找日志内容. 下面就是日志查找命令: 1.查询字符串命令: cat fileName|grep '要查找的字符串' 实例:cat ...
- linux上查找文件存放地点和文件中查找字符串方法
一.查找文件存放地点 1.locate 语法:locate <filename> locate命令实际是"find -name"的另一种写法,但是查找方式跟find不同 ...
- linux strings-在对象文件或二进制文件中查找可打印的字符串
推荐:更多Linux 文件查找和比较 命令关注:linux命令大全 strings命令在对象文件或二进制文件中查找可打印的字符串.字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束. str ...
- strings---对象文件或二进制文件中查找可打印的字符串
strings命令在对象文件或二进制文件中查找可打印的字符串.字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束. strings命令对识别随机对象文件很有用. 语法 strings [ - ...
- Go中的字符串使用----strings和strconv
Go中的字符串操作 字符串是工作中最常用的,值得我们专门的练习一下.在Go中使用strings包来操作字符串,这也是内置的包哈,不像Java中要么手写,要么引入common-lang 或者 别的第三方 ...
- Java中的字符串常量池
ava中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new ...
- 使用hexdump 查看二进制文件
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- 转载:Java中的字符串常量池详细介绍
引用自:http://blog.csdn.net/langhong8/article/details/50938041 这篇文章主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重 ...
- [译]C#和.NET中的字符串
原文地址:Jon Skeet:Strings in C# and .NET System.String 类型(在C#语言中对应的别名是string)是.NET最重要的类型之一,不幸的是在它身上存在了太 ...
随机推荐
- Js IP转数字
<script type="text/javascript"> function d2h(d) { return d.toString(16) } function h ...
- Java程序设计之打印100~999的水仙花数
package printDaffodilNumber; /* * 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身 ...
- android文件的写入与读取---简单的文本读写context.openFileInput() context.openFileOutput()
最终效果图,点击save会保存到文件中,点击show会从文件中读取出内容并显示. main.xml <?xml version="1.0" encoding=" ...
- Hbase学习连接
http://blog.csdn.net/baolibin528/article/details/43672131 http://m.blog.csdn.net/article/details?id= ...
- Python元组
Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup1 = ('physi ...
- linux系统top命令查看系统状态
Linux系统可以通过top命令查看系统的CPU.内存.运行时间.交换分区.执行的线程等信息.通过top命令可以有效的发现系统的缺陷出在哪里.是内存不够.CPU处理能力不够.IO读写过高. 使用SSH ...
- leecode系列--Two Sum
学习这件事在任何时间都不能停下.准备坚持刷leecode来提高自己,也会把自己的解答过程记录下来,希望能进步. Two Sum Given an array of integers, return i ...
- .NET跨平台之旅:在Linux上将ASP.NET 5运行日志写入文件
在前一篇博文(增加文件日志功能遇到的挫折)中,我们遇到了这样一个问题:虽然有一些.NET日志组件(比如Serilog, NLog)已经开始支持.NET Core,但目前只支持控制台输出日志,不支持将日 ...
- Equal Sides Of An Array
参考:http://stackoverflow.com/questions/34584416/nested-loops-with-arrays You are going to be given an ...
- cosbench 压测RGW生产环境
配置信息: 使用 2个万兆网卡的RGW主机,并用OSPF做高可用和负载均衡. Ceph OSD集群 有21Node (万兆网卡+ 12个4T SATA机械硬盘) 测试VM配置: 使用在使用VXLA ...