浅谈 Xposed 新概念 [模块作用域]

2020-02-20 14:26:43 +08:00
 mlgmxyysd

众所周知,Xposed 是一个系统级别的软件框架,它与 Cydia Substrate 不同,Xposed 仅可 hook app_process 中的 java 函数,不过对于大部分的 Android 应用来说已经足够了;

它所提供的 API 可以供模块开发者在不修改目标应用字节码的前提下修改目标应用的行为,甚至是将自定义的代码注入进目标应用中,由目标应用代为执行。

Xposed 模块开发起来也非常简单,简单来说,获取目标应用的源码或者反编译出伪代码,找到目标方法,将相关逻辑写入模块,编译,完成。

于是,一种新的安全风险也随之出现了

某“步数模块”对 [桃饱] 应用插入淘口令

某“后台管理模块”做了一堆根本不应该它去做的功能

......

更有甚者利用 [巨信] 的公众号功能,为自己的帖子刷流量

而当你想要禁止掉这种滥用行为的时候,你会发现,也许它根本就没有申请正常情况下做这些事情需要的权限,更别谈禁止了

这是因为它将代码注入到了 [巨信] 应用中,所有的工作都是由 [巨信] 来完成的,如果你使用抓包软件来抓取流量包的话,你会发现所有的相关流量都是由 [巨信] 发送和接收的

应该庆幸的是,目前所抓到类似行为的模块都是使用 java (或 kotlin 等 jvm 语言)层来编写的,反编译还算比较容易

可是如果模块使用 native ( C/C++)层编写(据我所知已经有一些模块使用 native 层来编写),或者使用了一堆非常恶心人的加固 /混淆呢?

要求所有模块必须开源一定是不可能的事情,第一这会大大打击模块开发者的积极性,第二即使开源也不能确保一定是安全的

(更何况某个自诩“安全”的 Xposed 框架商业化分支也还是闭源的,何谈模块开源?)

我相信 Xposed 的作者 rovo89 (等一下,Xposed 停更的最后一个版本号是 89,我好像发现了什么 zzz )一定也注意到了这个问题,只是因为某些原因最终弃坑掉了整个 Xposed 项目

于是,我们提出了一个新的概念

我将它称为

[模块作用域] (Modules Activation Scope)

简单来说,用户可以自主选择某个模块只对某些应用生效(或某个应用只激活某些模块,这个根据不同 Xposed 框架分支开发者的喜好自由安排)

这样虽说不可能完全解决 Xposed 模块滥用行为的安全问题,至少可以防止 Xposed 模块跨域对非目标应用进行 hook 操作

当前(截至发稿)已经有多种 Xposed 框架分支的开发者响应了这一概念

EdXposed 此功能正在开发中

应用转生 已发布

还有其他分支未收集

用户需要做的就是等待当前使用的分支更新这一功能

同时,我修改了开源分支 XPatch 的代码以支持这一功能,高级用户可以尝试使用一下

演示视频: https://www.bilibili.com/video/av80958793

源代码(已修改): https://github.com/MlgmXyysd/xposed_module_loader

不需要

为 Xposed 框架分支添加新功能一定应该是建立在兼容原版 API 的基础上的(当然某个 Xposed 分支妄图分裂 Xposed 生态从而创建自己由 Xposed API 魔改而来的 TxxCxx API 我是不敢恭维,也不想在这里过多提及)

模块开发者唯一需要做的就是告知用户你的模块 hook 了哪个应用的包名,供用户来参考

为单独的应用存储模块列表(推荐使用目标应用包名作为标识符),并设立全局列表(无法读取当前应用的列表时可读取全局列表)

具体代码自行实现

在上文中我提到了兼容性

除此之外,要求模块适配自己的 API 同样是一种不可能的行为

一味的要求开发者适配自己的 API 会导致对其他 Xposed 框架分支的兼容性下降,或者同时兼容多个分支的难度上升 同时,保留原版 Xposed API 也是对 Xposed 原开发者 rovo89 的一种尊重

换一种问法,框架完全可以做到的事情为什么非要模块开发者来做呢?


这一概念经过测试完全是可行的(已有经由 XPatch 修改的 demo 测试成功,见上文)

但是,概念也有它本身的一个漏洞,它仅封堵掉了模块对于跨域应用的滥用行为,并没有从根本上杜绝滥用行为的发生(如,针对正常的目标应用的滥用行为),用户在选择模块时仍需谨慎


我是 MlgmXyysd,希望更多 Xposed 框架分支可以响应这一概念,同时也希望更多的开发者可以开发出自己的 Xposed 框架开源分支


附件:

目前已知的几种 Xposed 实现方案的「作者是个人还是公司、是否开源、是否商业化」的总结

鉴于阻止运行的前车之鉴「 2.3.2 之后(不含 2.3.2 )的阻止运行你敢用嘛?」( From @LetITFlyW

如果你没为服务付钱,那可能你就是产品。免费商业化比收费商业化更可怕。建议各位有使用 Xposed 的需求的朋友在条件适宜的情况下拥抱开源或者虽闭源但非商业化的实现方案。另:在任何情况下均不建议关注「某个 Xposed 实现方案的作者」的「推送过多次广告文章」的微信公众号。

20848 次点击
所在节点    Android
126 条回复
D4wN
2020-02-20 14:40:07 +08:00
太极目前还不算商业化吧,不过我一直以为是 weishu 的纯个人作品。
RikkaW
2020-02-20 14:54:46 +08:00
从第一天就该有(小声
mlgmxyysd
2020-02-20 15:05:14 +08:00
@RikkaW 确实是这样,不过即使有这玩意,Xposed 的口子还是很大(
RikkaW
2020-02-20 15:08:18 +08:00
@mlgmxyysd Rikka 还是觉得就应该不兼容所有的老的,清除所有辣鸡,爱用不用(
mlgmxyysd
2020-02-20 15:11:18 +08:00
@RikkaW 还是尊重下原开发者比较好(
mlgmxyysd
2020-02-20 15:13:48 +08:00
@D4wN VirtualXposed 是他的纯个人作品(因为 VirtualApp 不给你商业化,否则?等着吃绿尸寒吧),TaiChi 在改名之前( EXposed )应该算是个人作品,后来公司上了“核心技术”之后就是纯商业化了,有一年多了(具体可以查他域名的 whois,2019 年 01 月 02 日)
ChenYuci
2020-02-20 18:41:10 +08:00
虚拟大师怎么回事?
Buges
2020-02-20 19:34:22 +08:00
frida 有没有可能替代 xposed ?注入脚本的形式半强制开源,可以 hook native 方法,安全性也稍好。
RichardY
2020-02-20 19:46:29 +08:00
谢谢。你不贴这个图我还不知道有这么多 xposed 方案了
flyElijah
2020-02-20 20:44:06 +08:00
@D4wN 我一直用的太极。
weishu
2020-02-20 21:07:18 +08:00
我永远也想不到,我的一个群管理把你踢了会让你黑我这么久。。看得出来你很嫉妒我,哈哈
flyElijah
2020-02-20 21:08:15 +08:00
@weishu 活捉大佬!
weishu
2020-02-20 21:12:54 +08:00
@flyElijah 雷好啊
jdgui
2020-02-20 21:20:46 +08:00
讲道理应该是得这样,但是其实我是觉得太极的阴模式更有用。
因为这样的话不用刷 magisk,这样他的权限就只能在你操作的 app 内了。
不过好像依然无法阻止其他模块去操控你 渡劫还是啥的那个 app。
gam2046
2020-02-20 21:29:46 +08:00
@Buges #8,我有尝试过嵌入 frida,但是似乎现在的 frida 和 magisk hide 有一些冲突,而我又不想关闭 magisk hide。最终放弃了这个方案。

正好自己工作中也有一些需求是反 Hook。于是乎利用了 @RikkaW 的 Riru-Core,又参考了 EdXposed 的实现,自己魔改了一个 Hook 框架,目前自己用着,也不是特别稳,但是少数几个我用的,还行。(不得不说,里面的坑太多了,一不留神就 bootloop,当然,我自己确实对 Android 的了解不够

最后使用 Rhino 导出了一个 Javascript 环境,来注入。

纯属自己搞着玩。
weishu
2020-02-20 21:31:14 +08:00
@jdgui 太极在好几天前已经在太极阴和太极阳加入了模块生效范围的机制了。。
weishu
2020-02-20 21:33:56 +08:00
@gam2046 magisk hide 和 frida 都用了 ptrace,所以会有冲突;但是其实你可以把 firda 的动态库直接嵌入程序,这样就不会用到 ptrace ;因为本质上 ptrace 只是为了注入。
我之前尝试过把 frida 和太极揉在一起,用来支持 native hook,rhino 也加进去了,完全是可行的;你可以试试。
mlgmxyysd
2020-02-20 22:47:14 +08:00
@weishu 你可要点脸吧,就你这点人品大家都可是看在眼里的
mlgmxyysd
2020-02-20 22:49:58 +08:00
@jdgui 其实非全局的 Xposed 在真正意义上并不能算 Xposed,因为这违反了 Xposed 的初衷:Xposed is a framework for modules that can change the behavior of the system and apps WITHOUT TOUCHING ANY APKS.(摘自 Xposed 官网,着重内容已大写处理)
mlgmxyysd
2020-02-20 22:52:40 +08:00
@weishu 看得出来,每个我的帖子您都不忘了给自己脸上“贴点金”,看来您是非常的嫉妒我啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/646108

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX