二进制文件分析

  • nm
  • objdump
  • readelf
  • ar

二进制文件符号清单.文件信息等;



nm

nm用来列出目标文件的符号清单。

  • -a或–debug-syms:显示所有的符号,包括debugger-only symbols。
  • -B:等同于–format=bsd,用来兼容MIPS的nm。
  • -C或–demangle:将低级符号名解析(demangle)成用户级名字。这样可以使得C++函数名具有可读性。
  • –no-demangle:默认的选项,不需要将低级符号名解析成用户级名。
  • -D或–dynamic:显示动态符号。该任选项仅对于动态目标(例如特定类型的共享库)有意义。
  • -f format:使用format格式输出。format可以选取bsd、sysv或posix,该选项在GNU的nm中有用。默认为bsd。
  • -g或–extern-only:仅显示外部符号。
  • -n、-v或–numeric-sort:按符号对应地址的顺序排序,而非按符号名的字符顺序。
  • -p或–no-sort:按目标文件中遇到的符号顺序显示,不排序。
  • -P或–portability:使用POSIX.2标准输出格式代替默认的输出格式。等同于使用任选项-f posix。
  • -s或–print-armap:当列出库中成员的符号时,包含索引。索引的内容包含:哪些模块包含哪些名字的映射。
  • -r或–reverse-sort:反转排序的顺序(例如,升序变为降序)。
  • –size-sort:按大小排列符号顺序。该大小是按照一个符号的值与它下一个符号的值进行计算的。
  • –target=bfdname:指定一个目标代码的格式,而非使用系统的默认格式。
  • -u或–undefined-only:仅显示没有定义的符号(那些外部符号)。
  • –defined-only:仅显示定义的符号。
  • -l或–line-numbers:对每个符号,使用调试信息来试图找到文件名和行号。
  • -V或–version:显示nm的版本号。
  • –help:显示nm的选项。


objdump

ogjdump工具用来显示二进制文件的信息,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。

  • -f 显示文件头信息
  • -D 反汇编所有section (-d反汇编特定section)
  • -h 显示目标文件各个section的头部摘要信息
  • -x 显示所有可用的头信息,包括符号表、重定位入口。-x 等价于 -a -f -h -r -t 同时指定。
  • -i 显示对于 -b 或者 -m 选项可用的架构和目标格式列表。
  • -r 显示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反汇编后的格式显示出来。
  • -R 显示文件的动态重定位入口,仅仅对于动态目标文件有意义,比如某些共享库。
  • -S 尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。
  • -t 显示文件的符号表入口。类似于nm -s提供的信息


readelf

这个工具和objdump命令提供的功能类似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD库是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件)

  • ELF文件类型

    ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西、以及都以什么样的格式去放这些东西。它自最早在 System V 系统上出现后,被 xNIX 世界所广泛接受,作为缺省的二进制文件格式来使用。可以说,ELF是构成众多xNIX系统的基础之一。

ELF文件有三种类型:

    • 可重定位的对象文件(Relocatable file)
      由汇编器汇编生成的 .o 文件
    • 可执行的对象文件(Executable file)
      可执行应用程序
    • 可被共享的对象文件(Shared object file)
      动态库文件,也即 .so 文件
  • .text section 里装载了可执行代码;
  • .data section 里面装载了被初始化的数据;
  • .bss section 里面装载了未被初始化的数据;
  • 以 .rec 打头的 sections 里面装载了重定位条目;
  • .symtab 或者 .dynsym section 里面装载了符号信息;
  • .strtab 或者 .dynstr section 里面装载了字符串信息;

linux-readelf


ar

Linux ar命令用于建立或修改备存文件,或是从备存文件中抽取文件。
ar可让您集合许多文件,成为单一的备存文件。在备存文件中,所有成员文件皆保有原来的属性与权限。

必要参数

  • -d  删除备存文件中的成员文件。
  • -m  变更成员文件在备存文件中的次序。
  • -p  显示备存文件中的成员文件内容。
  • -q  将文件附加在备存文件末端。
  • -r  将文件插入备存文件中。
  • -t  显示备存文件中所包含的文件。
  • -x  自备存文件中取出成员文件。

选项参数

  • a<成员文件>  将文件插入备存文件中指定的成员文件之后。
  • b<成员文件>  将文件插入备存文件中指定的成员文件之前。
  • c  建立备存文件。
  • f  为避免过长的文件名不兼容于其他系统的ar指令指令,因此可利用此参数,截掉要放入备存文件中过长的成员文件名称。
  • i<成员文件>  将问家插入备存文件中指定的成员文件之前。
  • o  保留备存文件中文件的日期。
  • s  若备存文件中包含了对象模式,可利用此参数建立备存文件的符号表。
  • S  不产生符号表。
  • u  只将日期较新文件插入备存文件中。
  • v  程序执行时显示详细的信息。
  • V  显示版本信息。
欣赏此文? 求鼓励,求支持!