掌握这10种方法帮你快速在Linux上分析二进制文件
我们每天都使用二进制文件,但对二进制文件知之甚少。二进制是指您每天运行的可执行文件,从命令行工具到成熟的应用程序。Linux提供了丰富的工具集,可轻松进行二进制分析!无论您的工作角色是什么,如果您在Linux上工作,了解有关这些工具的基础知识将有助于更好地理解你的系统。
在本文中,我们将介绍这些Linux工具和命令中最流行的一些,其中大多数将作为你的Linux发行版的一部分在本地就可提供。如果没有,您可以随时使用软件包管理器来安装和浏览它们。请记住:在适合的场合学习使用正确的工具需要足够的耐心和练习。
更多开源资讯及干货内容欢迎关注微信公众号“开源村OSV”
方法1:file
作用:帮助确定文件类型。
这将是您进行二进制分析的起点。我们每天处理文件,并非所有的东西都是可执行的类型,文件类型非常宽泛。在开始之前,您需要了解要分析的文件类型。它是二进制文件,库文件,ASCII文本文件,视频文件,图片文件,PDF,数据文件等等。
该file的命令将帮助你确定你即将处理的文件的确切类型。
方法2:ldd
作用:打印共享对象依赖性。
如果您已经在可执行二进制文件上使用了上面的file命令,你不要错过输出中的“动态链接”这条消息。这条消息是什么意思?
开发软件时,我们尽量不要重新发明轮子。大多数软件程序需要执行一组通用任务,例如打印输出或从标准文件中读取或打开文件等。所有这些通用任务都通过一组通用函数抽象出来,每个人都可以使用它们代替编写自己的变体。这些通用函数被放在名为libc 或 glibc的库中。
如何找到某一个可执行文件所依赖的库?这就是ldd命令出现的地方。针对动态链接的二进制文件运行它,会显示所有它所依赖的库及路径。
方法3:ltrace
作用:跟踪进程调用库函数的情况。
现在,我们知道如何使用ldd命令查找可执行程序所依赖的库。但是,一个库可以包含数百个函数。在这数百种中,我们的二进制文件实际使用的功能是什么?
该ltrace命令将显示所有在运行时间里被从库里调用的函数。在下面的示例中,您可以看到正在调用的函数名称以及传递给该函数的参数。您还可以在输出的最右侧看到这些函数返回的内容。
更多开源资讯及干货内容欢迎关注微信公众号“开源村OSV”
方法4:Hexdump
作用:以ASCII、十进制、十六进制或八进制显示文件内容。
通常,您在一个应用程序中打开一个文件都会不知道怎么打开这个文件。尝试使用vim打开一个可执行文件或一段视频文件,但是您通过屏幕看到的总是一堆乱码。
在Hexdump中打开未知文件,可帮助您准确地查看文件中包含的内容。您也可以使用一些命令行选项,有选择地查看文件中这些数据的ASCII表示形式。这可能有助于您了解文件的类型。
方法5:strings
作用:打印文件中可打印字符的字符串。
如果Hexdump在您的用例中看起来有点过大,而您只是在二进制文件中寻找可打印的字符,则可以使用 strings 命令。
开发软件时,会向其中添加各种文本/ ASCII消息,例如打印信息的消息、调试信息、帮助消息和错误等。如果所有这些信息都存在于二进制文件中,它将以字符串的形式转储到屏幕上 。
方法6:readelf
作用:显示有关ELF文件的信息。
ELF(可执行文件和可链接文件格式)是可执行文件或二进制文件的主要文件格式,不仅在Linux上,在各种UNIX系统上也是如此。如果您使用过诸如file命令之类的工具,该工具会告诉您该文件为ELF格式,那么下一步将是使用 readelf 命令及其各种选项来进一步分析该文件。
当使用readelf时,方便地参考实际ELF规范是非常有用的。您可以在此处找到ELF规范。
方法7:objdump
作用:显示来自目标文件的信息。
当您编写源代码时会创建二进制文件,而使用称为编译器的工具会对其进行编译。该编译器生成与源代码等效的机器语言指令,然后可由CPU执行一个给定的任务。这种机器语言编码可以通过称为汇编语言的助记符来解释该机器语言代码。汇编语言是一组指令,可以帮助您了解程序正在执行的操作以及最终在CPU上执行的操作。
objdump 效用是读取二进制或可执行文件,并将汇编语言指令转储到屏幕上。汇编知识对于理解objdump 命令的输出至关重要 。
请记住:汇编语言是特定于体系结构的。
更多开源资讯及干货内容欢迎关注微信公众号“开源村OSV”
方法8:strace
作用:跟踪系统调用和信号。
如果您使用了 前面提到的ltrace,请考虑 一下strace 是相似的。唯一的区别是,strace 的效用可以跟踪系统调用,而不是调用库 。系统调用是您与内核交互以完成工作的方式。
举个例子,如果您想在屏幕上打印一些东西,您将使用 标准库libc中的 printf 或 puts函数;但是,在幕后,最终将调用名为write的系统,打印东西到屏幕上。
方法9:nm
作用:列出目标文件中的符号。
如果您使用的是未剥离的二进制文件,则 nm 命令将为您提供在编译过程中嵌入在二进制文件中的有价值的信息。nm 可以帮助您从二进制文件中识别变量和函数。您可以想象如果您无法访问所分析的二进制代码的源代码,这将有多大用处。
为了展示nm,我们将快速编写一个小程序并使用-g 选项对其进行编译 ,并且还将看到使用file命令不会剥离二进制文件。
方法10:gdb
作用:GNU调试器。
好吧,并不是二进制文件中的所有内容都可以静态分析。我们确实执行了一些运行二进制文件的命令,例如 ltrace 和 strace;但是,软件包含各种条件,可能导致执行各种替代路径。
分析这些路径的唯一方法是在运行时通过能够在任何给定位置停止或暂停程序并能够分析信息,然后进一步向下移动来进行分析。这就是调试器出现的地方,在Linux上,gdb 是事实上的调试器。它可以帮助您加载程序,在特定位置设置断点,分析内存和CPU寄存器以及执行更多操作。它是上述其他工具的补充,使您可以进行更多运行时的分析。
需要注意的一件事是,一旦使用gdb加载了程序,就会看到它自己的(gdb)提示符。所有其他命令将在此gdb 命令提示符下运行, 直到退出。我们将使用先前编译的“ hello”程序,并使用 gdb 查看其工作方式
更多开源资讯及干货内容欢迎关注微信公众号“开源村OSV”
结论:
一旦您对使用这些本机Linux二进制分析工具感到满意,并理解了它们提供的输出,就可以使用更高级和专业的开源二进制分析工具,例如 radare2。
掌握这10种方法帮你快速在Linux上分析二进制文件的更多相关文章
- C 程序提升效率的10种方法
本文向你介绍规范你的C代码的10种方法(引用地址http://forum.eepw.com.cn/thread/250025/1). 1. 避免不必要的函数调用 考虑下面的2个函数: void s ...
- 为了弄懂Flutter的状态管理, 我用10种方法改造了counter app
为了弄懂Flutter的状态管理, 我用10种方法改造了counter app 本文通过改造flutter的counter app, 展示不同的状态管理方法的用法. 可以直接去demo地址看代码: h ...
- 让C程序更高效的10种方法(转)
原文:http://blog.jobbole.com/1198/ 代码之美,不仅在于为一个给定问题找到解决方案,而且还在代码的简单性.有效性.紧凑性和效率(内存).代码设计比实际执行更难 .因此,每一 ...
- 让C程序更高效的10种方法
http://blog.jobbole.com/1198/ 代码之美,不仅在于为一个给定问题找到解决方案,而且还在代码的简单性.有效性.紧凑性和效率(内存).代码设计比实际执行更难 .因此,每一个程序 ...
- Microsoft.VisualBasic.dll的妙用and 改善C#公共程序类库质量的10种方法
Microsoft.VisualBasic.dll的妙用(开发中肯定会用到哦) 前言 做过VB开发的都知道,有一些VB里面的好的函数在.NET里面都没有,而Microsoft.VisualBasic. ...
- 人工智能改进传统云ERP的10种方法
http://blog.itpub.net/31542119/viewspace-2168809/ 随着数字化转型的进程加快,企业开始重新评估ERP的作用.传统ERP经过多年僵硬化定制过于追求生产的一 ...
- 利用Linux系统生成随机密码的10种方法【转】
Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它.例如,你可以通过数十种方法来生成随机密码.本文将介绍生成随机密码的十种方法. 1. 使用SHA算法来加密日期,并输出结 ...
- Linux下查看压缩文件内容的 10 种方法
Linux下查看压缩文件内容的 10 种方法 通常来说,我们查看归档或压缩文件的内容,需要先进行解压缩,然后再查看,比较麻烦.今天给大家介绍 10 不同方法,能够让你轻松地在未解压缩的情况下查看归档或 ...
- 改善C#公共程序类库质量的10种方法
最近重构一套代码,运用以下几种方法,供参考. 1 公共方法尽可能的使用缓存 public static List<string> GetRegisteredCompany() { Str ...
随机推荐
- web测试流程
1.立项后测试需要拿到文档(需求说明书,原型图,接口文档,) 2.需求评审 3.用例编写(主流程,备流程,异常流,业务规则,正常类,异常类,页面检查) 测试用例编写方法(等价类划分,边界值分析法,错误 ...
- [php] 简单的实现一个错误接管类
自己弄的一个错误接管类: <?php //---------------------------------- // Leephp 错误接管类 // 2017-07-06 // Pengchon ...
- Java中Random类
Random:产生随机数的类 构造方法: public Random();没有给种子,用的是默认种子,是当前时间的毫秒值. public Random(long seed);给出指定的种子 //给定种 ...
- vue中解决时间在ios上显示NAN的问题
最近在用vue,遇到倒计时在ios上显示为NAN的问题. 因为做的是倒计时支付,思路是获取服务器时间和下单时间,再转成秒级时间戳做差值. 在网上找到说是ios 不支持例如2018-09-01 10:0 ...
- 电脑Win10晚上让它更新,为何第二天开机蓝屏?
大家好,欢迎来到<电脑讲堂>,我是主持人高帅帅.PS:没错,就是那个人见人爱,花见花开的高帅帅. 话说,在一个月黑风高的夜晚,我晚上离开实验室,离开前看到了电脑的系统更新提醒,就顺手点了一 ...
- 如何给 Inno Setup 生成的安装包添加版本信息
使用 Inno 已有的函数 GetFileVersion 获取 EXE 文件的版本 #define ApplicationName 'Application Name' #define Applica ...
- QT使用提升自定义组件
QT使用提升自定义组件 QTC++QT自定义 QT 组件提升来实现自定义功能 介绍 我们在使用QT设置界面之后,往往需要自己实现一些方法,如果是单独 的还好,但是如果遇到很多同类型的都有需求, 比如 ...
- Libra教程之:执行Transactions
文章目录 Transactions是什么 Transactions运行的基础条件 Transactions的结构 执行Transactions Transactions是什么 我们讲到了Libra是一 ...
- 【集群实战】共享存储实时备份(解决nfs共享存储的单点问题)
1. nfs存储的单点问题 如果nfs服务器宕机了,则所有的nfs客户机都会受到影响.一旦宕机,会丢失部分用户的数据.为了解决单点问题,需要实现共享存储的实时备份,即:将nfs服务端共享目录下的数据实 ...
- 多方法解决设置width:100%再设置margin或padding溢出的问题
2019独角兽企业重金招聘Python工程师标准>>> 当设置了父元素的宽度,子元素设置宽度为100%后再在加上子元素上添加padding或margin值就会溢出.举个例子: < ...