ele7enxxh/Android-Inline-Hook

在android 7.0上hook AAssetManager_open函数运行崩溃(其他版本运行正常)

WenhaiLin opened this issue · 16 comments

AAsset* new_AAssetManager_open(AAssetManager*, const char*, int)

新函数里执行相关操作后,调用记录的AAssetManager_open原函数地址时崩溃
设备:nexus 5x 系统版本:7.1.1

         --------- beginning of crash

A/libc: Fatal signal 4 (SIGILL), code 1, fault addr 0xf6167ad6 in tid 31137 (xxxxx)

    [ 12-21 15:20:34.814   362:  362 W/         ]
    debuggerd: handling request: pid=31137 uid=10177 gid=10177 tid=31137

E/Layer: [com.android.systemui.ImageWallpaper] rejecting buffer: bufWidth=1920, bufHeight=1080, front.active.{w=2331, h=1920}
A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
A/DEBUG: Build fingerprint: 'google/bullhead/bullhead:7.1.1/NPF10C/3347772:user/release-keys'
A/DEBUG: Revision: 'rev_1.0'
A/DEBUG: ABI: 'arm'
A/DEBUG: pid: 31137, tid: 31137, name: xxxxx >>> org.xxxx.xxxx <<<
A/DEBUG: signal 4 (SIGILL), code 1 (ILL_ILLOPC), fault addr 0xf6167ad6
A/DEBUG: r0 e850bbc0 r1 f232e32f r2 00000000 r3 f2363001
A/DEBUG: r4 f232dea0 r5 f232e32f r6 f232de4d r7 f232de0c
A/DEBUG: r8 fff6f4e8 r9 f3785400 sl 00000000 fp fff6f474
A/DEBUG: ip fff6ee3c sp fff6f300 lr f2363021 pc f6167ad6 cpsr 800e0010
A/DEBUG: backtrace:
A/DEBUG: #00 pc 00009ad6 /system/lib/libandroid.so
A/DEBUG: #1 pc 0000401f anonymous:f235f000

给我个可触发崩溃的二进制可执行文件和源码

DemoForBUG.zip

HookDemo是android studio工程
X86_BUG_DEMO目录是native代码


Java层静态代码里加载共享库
native层在JNI_OnLoad函数里hook AAssetManager_open
Java层在activity的onCreate方法里通过jni调用native被hook的函数

好的,我会尽快测试

麻烦再提供以下崩溃手机里的libandroid.so

@ele7enxxh 上传的动态库好像错了,我明天拿设备验证下,抱歉了

Nexus 5X
Android OS Version:7.1.1 / 7.0都有问题

libandroid.so.zip
libandroid-64.so.zip

image

Hi @ele7enxxh, 关于7.0的问题你那边可有进展?是否能够重现呢?

崩溃不是发生在调用原函数,而是发生在新函数执行结束后。
新函数里不论是否有调用原函数,新函数执行结束就会崩溃

7.x设备上relocateInstructionInThumb执行和正常设备有差异,正常设备上执行的都是下图的分支2,7.x上执行的有一次不一样。

hook的目标函数是dlopen,

demo.apk.txt

image

运行正常的log:
5965-5965/? E/relocate: relocateInstruction,617
5965-5965/? E/relocate: relocateInstructionInThumb,471
5965-5965/? E/relocate: relocateInstructionInThumb,471
5965-5965/? E/relocate: relocateInstructionInThumb,471
5965-5965/? E/relocate: relocateInstructionInThumb,471
5965-5965/? E/relocate: relocateInstructionInThumb,471
5965-5965/? E/inlineHook: doInlineHook,364
5965-5965/? E/inlineHook: doInlineHook,385

崩溃设备输出的log:
E/relocate: relocateInstruction,617
E/relocate: relocateInstructionInThumb,471 (relocateInstructionInThumb16分支)
E/relocate: relocateInstructionInThumb,471 (relocateInstructionInThumb16分支)
E/relocate: relocateInstructionInThumb,464 (relocateInstructionInThumb32分支)
E/relocate: relocateInstructionInThumb,471 (relocateInstructionInThumb16分支)
E/relocate: relocateInstructionInThumb,471 (relocateInstructionInThumb16分支)
E/inlineHook: doInlineHook,364
E/inlineHook: doInlineHook,385

不好意思,我现在在忙其他工作,不保证后续会处理这个问题。

@WenhaiLin 问一下android x86模拟器使用inline hook你成功了?是怎么做到的

@wyhuan 没有成功。我后边改用静态注入方案

android 7.x上崩溃是因为我hook了另外的函数(dlopen,权限问题)导致,关闭此issue

@WenhaiLin android x86模拟器静态注入之后hook成功了嘛? 方案能分享一下不

成功了
基本思路是按ELF格式去解析原动态库,将要hook的函数修改为一个新增依赖库的函数

这个方式仅限于你要hook的函数是动态库外部实现的,例如gettimeofday等

成功了
基本思路是按ELF格式去解析原动态库,将要hook的函数修改为一个新增依赖库的函数

这个方式仅限于你要hook的函数是动态库外部实现的,例如gettimeofday等

同在厦门额,可否留个微信联系方式,我现在公司也有这块需求,想请教一点相关的信息