一. Android Hook 系列教程(一) Xposed Hook 原理分析
二. Android Hook 系列教程(二) 自己写APK实现Hook Java层函数
三. Android Hook 系列教程(三) Cydia Hook Native 原理分析
四. Android Hook 系列教程(四) 自己写APK实现Hook Native层函数
五. Android Hook 系列教程(五) 更多Hook方法
六. Andoird Hook 系列教程(六) Hook的总结
Java层:17eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6J5L8%4k6G2z5o6W2Q4x3V1k6j5M7r3!0K6k6h3c8n7M7X3W2V1k6$3f1`.
Native层:cc3K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6J5L8%4k6G2z5o6W2Q4x3V1k6j5M7r3!0K6k6h3b7`.
一个好的开始等于成功了一半.
为了分析Xposed Hook是怎么实现的,选取了findAndHookMethod函数作为研究对象.
在分析过程中,我们应该做到有详有略,我将以关键代码(略过对分析目的无关紧要的部分,留下必须部分).
当然在关键代码后面会贴出全部代码以供参照.
从源代码:XposedHelpers.java处找到findAndHookMethod
findAndHookMethod关键代码
上面的代码都很容易懂,简单说一下几个函数
getParameterClasses
功能:把函数所有参数转换为Class<?>数组返回.
比如参数列表为
返回结果相当于
findMethodExact
功能:根据方法名和方法参数类获取Method
关键代码:
完整代码:
让我们继续跟进hookMethod
功能:把方法的参数类型,返回类型,回调函数记录到AdditionalHookInfo类里
并通过hookMethodNative方法进入Native层进行Hook.
在这个方法里面差不多都是关键代码,也就不省略,全部贴出.
完整代码:
看一下AdditionalHookInfo构造函数
详细分析:
得到Native层的Method
从Android源代码的Dalvik虚拟机代码里找到dvmSlotToMethod实现如下
实现非常简单,所以slot相等于记录Method的下标
Method结构
保存一些Hook信息
替换方法(最关键的一步)
到这里我们已经分析完了,就是保存一些信息,并把方法替换为hookedMethodCallback.
相信到了这里读者已经可以根据注释自己看懂了,我在把流程梳理一下
获取原先保存的Hook信息
获取参数
调用Java层函数
看一下参数methodXposedBridgeHandleHookedMethod是什么,可以看到是上层的Java
可以看到调用Java层的函数为XposedBridge.handleHookedMethod
Java层函数handleHookedMethod
功能:
调用原始方法
调用Hook该方法的所有afterHookedMethod
关键代码
完整代码
好了,到这里我们已经分析完成.
简单总结一下:
Java层:
Native层
替换Native层Method的字段nativeFunc为函数 hookedMethodCallback完成Hook
hookedMethodCallback里回调Java层函数XposedBridge.handleHookedMethod.
handleHookedMethod里分别调用beforeHookedMethod,原始方法,afterHookedMethod
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课