Contents
  1. 1. 二进制文件格式
    1. 1.1. ELF
    2. 1.2. PE
  2. 2. 反编译工具
    1. 2.1. Unix(Linux and OSX)
      1. 2.1.1. nm
      2. 2.1.2. strings
      3. 2.1.3. file
      4. 2.1.4. libtool
    2. 2.2. Linux
      1. 2.2.1. readelf
      2. 2.2.2. objdump
    3. 2.3. OSX
      1. 2.3.1. otool
      2. 2.3.2. lipo
      3. 2.3.3. install_name_tool
    4. 2.4. Windows
      1. 2.4.1. DUMPBIN

ELF文件反编译工具在工程中是绝对的利器,我们通常用它来做一下几件事情:

  • 查找和修改二进制文件依赖的库路径
  • 查看二进制文件符号表,检查是否包涵某个函数
  • 查找二进制文件中的可打印字符串,可用来查看版本信息
  • 将多个二进制文件合并成同一个二进制文件

二进制文件格式

主流二进制文件格式ELF和PE,是基于COFF(Common file format)而来,根据不同的操作系统有不同的特性

ELF

**ELF(Executable And Linkable)**是Unix体系中二进制文件格式,除了执行文件,还包括*.so,*.a,*.o等文件

PE

**PE(Portable Executable)**是Windows平台的二进制格式,,除了exe执行文件,还包括*.lib,*.dll,*.obj等文件

反编译工具

反编译工具主要处理对象就是ELF和PE文件,根据平台划分,主要有以下一些工具

Unix(Linux and OSX)

nm

读取ELF文件中的符号表

$ nm $elf_filename | grep $method_name

查找ELF文件是否包含方法名$method_name

strings

读取ELF文件中的可打印的字符串表

$ strings $elf_filename | grep $find_str

查找ELF文件是否包含可打印的字符串$find_str

file

查看文件编译架构,从头文件中读取

$ file $elf_filename

查看ELF文件类型

libtool

libtool是对平台编译工具的封装,为不同平台提供一致接口,开发文档

$ libtool -static -o $elf_filename $source_elf_filename1 $source_elf_filename2 ...

把$source_elf_filename1,$source_elf_filename2…合并为$elf_filename

Linux

readelf

命令的名字就是read elf,用来读取ELF文件信息

$ readelf -h $elf_filename

读取elf文件头信息

objdump

objdump可以根据ELF文件来生成对应的汇编信息

$ objdump -x $elf_filename | grep NEED

获取ELF文件依赖的库

OSX

otool

与readelf类似,用来读取ELF文件信息

$ otool -L $elf_filename

查找ELF文件依赖的库

lipo

对ELF文件进行重构

$ lipo -info $elf_filename

查看ELF文件类型

$ lipo -create $elf_file_i386_name.a $elf_file_arm_name.a -output $elf_filename

把不同平台的ELF文件合并成同一文件

install_name_tool

用来更改ELF文件的依赖文件路径

$ install_name_tool -change $elf_file_name $elf_file_depends_path_before $elf_file_depends_path_after

把$elf_file_name文件依赖路径由$elf_file_depends_path_before改为$elf_file_depends_path_after

Windows

DUMPBIN

与readelf类似,用来读取ELF文件信息

> dumpbin /exports $pe_file_name

查看PE文件的依赖库

> dumpbin /all $pe_file_name | findstr $find_str

查看PE文件中是否有可打印字符串$find_str

> dumpbin /symbols $pe_file_name | findstr $method_name

查看PE文件中包含方法名$method_name

Contents
  1. 1. 二进制文件格式
    1. 1.1. ELF
    2. 1.2. PE
  2. 2. 反编译工具
    1. 2.1. Unix(Linux and OSX)
      1. 2.1.1. nm
      2. 2.1.2. strings
      3. 2.1.3. file
      4. 2.1.4. libtool
    2. 2.2. Linux
      1. 2.2.1. readelf
      2. 2.2.2. objdump
    3. 2.3. OSX
      1. 2.3.1. otool
      2. 2.3.2. lipo
      3. 2.3.3. install_name_tool
    4. 2.4. Windows
      1. 2.4.1. DUMPBIN