关于Linux常用的二进制文件分析方法

本文介绍在Unix环境下,如何使用多种工具如strings、nm、dump、file和ldd来解析未知二进制文件的功能、作用及依赖库,帮助用户了解其大致用途。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

  当你在unix下拿到一个二进制文件但不知道它是什么的时候,可以通过以下方法得到一此提示

      1、 最首先应该尝试strings命令,比如拿到一个叫cr1的二进制文件,可以:

  $ strings cr1 | more

  里面可能会有一些对于这个cr1的描述,这些信息都是编译之后在程序中留下的一些文本性的说明,所以可能会告诉你这个文件是什么.

  比如有输出:

  $ strings cr1 | more
  %s %s %s%s%s -> %s%s%s (%.*s)
  Version: 2.3
  Usage: dsniff [-cdmn] [-i interface] [-s snaplen] [-f services]
  [-t trigger[,...]] [-r|-w savefile] [expression]
  ...
  /usr/local/lib/dsniff.magic
  /usr/local/lib/dsniff.services
  ...

  那么我们就可以知道,其实 cr1就是dsniff命令.

  2、 如果这样的方法没有帮助你的话,那么你可以尝试:

  $ /usr/ccs/bin/nm -p cr1 | more

  比如说得到如下输出:

  cr1:
  [Index]   Value    Size Type    Bind Other   Shndx       Name
  [180]     |0     |    0| FILE | LOCL | 0     |ABS |       decode_smtp.c
  [2198]    |160348| 320| FUNC | GLOB | 0     | 9 |       decode_sniffer

  这些都是生成这个二进制文件的obj文件的文件名称,这些名称会告诉你这个二进制文件的作用的.

  同样,如果希望查看二进制文件调用到的静态库文件都有哪些的话,可以使用nm -Du cr1来实现.

  3、 当然我们也可以通过使用dump命令来得到任何一个二进制文件的选定部分信息

  $ /usr/ccs/bin/dump -c ./cr1 | more

  dump命令的参数说明:

  -c        Dump出字符串表

  -C       Dump出C++符号表

  -D       Dump出调试信息

  -f        Dump出每个文件的头

  -h       Dump出section的头

  -l        Dump出行号信息

  -L       Dump出动态与静态链接库部分内容

  -o       Dump出每个程序的可执行头

  -r        Dump出重定位信息

  -s       用十六进制信息Dump出section的内容

  -t       Dump符号表.

  4、 可以使用file命令得到二进制文件的信息

  $ file cr1

  5、 如果还是不清楚的话,那么我们可以使用ldd命令

  $ ldd cr1

  比如说输出为:
  ...
  libsocket.so.1 =>       /usr/lib/libsocket.so.1
  librpcsvc.so.1 =>       /usr/lib/librpcsvc.so.1
  ...

  那么我们就可以知道这个程序与网络库相关,我们就可以知道它的大概功能了.

  我们也可以能过adb命令来得到一个二进制文件的执行过程.

  比如说:
  $ adb cr1
  :r
  Using device /dev/hme0 (promiscuous mode)
  192.168.2.119 -> web      TCP D=22 S=1111 Ack=2013255208
  Seq=1407308568 Len=0 Win=17520
  web -> 192.168.2.119 TCP D=1111 S=22 Push Ack=1407308568

  我们知道这个程序是一个sniffer.

  6、 如果你确定要运行这个程序的话,你可以先通过:

        $ truss -f -o cr.out ./cr1
        listening on hme0
       ^C
        $

  truss命令可以帮你打开系统的信号与调用输出.你就可以知道这个程序到底干了什么.

  有了上面这些工具的话,我们就可以大概了解到一个未知的二进制程序到底是干什么的.

  最后提示大家,运行不了解的二进制程序有严重的安全问题,请大家小心.

<think>好的,用户想了解在Linux环境下使用GCC生成或处理二进制文件的相关方法。我需要先整理已有的信息,并参考提供的引用内容。 首先,用户提到的引用[2]中提到了使用objcopy工具从ELF文件生成纯二进制文件,命令是`objcopy -O binary data.elf new.bin`。这应该是一个关键点,需要包含在生成二进制文件的步骤里。 引用[3]提供了GCC二进制下载地址和环境变量配置的方法,比如设置PATH和LD_LIBRARY_PATH,这部分可能涉及GCC的安装和配置,用户可能需要这方面的指导,特别是如果用户需要特定版本的GCC的话。 另外,用户问题中还提到“处理二进制文件”,可能包括反汇编、查看二进制文件内容等操作。这里需要补充一些常用工具,比如objdump、hexdump或者readelf,这些工具可以帮助用户分析二进制文件的结构和内容。 接下来,我应该按照生成和处理两部分来组织回答。生成二进制文件的基本步骤包括编写源代码、编译、链接,然后使用objcopy生成纯二进制文件。处理部分则包括反汇编、查看文件信息、十六进制查看等。 还要注意用户可能对动态库和静态库的处理有疑问,比如如何生成静态库或动态库,这也属于GCC处理二进制文件的一部分。需要简要提及ar和gcc -shared命令的使用。 最后,确保引用正确的来源,比如引用[2]和[3],并在回答末尾添加相关问题,帮助用户进一步探索。例如,如何优化二进制文件大小,如何交叉编译等。 需要验证步骤的正确性,例如编译命令是否准确,objcopy的参数是否正确。同时,提醒用户环境变量配置的注意事项,如路径是否正确,是否需要替换成实际路径。 总结回答结构:分为生成二进制文件和处理二进制文件两部分,每部分列出具体步骤和命令,并附上示例代码。最后添加相关问题,引用标注在对应的位置。</think>### Linux GCC 生成与处理二进制文件教程 #### 一、生成二进制文件 1. **从源代码生成可执行文件** 使用GCC编译C/C++源代码时,默认会生成ELF格式的可执行文件。例如: ```bash gcc -o program main.c ``` 这会生成名为`program`的ELF文件[^2]。 2. **生成纯二进制文件(不含ELF头)** 若需生成纯二进制文件(如用于嵌入式系统),可使用`objcopy`工具: ```bash objcopy -O binary input.elf output.bin ``` 其中`input.elf`是编译后的ELF文件,`output.bin`为生成的二进制文件。 3. **交叉编译生成二进制文件** 若需为其他架构生成二进制文件(如ARM),需安装交叉编译工具链并指定目标平台: ```bash arm-linux-gnueabi-gcc -o program_arm main.c ``` #### 二、处理二进制文件 1. **查看二进制文件信息** - 使用`file`命令查看文件类型: ```bash file program ``` - 使用`readelf`查看ELF文件头信息: ```bash readelf -h program ``` 2. **反汇编二进制文件** 使用`objdump`反汇编可执行文件: ```bash objdump -d program ``` 3. **查看二进制文件内容** 使用`hexdump`以十六进制格式查看文件内容: ```bash hexdump -C output.bin ``` 4. **生成静态库与动态库** - 静态库(`.a`文件): ```bash ar rcs libmylib.a *.o ``` - 动态库(`.so`文件): ```bash gcc -shared -o libmylib.so *.o ``` #### 三、环境配置注意事项 若需使用特定版本的GCC,需配置环境变量(替换`YOURS`为实际路径): ```bash export PATH=$HOME/YOURS/gcc-5.4.0/bin:$PATH export LD_LIBRARY_PATH=$HOME/YOURS/gcc-5.4.0/lib:$HOME/YOURS/gcc-5.4.0/lib64:$LD_LIBRARY_PATH ``` 此配置确保系统优先使用自定义GCC版本[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值