码迷,mamicode.com
首页 > 其他好文 > 详细

HOOK startActivity

时间:2020-12-19 12:49:34      阅读:2      评论:0      收藏:0      [点我收藏+]

标签:完成   shadow   activity   属性   color   ui线程   min   字符   位置   

需要相关资料的朋友,可以【加入此处即可打包获取

Hook的英文含义是钩子,你可以理解为用钩子把要Hook的对象勾过来,然后再把替换的对象送回去。Hook其实就是把原来的对象替换成仿造的对象,还有就是必须拿到当前对象里的某个属性进行Hook,否则你的hook是失败的,没有意义的。

一:Hook start activity

1.先定义两个活动界面,完成跳转,如下图所示。

技术图片
技术图片

2.要实现跳转需要调用startActivity这个方法,此时就需要代理这个startActivity方法。查看一下它的底层源码找它的相关实现,真正启动活动界面是由execstarActivities去完成的,而它又是被mInstrumentation调用,如下图所示。

技术图片

3.要找到它的定义位置,发现mInstrumentation没有相应的接口,需要通过继承的方式来实现,也就是通过静态代理来实现,如下图所示。

技术图片

4.声明一个tag日志信息以及需要代理的类,代理的类就是找到真正启动activity的那个类,如下图所示。

技术图片

5.定义ActivityThread里面原始的Instrumentation对象,千万不能写成mInstrumentation,否则会抛出异常。

6.通过构造函数来传递对象,如下图所示。

技术图片

7.定义一个方法,这个方法是由于原始方法里面的Instrumentation有execStartActivity方法来定的,此方法需要相关参数,如下图所示。
技术图片

8.打印activity启动前后的日志信息,修改相应的参数信息,如下图所示。

技术图片

9.调用的方法在底层是隐藏的,需要反射来进行调用,所以先找到这个方法,然后把他设置可见,如下图所示。

技术图片

10.准备完成以后,在MainActivity进行代理,在Application程序的入口点进行代理的代码书写。

11.在Application定义一个线程和其他一些字符串,如下图所示。

技术图片

12.接着根据包名加类名去获取当前的ActivityThread对象、主线程(UI线程),设置显示获取到以后进行调用,如下图所示。

技术图片

13.拿到在ActivityThread类里面的原始mInstrumentation对象,如下图所示。

技术图片

14.构建代理对象,进行静态代理,如下图所示。

技术图片

15.通过反射换掉字段,注意是反射代码,不是Instrumentation里面的方法,如下图所示。

技术图片

16.做个标记,方便后面查看,如下图所示。

技术图片

17.运行完毕查看日志是否HOOK成功,成功代理startActivity并且打印相关的内容参数,如下图所示。

技术图片

HOOK startActivity

标签:完成   shadow   activity   属性   color   ui线程   min   字符   位置   

原文地址:https://blog.51cto.com/15002917/2564096

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!