首页
社区
课程
招聘
[原创]App免Root加载Xposed插件工具Xpatch源码解析(二)
发表于: 2019-7-30 23:44 8913

[原创]App免Root加载Xposed插件工具Xpatch源码解析(二)

2019-7-30 23:44
8913

Xpatch是笔者开发的一款破解Android App工具,使用Xpatch破解后的App可以加载安装在设备上的Xposed插件,从而实现了免Root也能Xposed,其源码地址为:

https://github.com/WindySha/Xpatch

本文是Xpatch源码解析的第二篇,第一篇源码分析请参阅个人技术博客:
免Root 实现App加载Xposed插件的工具Xpatch源码解析(一)

加载Xposed插件之前,首先需要遍历所有安装的应用,根据Xposed插件的特征,找到其中的Xposed插件。

那什么样的应用才是Xposed插件呢?
根据Xposed插件的书写规范中要求,插件Apk的Manifest文件中需要包含android:name="xposedmodule"这样的meta-data信息:

根据此特征,我们获取App PackageInfo中的meta data,从而过滤出插件Apk,具体实现源码如下:

找到了插件Apk之后,就可以得到此Apk的路径(data/app/包名 目录下面),然后就是根据此路径加载插件。
加载插件的方法是:com.wind.xposed.entry.XposedModuleLoader.loadModule()
其主要流程参考了原版Xposed框架中的实现,过程如下:

流程源码和注释:

往Apk中注入代码,一般来说,有两种主流方法:

这里,我们选取了第二种方法。第二种方法的难点是如何修改dex2jar工程源码实现代码的插入。

为此,需要先分析其实现原理。
Claud大神开源的dex2jar工具大致原理是,先根据dex文件格式规则解析dex文件中的所有类信息,然后再利用ASM工具根据这些信息生成Class文件。

对Java开发比较熟悉的人,应该很熟悉ASM。ASM是一个Java字节码操作框架。它可以直接对class文件进行增删改的操作,能被用来动态生成类或者增强既有类的功能。Java中许多的框架的实现是基于ASM,比如Java AOP的实现,JavaWeb开发中的Spring框架的实现等等。可以说ASM就是一把利剑,是深入Java必须学习的一个点。

这里,我们就不讲解ASM的原理和用法,只讲解如何利用ASM修改dex2jar工程源码,从而实现代码的注入。

在上一篇源码解析文章中,我们说过,破解Apk,只需要在其Application类中注入这样一段静态代码块:

那这样的一段代码,如何用ASM工具生成呢。
假如对ASM的API熟悉的话,其实很容易就能实现这样一小段代码的生成。
假如不熟悉的话,也没关系,我们可以利用Android Studio中的一个插件,查看这段代码的ASM的实现。这个插件的名字是:ASM Bytecode Viewer


通过这个插件,我们可以清晰的看到生成这段代码的ASM代码的实现:

这段代码中,第一个花括号中代码用来生成这个类的默认构造方法,第二个花括号中是用来生成静态代码块方法,去掉生成标签行数等无关代码后,最终需要的代码仅仅是:

下面再分析如何将这段ASM代码加到dex2jar工程中,从而实现代码植入。

通过不断调试dex2jar源码,我们可以找到使用ASM生成字节码的代码位置,在Dex2jar.java文件的doTranslate ()方法中:

ExDex2Asm方法convertCode是其父类中对外暴露的方法,用于处理每个方法生成。
在这里,我们可以判断当前类是不是应用的Application类,以及方法是不是静态代码块方法<clinit>, 是的话,通过visitMethodInsn加上XposedModuleEntry.init();方法,代码如下:

还有另外一种情形,也需要处理,就是当前应用自定义的Application类没有方法静态方法块的情形。对于这种情形的处理,仅修改ExDex2Asm类中的代码,显然无法实现。我们需要在其父类Dex2Asm中增加一个非私有的空方法,暴露给子类ExDex2Asm。这个方法需要包含类的节点信息DexClassNode和ASM代码生成对象ClassVisitor
通过分析Dex2Asm类中代码,最终选择了在其convertClass方法后面的位置调用此方法,代码如下:

addMethod具体实现中,先判断当前类是Application类,然后再遍历类的所有方法,如果没有静态代码块方法,通过ASM加上静态代码块方法,这段增加方法的ASM代码,就是上面用Android Studio中的ASM插件生成的。
最终完整代码如下:

此外,Dex2Jar类对象applicationName是从外面传入的应用定义的Application类全名,在Dex2jarCmd类中传入,Dex2jarCmd类的修改点如下:

Dex2jar类增加的两个成员变量和相关方法如下:

至此,我们完成了dex2jar工程的改造,顺利实现了给一个Apk注入代码。

有了上面的准备工作后,我们来分析Xpatch源码中,调用dex2jar工具修改apk流程,以及对修改后的apk打包签名的流程。

Xpatch源码的入口类MainCommand,其核心方法是doCommandLine()
doCommandLine()方法的主流程执行之前,先做了以下准备工作:`

以上准备工具完成后,通过三个task处理Apk文件,源码如下:

这三个task的作用分别是:

第二个task和第三个task比较简单,这里就不一一分析。
主要分析一下第一个task,修改Apk源码的task: ApkModifyTask
ApkModifyTask的核心流程是遍历Apk解压出来的所有dex文件,对每个dex文件执行Dex2jarCmd,这个cmd的作用就是找到dex中应用的Application类,并插入代码,如果找到,就不继续处理下一个dex文件,因为每个App只有一个Application类,代码细节如下:

使用dex2jar修改完Apk的Application类之后,得到的是一个jar文件,再通过jar2dex工具转为dex文件:

最后删除生成的jar文件,新的dex文件就是完成代码注入后的dex。
最后,将这些dex文件和so文件压缩为Apk文件,并签名。

至此,完成Apk的篡改,并实现App启动时,加载设备上已安装的所有Xposed插件模块。

最后,归纳一下Xpatch破解App的整体流程:

欢迎扫二维码,关注我的技术公众号Android葵花宝典 ,获取高质量的Android干货分享:

image

 
 
 
 
 
 
 
 
 

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 4
支持
分享
最新回复 (12)
雪    币: 1385
活跃值: (5609)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
2
还没来得及看,先记下。
2019-7-31 08:08
0
雪    币: 14865
活跃值: (6088)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习。
2019-7-31 08:41
0
雪    币: 36
活跃值: (1061)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
mark
2019-7-31 09:15
0
雪    币: 38
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
向大佬学习下
2019-7-31 09:41
0
雪    币: 3014
活跃值: (1717)
能力值: ( LV3,RANK:36 )
在线值:
发帖
回帖
粉丝
6
上篇文章就试用了下,结果在我的华为P9上崩溃了。
2019-7-31 09:43
0
雪    币: 181
活跃值: (621)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
2019-7-31 09:53
0
雪    币: 7
活跃值: (263)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
图裂了,看不到   大佬
2019-7-31 10:45
0
雪    币: 2095
活跃值: (344)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
大佬,现在稳定吗,稳定我就换个不需要root的手机
2019-8-1 17:02
0
雪    币: 4731
活跃值: (4674)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学习啦
2019-12-19 21:08
0
雪    币: 2240
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
向各位大佬学习!
2020-1-13 15:57
0
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
学习学习
2020-4-14 19:51
0
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
大佬这个支持模拟器吗
2020-4-14 21:16
0
游客
登录 | 注册 方可回帖
返回
//