您的位置:首页 > 移动开发 > Android开发

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文件如下

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放在相同的目录中:

?
hootest的makefile如下

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目录,由于这个目录是不可写的,所以先要重新挂载一下。

?
远程调试时,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-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

因此执行以下命令
然后在gdbserver端的输出如下: [code] 5 + 5 = 10 5 + 5 = 25 Child exited with status 0 GDBserver exiting
可以看到,add函数已经被multiply函数所替代,输出了5 * 5的结果。

至于为何GOT表中存储的是函数的真实地址加1(一开始没注意要加1,修改GOT表项后总是出现段错误),我目前还没有搞清楚原因,还需进一步研究。

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HOOK ARM PLT