简介
gdb 强大的动态调试工具, 是一款命令行形式的界面展示,一切的运行皆需要通过指令敲入。
环境配置
vm-ubuntu2004 虚拟机
Android ndk (r22) 下载地址
gdb
gdb插件gef github地址
Android root 真机
GDB调试
ndk中找到gdbserver (android-ndk-r22/prebuilt/架构/)
我这边选择arm架构
将gdbserver 传入手机中
adb push gdbserver data/local/tmp
赋予root权限
chmod 777 gdbserver
运行gdbserver 和需要调试的文件
./gdbserver :11254 ./arm (arm是我自己编写的调试文件,后面会说到)
端口转发 adb forward tcp:11254 tcp:11254
这边在控制台,输入gdb, 然后输入远程连接指令target remote localhost:11254
报错了
经过排查,是架构有点不匹配的问题,解决方案,使用gdb-multiarch来调试, 按q退出当前的输入环境
输入gdb-multiarch
远程连接上
图中r0-cpsr是寄存器,:后面是 他们存放的值的地址
下面0xffffefa90--0xffffefaac 存放的一些数据地址
带箭头的->0xf772eda4 是当前运行到的位置
输入ni 执行下一步
通过观察各个寄存器的地址的变化,来分析我们的所需
输入 b +地址,可以设置断点,
对于一些指令后续再补
arm文件编写
首选配置下clang
下载的ndk中有clang 目录android-ndk-r22/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
把clang的地址加到环境变量中, export PATH="/home/user/myfile/android-ndk-r22/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH"
我这边系统是64位的
编写arm,c文件
#include <stdio.h>
#define ARM "armv7a*"
int main(int argc, char const *argv[]){
printf("hello %s\n", ARM);
return 0;
}
用clang把它编译成可执行文件
- 预编译 clang -target arm-linux-android22 -E arm.c -o arm.i
- 编译 clang -target arm-linux-android22 -S arm.i -o arm.s
- 汇编 clang -target arm-linux-android22 -c arm.s -o arm.o
- 链接 clang -target arm-linux-android22 arm.o -o arm
这时候arm文件就生成了
把arm文件导入Android时,需要赋予执行权限 chmod +x arm