GDB--初始GDB

简介

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 执行下一步


image.png

通过观察各个寄存器的地址的变化,来分析我们的所需
输入 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容