原生程序逆向分析工具
NDK Toolchain
- NDK Toolchain(NDK 工具链)从引入至今,已发生很大变化:NDK r19 前版本官方指南;NDK r19 及之后版本官方指南
- NDK r19 前生成独立编译工具链:
$NDK/build/tools/make_standalone_toolchain.py --arch arm --api 21 --install-dir /tmp/my-android-toolchain
- 从 NDK r19 开始,NDK 默认安装的工具链可供使用,与任意编译系统进行交互时不再需要使用
make_standalone_toolchain.py
脚本 - 导出一个独立的工具链后,可看到 bin 目录下有很多二进制程序,其中对软件逆向分析有用的是以 EABI 命名(如“arm-linux-androideabi-”)开头的程序,它们是 GNU Binutils 工具集合的 Android 移植版本(GNU Binutils)。除了具有“arm-linux-androideabi-”“aarch64-linux-android-”文件名前缀的程序,其他程序列举:
- addr2line:针对包含调试信息版本的 ELF,将程序的地址转换为对应的文件名和行号
- ar:静态库管理程序,用于建立、修改、提取
.a
归档文件 - as:汇编器。目前 gcc 和 Clang 都用它
- c++:工具链中 g++ 的一个拷贝
- c++filt:链接器用它过滤符号,防止重载函数冲突
- clang:LLVM 的 C 程序编译前端。非 GNU Binutils 工具
- clang++:LLVM 的 C++ 程序编译前端。非 GNU Binutils 工具
- cpp:C++ 程序编译工具
- elfedit:ELF 文件头更新工具
- g++:C++ 程序编译工具
- gcc:C 程序编译工具
- gcov:程序覆盖度测量工具,用于记录代码的执行路径
- gdb:调试工具
- gprof:程序性能测量工具
- ld:链接器,用于生成 ELF 可执行程序或动态库
- nm:符号查看工具,用于列出目标文件中的符号
- objcopy:将目标文件中的内容复制到另一种类型的目标文件中
- objdump:输出目标文件的信息
- ranlib:产生归档文件索引,并将其保存到这个归档文件中
- readelf:显示 ELF 的文件头、节区信息
- size:列出目标文件中每个段的大小及总体大小
- strings:输出目标文件中的可打印字符串
- strip:移除目标文件中的符号信息
- 这些工具中,对原生程序进行静态分析用得最多的是 objdump、readelf
- 用 readelf 可查看 ELF 的文件头信息:
- 用 readelf 可查看 ELF 的文件头信息: