arm-v8 linux的编译与调试
安装环境
ARM Cortex-A系列CPU的交叉编译环境
Cygwin(编译时需要unix shell命令环境)
反汇编神器IDA Pro 7.7.220118 (SP1)汉化版(静态分析与动态分析工具)
一台ROOT的arm-v8真机(避免命令行终端下不必要的麻烦)
配置环境
将gcc-linaro-7.5.0-2019.12-i686-mingw32_aarch64-linux-gnu.tar.xz压缩包解压到Cygwin的tmp文件夹下,没有tmp文件夹就创建一个tmp文件夹
静态编译
hi.c代码,将hi.c文件放入到tmp目录下
#include <stdio.h>
int
add(int x, int y)
{
return x + y;
}
int
main(void)
{
int a;
int b;
int c;
a = 1;
b = 2;
c = add(a, b);
printf("hello world %d\n", c);
return 0;
}
执行Cygwin根目录下的Cygwin.bat进入bash命令行交互终端
进入终端执行
cd /tmp
静态编译
/tmp/gcc-linaro-7.5.0-2019.12-i686-mingw32_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc.exe -Wall -O0 -static hi.c -o hi_static
将hi_static文件传入手机/data/local/tmp目录下,使用adb shell进入安卓linux命令终端
运行hi_static
su
cd /data/local/tmp
./hi_static
动态编译
动态库链接的问题
如何交叉编译安卓的ELF可执行文件
执行Cygwin根目录下的Cygwin.bat进入bash命令行交互终端
进入终端执行
cd /tmp
动态编译
/tmp/gcc-linaro-7.5.0-2019.12-i686-mingw32_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc.exe -Wall -O0 hi.c -o hi_so -Wl,--dynamic-linker=./ld-linux-aarch64.so.1
将hi_so与ld-linux-aarch64.so.1与libc.so.6传入手机/data/local/tmp目录下,使用adb shell进入安卓linux命令终端,ld-linux-aarch64.so.1文件在gcc-linaro-7.5.0-2019.12-i686-mingw32_aarch64-linux-gnu\aarch64-linux-gnu\libc\lib\ld-linux-aarch64.so.1,libc.so.6文件在gcc-linaro-7.5.0-2019.12-i686-mingw32_aarch64-linux-gnu\aarch64-linux-gnu\libc\lib\libc.so.6
将动态库放入手机后,使用LD_LIBRARY_PATH临时环境变量来添加额外的动态库加载路径
export LD_LIBRARY_PATH=/data/local/tmp
./hi_so
如果可执行文件有依赖问题可以使用gnu下的objdump命令工具查看可执行文件的依赖
# 查看依赖的库
objdump -x xxx.so | grep NEEDED
# 查看可执行程序依赖的库
objdump -x ./testTime | grep NEEDED
GNU Binary Utilities或binutils是一整套的编程语言工具程序,用来处理许多格式的目标文件。当前的版本原本由在Cygnus Solutions的程序员以Binary File Descriptor library(libbfd)所撰写。这个工具程序通常搭配GCC、make、和GDB这些程序来使用
addr2line:从目标文件的虚拟地址获取文件的行号或符号。
ar:可以对静态库做创建、修改和提取的操作。
c++filt:反编译(反混淆,demangle)C++符号的工具。
dlltool:创建创建Windows动态库。
gold:另一种新的、更快的仅支持ELF的链接器。
gprof:性能分析(profiling)工具程序。
nlmconv:可以转换成NetWare Loadable Module(NLM)目标文件格式。
nm:显示目标文件内的符号信息。
objcopy:复制和转译目标文件。
objdump:显示目标文件的相关信息,亦可反汇编。
ranlib:产生静态库的索引。(和nm -s功能类似)
readelf: 显示ELF文件的内容。
size:列出目标文件或库文件的section大小。
strings:列出文件中可打印的字符串信息。
strip:从目标文件中移除符号信息。
windmc:Windows消息资源编译器。
windres:Windows资源文件编译器。
远程动态调试与ELF文件静态分析
安装好IDA后打开ida64.exe,将IDA_Pro_7.7\dbgsrv目录下的android_server64传入手机/data/local/tmp目录下
,在pc命令行终端执行
pc命令终端
adb forward tcp:23946 tcp:23946
adb shell
安卓linux命令终端
su
cd /data/local/tmp
export LD_LIBRARY_PATH=/data/local/tmp
./android_server64
在IDA中选择调试器-运行-Remote ARN linux/Android debuger
参数根据手机网络与运行文件的路径填写
点击确定后再打开一个IDA直接传入hi_so进行静态分析
可知应用层程序入口的内存地址偏移为40057C,在动态调试的IDA中跳转到内存地址40057C打上断点即可动态调试,关于IDA的用法与窗口用途可以查阅IDA Pro权威指南(第2版)进行学习