首页
论坛
课程
招聘
[原创]App免Root加载Xposed模块的工具(换种思路实现Xpatch)
2021-9-3 17:33 7387

[原创]App免Root加载Xposed模块的工具(换种思路实现Xpatch)

2021-9-3 17:33
7387

前介

前段时间抽空看到了一个 Xpatch 一款App免Root加载Xposed模块的工具。看完实现,我感觉几处想法,是我没有想到的。

说实话以前不是没有想过这种思路,但是当时思考的是入口通过什么方式注入,我当时想的注入smail代码。

Xpatch的优化点

注入代码入口方式

既然注入就需要注入一个代码入口,注入代码入口的方式。
Xpatch 的思路是将 dex -> jar -> ASM修改class-> jar转Dex。这个思路是我没西想到的,但是这个思路存在速度慢与反编译回编译的错误风险。

 

我想到的有2种。

  1. 反编译dex,修改smail文件。
  2. 直接修改Dex文件。

我选择的是直接修改Dex文件,方便快速。

修复65535方案

由于是在宿主 application 的 dex,因此存在 applicationdex 方法数抄了的问题。
Xpatch 是通过替换宿主的 Papplication ,然后通过反射&Hook,创建宿主的application,相当于代理宿主application。

 

我的思路是修改宿主 application 不为 final,然后替换宿主application。新的 application 直接继承宿主 application。

dex加载问题

这个问题我在issues说过。加载模块用的父classloader,用的是宿主的PathClassLoader,如果插件中存在用了和宿主一样的开源项目,刚好还没混淆,就会出现类的引用异常。

 

解决方案:

 

ClassLoader.getSystemClassLoader() ->加载Hook框架模块得到DexClassLoder->加载插件模块
调用插件模块的方法,并传入宿主的 PathClassLoader。

 

这样就能规避掉问题了。

总结

总的来说 Xpatch 让我少走了很多弯路,大佬牛皮!!!

源代码

github 素质三连


[培训] 优秀毕业生寄语:恭喜id咸鱼炒白菜拿到远超3W月薪的offer,《安卓高级研修班》火热招生!!!

最后于 2021-9-3 17:34 被逆向小学生编辑 ,原因: 改错
收藏
点赞2
打赏
分享
最新回复 (43)
雪    币: 8381
活跃值: 活跃值 (1250)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 活跃值 2021-9-3 17:50
2
0
直接修改Dex文件?代码不多吧?
雪    币: 21
活跃值: 活跃值 (145)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
情迁 活跃值 2021-9-3 21:24
3
0
我的三种思路都在我的神之手软件里面有设置,我的软件本身也是从xpath里面搞过来的。后面本身被我抽取成一个支持全平台包括安卓的库,但是后面又因种种问题,,干脆又只专门在安卓上兼容了。。
雪    币: 24
活跃值: 活跃值 (308)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
amwpecel 活跃值 2021-9-4 00:26
4
0
不能过壳的校验 没啥搞头
雪    币: 1869
活跃值: 活跃值 (2700)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
virjar 活跃值 1 2021-9-5 22:21
5
1
害, https://github.com/virjarRatel
雪    币: 8381
活跃值: 活跃值 (1250)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 活跃值 2021-9-6 09:21
6
0
仔细看了一下,原来所谓直接修改dex是将2个dex文件合并,并不是直接修改dex字节码。
“我选择的是直接修改Dex文件,方便快速。”个人认为并不一定速度快,只是稳定性可能好些。
雪    币: 230
活跃值: 活跃值 (325)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
逆向小学生 活跃值 2021-9-6 10:10
7
0
tDasm 仔细看了一下,原来所谓直接修改dex是将2个dex文件合并,并不是直接修改dex字节码。 “我选择的是直接修改Dex文件,方便快速。”个人认为并不一定速度快,只是稳定性可能好些。

老铁 仔细看看源码 有2种方式 1是原有application注入static方法&原有static方法注入指定代码。
关于速度 你可以试试 dex->jar->dex 这一系列过程那个快


还有代码中完全没有合并2个dex操作???你是咋仔细看的呀,老铁!!

最后于 2021-9-6 10:20 被逆向小学生编辑 ,原因:
雪    币: 230
活跃值: 活跃值 (325)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
逆向小学生 活跃值 2021-9-6 10:11
8
0
tDasm 仔细看了一下,原来所谓直接修改dex是将2个dex文件合并,并不是直接修改dex字节码。 “我选择的是直接修改Dex文件,方便快速。”个人认为并不一定速度快,只是稳定性可能好些。
另外一种方式 只需要保证 宿主的application 非final 修饰,应为application替换成了自己的并继承了宿主的,也对注入的application的dex进行了修改
雪    币: 8381
活跃值: 活跃值 (1250)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 活跃值 2021-9-6 10:56
9
0
逆向小学生 tDasm 仔细看了一下,原来所谓直接修改dex是将2个dex文件合并,并不是直接修改dex字节码。 “我选择的是直接修改Dex文件,方便快速。 ...

这是你引用的连接:

XpRoot是一款通过解压APK,动态修改Dex文件,实现注入Xposed模块的应用.源码分析


合并2个dex
private fun margeDex() {
    // 1. 创建 dex pool
    val dexPool = DexPool(Opcodes.getDefault())
    // 2. 打开dex1
    val d1 = openDex("/Users/wengege/Desktop/NewWx/classes-3.0.dex")
    // 3. 打开dex2
    val d2 = openDex("/Users/wengege/Desktop/NewWx/weixin807android1920/classes10.dex")
    // 4. 遍历dex1的所有类
    for (classDef in d1.classes) {

作者:光头勇士
链接:https://juejin.cn/post/7003631003755348004/

最后于 2021-9-6 11:01 被tDasm编辑 ,原因:
雪    币: 230
活跃值: 活跃值 (325)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
逆向小学生 活跃值 2021-9-6 11:04
10
0
tDasm 逆向小学生 tDasm 仔细看了一下,原来所谓直接修改dex是将2个dex文件合并,并不是直 ...

这是我前面告诉你 dexlib2 杂用的例子  看看标题 再把源码clone下来 在仔细看看

再者说合并2个dex,没有任何意义,主要要处理2件事  1:注入你的代码  2:你的代码有一个执行入口

最后于 2021-9-6 11:09 被逆向小学生编辑 ,原因:
雪    币: 117
活跃值: 活跃值 (700)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huaerxiela 活跃值 2021-9-6 11:12
11
0
害, https://github.com/virjarRatel
雪    币: 8381
活跃值: 活跃值 (1250)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 活跃值 2021-9-6 11:16
12
0
逆向小学生 tDasm 逆向小学生 tDasm 仔 ...

再往后看,dex的确没有合并,只是增加dex个数。
但是与你文中所说的直接修改dex文件毫无关系?你根本就没有修改原来的dex文件。那你应该写增加1个dex而不是写直接修改dex文件。

老实说,增加一个dex还不如原作者修改dex。虽然生成新的dex速度慢些,但是app运行时速度不会有什么影响,而你这个生成新的apk速度快但运行速度会有一点影响而且如果再加固的话影响会更大。

最后于 2021-9-6 11:34 被tDasm编辑 ,原因:
雪    币: 230
活跃值: 活跃值 (325)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
逆向小学生 活跃值 2021-9-6 11:40
13
0
tDasm 逆向小学生 tDasm 逆向小学生 ...

我的妈呀 我服了你了 我问问你 只增加dex 只能完成
你的代码注入
那我问你你代码怎么执行???
InjectMethodBuilder.java  好好读一读

我写的很清楚 Xpatch 注入代码的方式是  dex->jar -> asm 改造class->  在回转成dex


我的是直接修改dex,插入执行指令,你能认真读了在说话行吗?这就是你说的认真吗??读也没读就乱喷,好烦你这种人啊。


贬低别人来凸显你自己厉害吗??要不你也开源一个??


加固的话  xpatch 也不行 明白吗? 知道为啥不行,知道原因吗???

最后于 2021-9-6 11:57 被逆向小学生编辑 ,原因:
雪    币: 230
活跃值: 活跃值 (325)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
逆向小学生 活跃值 2021-9-6 11:44
14
0
逆向小学生 tDasm 逆向小学生 tDasm ...

我说原作者的不行了?? 知道啥是思路吗???我只是想说也可以直接他通过修改dex完成!!!操作对象不同,我怀疑你连asm 都不会用吧


还有Xpatch 也增加dex了 你连Xpatch 源码都没认真读吧??


还有Xpatch 有我说的第3个问题,我Xposed写的模块中用了协程,hook宿主中有协程的会有类引用异常 明白吗???知道啥原因吗??读一读,读完在说话

最后于 2021-9-6 11:51 被逆向小学生编辑 ,原因:
雪    币: 8381
活跃值: 活跃值 (1250)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 活跃值 2021-9-6 14:19
15
0
逆向小学生 tDasm 逆向小学生 tDasm ...

说实话,对于这种拿别人东东稍微修改一下又发出来的,我是懒得理的。要不是你标榜所谓直接修改dex文件,我根本就不会关注。我想要插入到dex文件的代码还不少,他是怎么直接修改dex文件的?(所谓直接修改dex,大家都认为是修改dex文件结构及smali字节码而不是通过其它工具转换)所以才发帖问一下,谁知你不予回答,我就进去看了一下介绍文章,结果大失所望。你根本就没直接修改dex,而是增加一个dex来达到注入代码的目的。

我再说一次,我不会看你的代码。我只是看介绍。


看看前面别人写的,你的所谓新意在哪里?

这是通过合并dex增加生成dex速度:

https://bbs.pediy.com/thread-256256.htm

这是通过增加dex文件:

https://bbs.pediy.com/thread-254075.htm



最后于 2021-9-6 14:44 被tDasm编辑 ,原因:
雪    币: 230
活跃值: 活跃值 (325)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
逆向小学生 活跃值 2021-9-6 16:17
16
0
tDasm 逆向小学生 tDasm 逆向小学生 ...

算了 和你个小白我不想说啥了 

修改dex文件结构??你去看看 dexlib2 库是干嘛的?我只是用了dexlib2库,来修改方法指令。dexlib2最终帮我们完成了组装和生成dex文件,dexlib2 才是改的dex文件结构。

我真服了 你看看 apktool 是不是用dexlib  修改smali 就是修改文本,我没事干把dex 转smail干嘛???

我不会看你的代码。我只是看介绍,你真是个奇葩
那你就别BB  我真服了你这种人了 代码都不仔细 文章写了修改dex,页说了在哪插装

最后于 2021-9-6 16:20 被逆向小学生编辑 ,原因:
雪    币: 230
活跃值: 活跃值 (325)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
逆向小学生 活跃值 2021-9-6 16:22
17
0
tDasm 逆向小学生 tDasm 逆向小学生 ...

https://bbs.pediy.com/thread-256256.htm
再说你这篇文章,你看看他是不是用了 dexlib2 来确定application在dex的位置。

在看看他描述的 
同时使用 baksmali d 参数 只反编译一个smali文件从而插入入口代码。最后使用 DexMerger 库 合并dex。速度大大提升

我纳闷了没事干用,把dex直接反编译成 smali干嘛?直接用dexlib2修改 dex不就行了吗?
你去看看dexlib2是干嘛的?
一个解析和修改dex文件的库 小白


再看看你第二篇文章描述

https://bbs.pediy.com/thread-254075.htm


第二部分代码也很简单,就是提取出第一部分生成的dex文件,转为smali之后修改继承的父类就可以了


都是吧dex转smali


你在看看我的描述

我想到的有2种。

  1. 反编译dex,修改smail文件。
  2. 直接修改Dex文件。

你真逗我 所有都是我自己想的,你这2篇文章我看都没看过。我怎么就拿来改改了???大部分代码都是自己写的,别人开源我还不能借鉴2个方法了?就算不开源我还写不出,哪2个方法???

小白 去好好看看 啥事开源精神



来给你看看我文章描述的代码


```java

/** * 构建静态代码块的 Mehtod *    static { *     XpRoot.start(); *    } */public static Method buildStaticContextMethod(String className) {    ArrayList<ImmutableInstruction> instructions = Lists.newArrayList(            ImmutableInstructionFactory.INSTANCE.makeInstruction35c(Opcode.INVOKE_STATIC, 0, 0, 0, 0, 0, 0, getStaticContextMethodRef()),            ImmutableInstructionFactory.INSTANCE.makeInstruction10x(Opcode.RETURN_VOID)    );    ImmutableMethodImplementation methodImpl = new ImmutableMethodImplementation(0, instructions, null, null);    return new ImmutableMethod(className, "<clinit>", new ArrayList<>(), "V", AccessFlags.STATIC.getValue() | AccessFlags.CONSTRUCTOR.getValue(), null, null, methodImpl); }

```


 ImmutableInstructionFactory.INSTANCE.makeInstruction35c(Opcode.INVOKE_STATIC, 0, 0, 0, 0, 0, 0, getStaticContextMethodRef()) 知道这个是干嘛的不?

知道为啥传 0 0 0 0 0 0 不,你先去看看dex文件结构,方法指令怎么解析的,你才知道怎么能直接修改dex明白不。dexlib2已经帮我们封装好了和ASM是一个性质的。 ASM解析处理class  dexlib2解析处理dex。弱智好好看看文章,我前面没写吗???


最后于 2021-9-6 16:45 被逆向小学生编辑 ,原因:
雪    币: 8381
活跃值: 活跃值 (1250)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 活跃值 2021-9-6 16:58
18
0

你的语文是体育老师教的?
直接修改Dex文件?根本就不是这回事。到处拿来主义就不要发出来了.你不仅是小白还是小抄,叫文抄公更贴切。换个思路还是抄个思路?还是死路?

最后于 2021-9-6 17:00 被tDasm编辑 ,原因:
雪    币: 230
活跃值: 活跃值 (325)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
逆向小学生 活跃值 2021-9-6 16:59
19
0
tDasm 你的语文是体育老师教的? 直接修改Dex文件?根本就不是这回事。到处拿来主义就不要发出来了.你不仅是小白还是小抄,叫文抄公更贴切。
看了你的回帖 我发现你是个很自大的人 那你告诉我直接修改dex是怎么修改??自己写一套dexlib2?哪xpath也自己写一套 asm吧
雪    币: 230
活跃值: 活跃值 (325)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
逆向小学生 活跃值 2021-9-6 17:01
20
0
tDasm 你的语文是体育老师教的?直接修改Dex文件?根本就不是这回事。到处拿来主义就不要发出来了.你不仅是小白还是小抄,叫文抄公更贴切。换个思路还是抄个思路?还是死路?

就知道 BB 没见过你开源过一个像样的东西 

最后于 2021-9-6 17:01 被逆向小学生编辑 ,原因:
雪    币: 8381
活跃值: 活跃值 (1250)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 活跃值 2021-9-6 17:05
21
0

拿不出东西就抄,这是你的真实写照。
你不知道有winhex或10editor?可以直接修改dex文件结构及smali字节码?

最后于 2021-9-6 17:06 被tDasm编辑 ,原因:
雪    币: 230
活跃值: 活跃值 (325)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
逆向小学生 活跃值 2021-9-6 17:06
22
0
tDasm 拿不出东西就抄,这是你的真实写照。你不知道有winhex或10editor?可以直接修改dex文件结构及smali字节码?
傻叉 那是修改字节码 你知道吗 dexlib2 的封装就是修改字节码  asm 也一样 
雪    币: 230
活跃值: 活跃值 (325)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
逆向小学生 活跃值 2021-9-6 17:07
23
0
tDasm 拿不出东西就抄,这是你的真实写照。你不知道有winhex或10editor?可以直接修改dex文件结构及smali字节码?
你了解dex文件结构吗?
雪    币: 230
活跃值: 活跃值 (325)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
逆向小学生 活跃值 2021-9-6 17:08
24
0
tDasm 拿不出东西就抄,这是你的真实写照。你不知道有winhex或10editor?可以直接修改dex文件结构及smali字节码?
哇  你可真厉害 10edit  是一个字节码编辑工具 它是可视化的 你用 10edit 难道没用 dex文件结构的脚本吗??你可是真逗啊 
雪    币: 230
活跃值: 活跃值 (325)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
逆向小学生 活跃值 2021-9-6 17:10
25
0
你的理解修改dex 就是去 写一套dexlib2  那xpath 也是抄被人的 因为他用了 dex2jar & asm ,这样才不算抄是吧??
游客
登录 | 注册 方可回帖
返回