mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-29 21:41:00 +08:00
Merge pull request #18348 from wxy/20200430-10-ways-to-analyze-binary-files-on-Linux
PRF&PUB:20200430 10 ways to analyze binary files on linux
This commit is contained in:
commit
e04a489c77
@ -1,8 +1,8 @@
|
|||||||
[#]: collector: (lujun9972)
|
[#]: collector: (lujun9972)
|
||||||
[#]: translator: (wxy)
|
[#]: translator: (wxy)
|
||||||
[#]: reviewer: ( )
|
[#]: reviewer: (wxy)
|
||||||
[#]: publisher: ( )
|
[#]: publisher: (wxy)
|
||||||
[#]: url: ( )
|
[#]: url: (https://linux.cn/article-12187-1.html)
|
||||||
[#]: subject: (10 ways to analyze binary files on Linux)
|
[#]: subject: (10 ways to analyze binary files on Linux)
|
||||||
[#]: via: (https://opensource.com/article/20/4/linux-binary-analysis)
|
[#]: via: (https://opensource.com/article/20/4/linux-binary-analysis)
|
||||||
[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe)
|
[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe)
|
||||||
@ -12,11 +12,11 @@
|
|||||||
|
|
||||||
> 这些简单的命令和工具可以帮助你轻松完成分析二进制文件的任务。
|
> 这些简单的命令和工具可以帮助你轻松完成分析二进制文件的任务。
|
||||||
|
|
||||||
![Tux with binary code background][1]
|
![](https://img.linux.net.cn/data/attachment/album/202005/05/232115nn0oduodo4oztv0a.jpg)
|
||||||
|
|
||||||
“这个世界上有 10 种人:懂二进制的人和不懂二进制的人。”
|
“这个世界上有 10 种人:懂二进制的人和不懂二进制的人。”
|
||||||
|
|
||||||
我们每天都在与二进制文件打交道,但我们对二进制文件却知之甚少。我所说的二进制,是指你每天运行的可执行文件,从你的命令行工具到成熟的应用程序都是。
|
我们每天都在与二进制文件打交道,但我们对二进制文件却知之甚少。我所说的二进制,是指你每天运行的可执行文件,从命令行工具到成熟的应用程序都是。
|
||||||
|
|
||||||
Linux 提供了一套丰富的工具,让分析二进制文件变得轻而易举。无论你的工作角色是什么,如果你在 Linux 上工作,了解这些工具的基本知识将帮助你更好地理解你的系统。
|
Linux 提供了一套丰富的工具,让分析二进制文件变得轻而易举。无论你的工作角色是什么,如果你在 Linux 上工作,了解这些工具的基本知识将帮助你更好地理解你的系统。
|
||||||
|
|
||||||
@ -26,7 +26,7 @@ Linux 提供了一套丰富的工具,让分析二进制文件变得轻而易
|
|||||||
|
|
||||||
它的作用:帮助确定文件类型。
|
它的作用:帮助确定文件类型。
|
||||||
|
|
||||||
这将是你进行二进制分析的出发点。我们每天都在与文件打交道。并非所有的文件都是可执行类型,除此之外还有各种各样的文件类型。在你开始之前,你需要了解要分析的文件类型。它是二进制文件、库文件、ASCII 文本文件、视频文件、图片文件、PDF、数据文件等等。
|
这将是你进行二进制分析的起点。我们每天都在与文件打交道,并非所有的文件都是可执行类型,除此之外还有各种各样的文件类型。在你开始之前,你需要了解要分析的文件类型。是二进制文件、库文件、ASCII 文本文件、视频文件、图片文件、PDF、数据文件等文件吗?
|
||||||
|
|
||||||
`file` 命令将帮助你确定你所处理的文件类型。
|
`file` 命令将帮助你确定你所处理的文件类型。
|
||||||
|
|
||||||
@ -66,11 +66,11 @@ $
|
|||||||
|
|
||||||
### ltrace
|
### ltrace
|
||||||
|
|
||||||
它的作用:一个库调用跟踪器。
|
它的作用:库调用跟踪器。
|
||||||
|
|
||||||
我们现在知道如何使用 `ldd` 命令找到一个可执行程序所依赖的库。然而,一个库可以包含数百个函数。在这几百个函数中,哪些是我们的二进制程序正在使用的实际函数?
|
我们现在知道如何使用 `ldd` 命令找到一个可执行程序所依赖的库。然而,一个库可以包含数百个函数。在这几百个函数中,哪些是我们的二进制程序正在使用的实际函数?
|
||||||
|
|
||||||
`ltrace` 命令可以显示在运行时从库中调用的所有函数。在下面的例子中,你可以看到被调用的函数名称,以及传递给该函数的参数。你也可以在输出的最右边看到这些函数返回的内容。
|
`ltrace` 命令可以显示运行时从库中调用的所有函数。在下面的例子中,你可以看到被调用的函数名称,以及传递给该函数的参数。你也可以在输出的最右边看到这些函数返回的内容。
|
||||||
|
|
||||||
```
|
```
|
||||||
$ ltrace ls
|
$ ltrace ls
|
||||||
@ -95,7 +95,7 @@ $
|
|||||||
|
|
||||||
它的作用:以 ASCII、十进制、十六进制或八进制显示文件内容。
|
它的作用:以 ASCII、十进制、十六进制或八进制显示文件内容。
|
||||||
|
|
||||||
通常情况下,当你用一个应用程序打开一个文件,而它不知道如何处理该文件时,就会出现这种情况。尝试用 `vim` 打开一个可执行文件或视频文件,你会看到的只是屏幕上抛出的乱码。
|
通常情况下,当你用一个应用程序打开一个文件,而它不知道如何处理该文件时,就会出现这种情况。尝试用 `vim` 打开一个可执行文件或视频文件,你屏幕上会看到的只是抛出的乱码。
|
||||||
|
|
||||||
在 `hexdump` 中打开未知文件,可以帮助你看到文件的具体内容。你也可以选择使用一些命令行选项来查看用 ASCII 表示的文件数据。这可能会帮助你了解到它是什么类型的文件。
|
在 `hexdump` 中打开未知文件,可以帮助你看到文件的具体内容。你也可以选择使用一些命令行选项来查看用 ASCII 表示的文件数据。这可能会帮助你了解到它是什么类型的文件。
|
||||||
|
|
||||||
@ -132,7 +132,7 @@ $ strings /bin/ls
|
|||||||
|
|
||||||
ELF(<ruby>可执行和可链接文件格式<rt>Executable and Linkable File Format</rt></ruby>)是可执行文件或二进制文件的主流格式,不仅是 Linux 系统,也是各种 UNIX 系统的主流文件格式。如果你已经使用了像 `file` 命令这样的工具,它告诉你文件是 ELF 格式,那么下一步就是使用 `readelf` 命令和它的各种选项来进一步分析文件。
|
ELF(<ruby>可执行和可链接文件格式<rt>Executable and Linkable File Format</rt></ruby>)是可执行文件或二进制文件的主流格式,不仅是 Linux 系统,也是各种 UNIX 系统的主流文件格式。如果你已经使用了像 `file` 命令这样的工具,它告诉你文件是 ELF 格式,那么下一步就是使用 `readelf` 命令和它的各种选项来进一步分析文件。
|
||||||
|
|
||||||
在使用 `readelf` 命令时,有一个实际的 ELF 规范的参考是非常有用的。你可以在[这里][2]找到规范。
|
在使用 `readelf` 命令时,有一份实际的 ELF 规范的参考是非常有用的。你可以在[这里][2]找到该规范。
|
||||||
|
|
||||||
```
|
```
|
||||||
$ readelf -h /bin/ls
|
$ readelf -h /bin/ls
|
||||||
@ -163,9 +163,9 @@ $
|
|||||||
|
|
||||||
它的作用:从对象文件中显示信息。
|
它的作用:从对象文件中显示信息。
|
||||||
|
|
||||||
二进制文件是通过你编写源码的创建的,这些源码会通过一个叫做编译器的工具进行编译。这个编译器会生成相当于源代码的机器语言指令,然后由 CPU 执行,以执行特定的任务。这些机器语言代码可以通过被称为汇编语言的助记词来解读。汇编语言是一组指令,它可以帮助你理解由程序所进行并最终在 CPU 上执行的操作。
|
二进制文件是通过你编写的源码创建的,这些源码会通过一个叫做编译器的工具进行编译。这个编译器会生成相对于源代码的机器语言指令,然后由 CPU 执行特定的任务。这些机器语言代码可以通过被称为汇编语言的助记词来解读。汇编语言是一组指令,它可以帮助你理解由程序所进行并最终在 CPU 上执行的操作。
|
||||||
|
|
||||||
`objdump` 实用程序读取二进制或可执行文件,并将汇编语言指令转储到屏幕上。汇编语言知识对于理解 `objdump` 命令的输出是至关重要的。
|
`objdump` 实用程序读取二进制或可执行文件,并将汇编语言指令转储到屏幕上。汇编语言知识对于理解 `objdump` 命令的输出至关重要。
|
||||||
|
|
||||||
请记住:汇编语言是特定于体系结构的。
|
请记住:汇编语言是特定于体系结构的。
|
||||||
|
|
||||||
@ -174,7 +174,6 @@ $ objdump -d /bin/ls | head
|
|||||||
|
|
||||||
/bin/ls: file format elf64-x86-64
|
/bin/ls: file format elf64-x86-64
|
||||||
|
|
||||||
|
|
||||||
Disassembly of section .init:
|
Disassembly of section .init:
|
||||||
|
|
||||||
0000000000402150 <_init@@Base>:
|
0000000000402150 <_init@@Base>:
|
||||||
@ -219,7 +218,7 @@ $
|
|||||||
|
|
||||||
它的作用:列出对象文件中的符号。
|
它的作用:列出对象文件中的符号。
|
||||||
|
|
||||||
如果你所使用的二进制文件没有被剥离,`nm` 命令将为你提供在编译过程中嵌入到二进制文件中的有价值的信息。`nm` 可以帮助你从二进制文件中识别变量和函数。你可以想象一下,如果你无法访问二进制文件的源代码,这将是多么有用。
|
如果你所使用的二进制文件没有被剥离,`nm` 命令将为你提供在编译过程中嵌入到二进制文件中的有价值的信息。`nm` 可以帮助你从二进制文件中识别变量和函数。你可以想象一下,如果你无法访问二进制文件的源代码时,这将是多么有用。
|
||||||
|
|
||||||
为了展示 `nm`,我们快速编写了一个小程序,用 `-g` 选项编译,我们会看到这个二进制文件没有被剥离。
|
为了展示 `nm`,我们快速编写了一个小程序,用 `-g` 选项编译,我们会看到这个二进制文件没有被剥离。
|
||||||
|
|
||||||
@ -264,7 +263,7 @@ $
|
|||||||
|
|
||||||
分析这些路径的唯一方法是在运行时环境,在任何给定的位置停止或暂停程序,并能够分析信息,然后再往下执行。
|
分析这些路径的唯一方法是在运行时环境,在任何给定的位置停止或暂停程序,并能够分析信息,然后再往下执行。
|
||||||
|
|
||||||
这就是调试器的作用,在 Linux 上,`gdb` 就是调试器的事实标准。它可以帮助你加载程序,在特定的地方设置断点,分析内存和 CPU 的寄存器,还有更多的功能。它是对上面提到的其他工具的补充,可以让你做更多的运行时分析。
|
这就是调试器的作用,在 Linux 上,`gdb` 就是调试器的事实标准。它可以帮助你加载程序,在特定的地方设置断点,分析内存和 CPU 的寄存器,以及更多的功能。它是对上面提到的其他工具的补充,可以让你做更多的运行时分析。
|
||||||
|
|
||||||
有一点需要注意的是,一旦你使用 `gdb` 加载一个程序,你会看到它自己的 `(gdb)` 提示符。所有进一步的命令都将在这个 `gdb` 命令提示符中运行,直到你退出。
|
有一点需要注意的是,一旦你使用 `gdb` 加载一个程序,你会看到它自己的 `(gdb)` 提示符。所有进一步的命令都将在这个 `gdb` 命令提示符中运行,直到你退出。
|
||||||
|
|
||||||
@ -290,7 +289,8 @@ Missing separate debuginfos, use: debuginfo-install glibc-2.17-260.el7_6.6.x86_6
|
|||||||
Continuing.
|
Continuing.
|
||||||
Hello world![Inferior 1 (process 29620) exited normally]
|
Hello world![Inferior 1 (process 29620) exited normally]
|
||||||
(gdb) q
|
(gdb) q
|
||||||
$```
|
$
|
||||||
|
```
|
||||||
|
|
||||||
### 结语
|
### 结语
|
||||||
|
|
||||||
@ -303,7 +303,7 @@ via: https://opensource.com/article/20/4/linux-binary-analysis
|
|||||||
作者:[Gaurav Kamathe][a]
|
作者:[Gaurav Kamathe][a]
|
||||||
选题:[lujun9972][b]
|
选题:[lujun9972][b]
|
||||||
译者:[wxy](https://github.com/wxy)
|
译者:[wxy](https://github.com/wxy)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
Loading…
Reference in New Issue
Block a user