xposed hook 静态函数_Xposed高级用法 实现Tinker热修复

本文为看雪论坛优秀文章

看雪论坛作者ID:珍惜Any

Hi!大家好,我是珍惜。

给大家简单介绍一下,如何用Xposed实现对某个类的替换覆盖。

在不编译源码的情况,直接修改原Class内容。

(之前的这篇帖子,也不错。Xposed实现Native层Hook:Art 模式 实现Xposed Native注入

https://bbs.pediy.com/thread-251171.htm)

当我们在 findClas的时候,其实我们最终都会去dexElements数组里面,去寻找,我们需要的类。

c37c1ba9939de896c6415716cc55bdf9.png

路径为:

ClassLoder.java->
BaseDexClassLoader.java->
DexPathList.java-> dexElements

这个寻找其实是遍历,如下图:

325d279fa4b7569a1919f13858db915e.png

也就是说,我们只需要我们想加载的类放在前面,再通过反射set即可,做到 热修复。

腾讯的Tinker其实大概原理也是这样,阿里的是,动态修改了insns数组,直接修改某个方法的字节码。

这也是热修复。分为冷插拔和热插拔的区分(是否需要二次启动)

后面会详细跟大家说具体原因。

下面给大家简单复现一下流程:

8781304cc181baf3c825ac5865792c20.png

b58bf2547fdbd7829000384b312a81b0.png

73cf3914fa4b5fef25737e67d628b462.png

很简单。当我点按钮的时候,会进行Testclass的获取会进行遍历elements数组,生成这个类。

调用方法以后,肯定会崩掉。这种情况xposed无论如何Hook都很无力(可以Try)。

我们先首先生成一份正确的 dex 如下图:

1e2fddbfd2b6a639c44afb67b735e190.png

可以看到在Test函数里面我已经将原来的异常换成Log打印。

xposed模块里面写先Hook attach拿到对方进程的classloader。

在 attach 执行完毕。里面进行修复,因为这个时候dex已经加载完毕了,直接进行修复即可。

ed8caf0e6fd6f2c99c838f801567f48c.png

(需要提前开启,被修复App的sd卡读写权限。因为我是用对方的进程去读写 sd卡内容的。)

在HookMain里面进行class的初始化,拿到每个classloader里面的element数组。

然后进行合并,详细功能可以看一下注释:

15cd2e5c1f8786850f43836d64141e48.png

将生成的dex放到 sd/dex/目录下面:

先拿到加载正确类的classloader自己手动创建:

3f29fffb15d18bb76fdd8bc912c20866.png

然后,开始拿到正确的classloader。传入对应的 classloader,通过反射的方式拿到element数组。

80742a2e1e4132f1d31a80f4f26f5d9e.png

拿到两个classloader里面的elements数组,然后进行合并。

9bf04f4c5fd566839fd0ce13c39b5b5b.png

当我们把合并以后的classloader里面的element数组在set原来的回去。

参数1是合并以后的 element数组。

参数2是合并之前两个数组的大小。(用于判断是否合并成功 )

1dad68664dad2ca198c7458b9b2353b7.png

33674beae1a237e4ff4bc88955a4b33d.png

激活xposed模块并运行。

可以看到替换是成功的,壳子的不落地加载也是这个原理。

d358b8ee9c5b0ce564e72603984d83cf.png

如果 xposed取消钩子,可以看得到,程序还是老样子进行崩溃了。

0cb175166d63b78ce4ccd2598d0312e9.png

这块有几个坑,跟大家说一下。

问题1:为什么我不用一个静态方法作为 Test?如下图:

daa726f1d5e103da841afd4e6a3894b0.png

1d6c9114dc206d6ae5d4371cd56f3535.png

如果这个方法是静态的,在MianActivity的时候,就会进行初始化,这个时候,这个类已经被初始化了。

在此调用的时候他就不会去findclass,也就不会遍历element数组,所以会修复无效。因为,我现在每一次,都是 new一个新的对象,这个对象是未经过初始化的,所以需要遍历,element数组拿到class这个时候可以完成热修复。

问题2:热修复的方式为什么分为冷插拔和热插拔?Tinker就属于冷插拔。就是在错误的类element数组前面加入我们自己需要的正确的类,这种方式需要App重启才可以。

阿里的就属于热插拔,他是直接修改,错误方法的字节码Insns数组,可以直接修改对应的Bug这种不需要重启。

问题3:这个xposed修复的作用是什么?他有什么价值?

我可以在不编译源码的情况直接修改源码里面的内容,随时可关,随时可开。

只需要拿到系统的classloader,再加载自己修改过以后的内容,如上述操作 即可。具体项目如下:https://github.com/w296488320/XposedTinker

887a4f61bd9e3640d03ab791a228523e.png

- End -

1183b93924a5bf2d5a7fe0d2ae9eacd6.gif

看雪ID:珍惜Any

https://bbs.pediy.com/user-819934.htm

*本文由看雪论坛 珍惜Any 原创,转载请注明来自看雪社区

推荐文章++++

* Windows内存堆内容整理总结

* 格式化字符串漏洞

* 安卓源码+内核修改编译(修改内核调试标志绕过反调试)

* GlobeImposter3.0 勒索分析

* 恶意样本检测——Mathematics Malware Detected Tools

67357b9edaac344cf85c2f6122fbefbf.png

公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值