有时候我们在Android开发过程中可能有这样的需求:需要研究或者修改工程依赖的Jar包中的一些逻辑,查看代码运行中Jar包代码内部的取值情况(比如了解SDK与其服务器通信的请求报文加密前的情况)。 这个需求类似于Hook。 但是往往这些依赖的Jar包中的代码已经被混淆过,删去了本地变量表和代码行号等debug信息,所以无法直接断点调试,其内部逻辑和运行情况也几乎无法触及,研究更难以下手。这时候,一般的办法有二:1.将Jar反解为Java源码,以module方式引入,便可自由修改调试;2.修改字节码或者打包后的smali代码,实现想要的逻辑后再重新打包。这两种方法中,前者往往十分繁杂,尤其在混淆后逻辑变得极其复杂,几乎不可能完成;后者也很麻烦,工序较多,修改成本也比较高。 插件:HiBeaverAndroid gradle编译插件hibeaver结合Java AOP编程中对于大名鼎鼎的ASM.jar的应用,和Android gradle 插件提供的最新的Transform API,在Apk编译环节中、class打包成dex之前,插入了中间环节,依据开发者的配置调用ASM API对项目所依赖的jar进行相应的修改,从而可以比较高效地实现上面的Hook需求。 唯一需要注意的是,运用好这个插件需要有一定的Java汇编指令基础,并了解基本的ASM3的使用方法:后者还是很简单的,而前者,关于Java汇编指令基础这块,对于事先不了解的同学,接触起来有一定难度,但是学一学这个其实非常有益处,对于理解Java的运行有很大的帮助。 闲话少说,先看看如何快速实践一把!关键看疗效! 实战演练我们就先来尝试用这个Hook掉小米推送的SDK。 首先,在需要的工程的根项目gradle配置中加入以下内容: 如图所示,该插件上传到了jcenter中,只需引入classpath:
这里需要注意的是,目前该插件仅支持Android gradle编译插件2.0及以上的版本。 然后,在你的App项目gradle配置底部或任意位置加入如下代码:
然后,重新编译一下项目,会先去jitpack下载这个插件,开始编译后可以看到Android Studio的右下角的Gradle Console中,多输出了以下内容: 如果你看到了和我一样的内容,那说明初步配置成功。 可以看到,使用插件后会输出一段友好的帮助内容,还是中英文的,告诉我们可以直接拷贝作为初始配置,这个帮助输出也是可以关闭的。 下面我们正式开始尝试Hook小米推送SDK,首先,找出其业务逻辑中的一个节点。 首先,引入小米推送,这个过程不赘述了,blablabla,引入成功! 众所周知,使用小米推送需要先在代码中调用如下:
这个代码应该会调起本地长连接的建立、注册服务器等流程。假如我们出于学习的目的,想研究其中的流程,试举一例,先从查看其反编译的代码开始,找一个切入的节点,如下: 首先进入查看MiPushClient.registerPush这个方法: 在initialize的方法中,找到一段逻辑如下: 进入a方法,来到了这个类:com.xiaomi.mipush.sdk.u中,发现: 下面如果我们想看看运行时前两个方法传入参数的值,就可以开始Hook了。该如何做呢?这个方法体内打Log输出所有的值吗?那样太麻烦了。我们可以这样做: 首先在我们项目的源码里新建一个静态方法,包含两个参数,如下图: 其后,我们只要在a方法中加入一段代码,调用我们的静态方法,并传入我们想查看的两个参数即可。 这就有赖于我们的hibeaver插件了,具体如何做呢? 我们可以先看看之前的帮助内容: 里面有提到一个the most important par,最重要的部分。没错,这个插件的核心就在于配置这个类型为Map |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|