gdb演示Android ELF的GOT Hook
2013-04-02 10:10
357 查看
之前发了使用gdb演示x86平台Linux修改GOT中函数地址实现Hook的文章:《利用gdb演示GOT Hook》既然Android底层本质上也是Linux,只不过换成了ARM架构的CPU,使用类似的方法还是可以达到目的的。本文的演示在Ubuntu 10.04LTS和Android 4.1.1模拟器上进行的。
1. 源码与编译
这里使用稍微“复杂”一些的代码,编译成两个模块(hooktest和libmym.so),libmym.so由mym.c编译得到
?
libmym.c导出两个函数,分别是add和multiply,因此头文件mym.h如下
?
Android.mk文件如下
然后在源码环境下使用mmm命令编译模块。
hooktest由hooktest.c编译得到,为了找到头文件mym.h,最好把mym.h放在相同的目录中:
?
hootest的makefile如下
同样使用mmm编译这个模块。
2. gdb远程调试
将编译后得到的libmym.so和hootest使用adb push分别导入到Android系统的/system/lib目录和/data/local目录,由于这个目录是不可写的,所以先要重新挂载一下。
?
远程调试时,gdb分为server端和client端。简单地说,server端在Android系统中运行,client端在桌面系统(我使用Ubuntu Linux)中运行,开启gdb的shell,我们在client端输入调试指令,会发送给server执行,server将执行的结果返回给client端。
?
Android系统和Ubuntu是两个不同的操作系统,有各自的端口。gdbserver监听Android系统的11111端口,等待client发送过来的命令。而client使用Ubuntu的某个端口,因此需要与Android系统gdbserver使用的端口建立起一个“映射”,这也要使用adb的命令来完成:
?
adb forward完成端口数据的“转发”,因此client发送数据到Ubuntu的11111端口的数据就会被转发到Android系统的11111端口。
gdbclient可以在Android系统源码中的路径为
./prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin目录中还有其他很有用的工具,比如arm-eabi-objdump和arm-eabi-readelf,因此可以把这个目录加入到环境变量PATH中方便使用里面的工具。
使用arm-eabi-gdb时也需要加载hooktest中,注意这里需要使用包含调试信息的hooktest,在源码中的路径为
[/code]
1. 源码与编译
这里使用稍微“复杂”一些的代码,编译成两个模块(hooktest和libmym.so),libmym.so由mym.c编译得到
?
?
LOCAL_PATH:=$(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:=\ mym.c\ mym.h LOCAL_PRELINK_MODULE:=false LOCAL_MODULE_TAGS:=debug LOCAL_MODULE:=libmym LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRIES) include $(BUILD_SHARED_LIBRARY)
然后在源码环境下使用mmm命令编译模块。
hooktest由hooktest.c编译得到,为了找到头文件mym.h,最好把mym.h放在相同的目录中:
?
LOCAL_PATH:=$(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := \ hooktest.c \ mym.h LOCAL_MODULE_TAGS := debug LOCAL_MODULE := hooktest LOCAL_SHARED_LIBRARIES := libc libmym LOCAL_MODULE_PATH := ./custom_out include $(BUILD_EXECUTABLE)
同样使用mmm编译这个模块。
2. gdb远程调试
将编译后得到的libmym.so和hootest使用adb push分别导入到Android系统的/system/lib目录和/data/local目录,由于这个目录是不可写的,所以先要重新挂载一下。
?
?
?
gdbclient可以在Android系统源码中的路径为
./prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-gdb
./prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin目录中还有其他很有用的工具,比如arm-eabi-objdump和arm-eabi-readelf,因此可以把这个目录加入到环境变量PATH中方便使用里面的工具。
使用arm-eabi-gdb时也需要加载hooktest中,注意这里需要使用包含调试信息的hooktest,在源码中的路径为
./out/target/product/generic/obj/EXECUTABLES/hooktest_intermediates/LINKED/hooktest 因此执行以下命令
可以看到,add函数已经被multiply函数所替代,输出了5 * 5的结果。 至于为何GOT表中存储的是函数的真实地址加1(一开始没注意要加1,修改GOT表项后总是出现段错误),我目前还没有搞清楚原因,还需进一步研究。 |
相关文章推荐
- Android安全讲座第九层 android gdb 调试实例演示(无源代码篇)
- Android下使用GDB调试无符号ELF文件
- GDB远程调试Android上的可执行ELF文件
- android gdb 调试实例演示(有源代码篇)
- android gdb 调试实例演示(有源代码篇)
- gdb 远程调试android进程
- Android 环境下使用GDB
- Android开发环境搭建全程演示(jdk+eclipse+android sdk)
- 如何使用arm-eabi-gdb调试android c/c++程序
- Android开发环境搭建全程演示(jdk+eclipse+android sdk)
- Android逆向之旅---SO(ELF)文件格式详解
- UPX对Android上ELF加壳使用过程中的若干问题总结
- adb gdb 调试android C/C++程序
- gdb调试android内核
- Android 演示 Android ListView 和 github XListView(1-3)
- Android开发环境搭建全程演示
- Android系列教程之EditText使用详解-包含很多教程上看不到的功能演示
- Android演示如何接收广播消息
- skyeye安装+arm-elf-gdb安装+模拟s3c44b0x+运行ucos4skyeye
- skyeye安装+arm-elf-gdb安装+模拟s3c44b0x+执行ucos4skyeye