Hook是一种在特定事件或操作发生时插入自定义代码的编程技术。在前端开发中,例如Vue和Angular的生命周期钩子,体现了Hook的机制,允许开发者在组件的不同阶段执行代码,提升代码的模块化和可重用性。
Android Hook与此类似,允许开发者在Android应用程序运行时修改或扩展现有功能。通过拦截方法调用、修改参数或返回值,Hook可用于调试、测试和逆向工程,例如监控应用程序行为、捕获API调用,或在不修改源代码的情况下添加新功能,以及替换so模块以实现获取验证码或广告拦截等功能。
在快写完这篇博客的时候,我才发现我想要实现的功能不需要Android Hook即可实现…不过不耽误我对这方面做一些了解,所以接着写完了。
补充知识
前几天刷机的时候基本算是闷头跟着教程走,中间还险些变砖。虽然过程中我边操作边了解,但也是比较粗糙,这里再补充点知识并做做记录。
Magisk工具
现在的刷机教程一般都会引导读者在root后安装Magisk,乍看上去是个工具包,集合了很多功能,那这个“面具”具体是什么,有什么用呢?
Magisk是一款流行的Android系统级root工具,由XDA开发者topjohnwu创建和维护。与传统的root方法不同,Magisk采用了一种“无系统”的方式,这意味着它不会直接修改系统分区中的文件,而是通过修改boot镜像来实现root权限。这种方法的好处在于它能够更好地兼容系统更新,避免root权限导致的系统不稳定或应用崩溃。Magisk的“无系统”特性也使得它能够更好地隐藏root权限,从而绕过一些应用的root检测机制,例如Google的SafetyNet。
Magisk的核心功能是提供root权限,允许用户访问和修改系统文件,以及安装各种Magisk模块来扩展系统功能。这些模块可以实现各种各样的功能,例如自定义系统UI、增强系统性能、拦截广告、修改系统设置等等。Magisk还提供了一个Magisk Manager应用,方便用户管理root权限和Magisk模块。Magisk的持续更新和强大的社区支持,使其成为Android用户中非常受欢迎的root工具。 Magisk的出现,很大程度上简化了root流程,并提升了root后的系统稳定性和安全性。
Xposed框架
Xposed框架是一个Android模块化框架,允许开发者通过模块修改系统和应用行为,无需修改APK文件。它由rovo89开发,最初用于调试和测试,通过替换系统核心文件实现功能,并允许开发者使用Java代码hook方法。Xposed功能强大,可修改系统UI、性能、广告等,但安装复杂,存在风险,需要root权限。
Magisk和Xposed都是Android root工具,但Magisk采用“无系统”方式,更安全稳定,兼容性更好;Xposed功能更强大,但修改系统文件,风险更高。一些用户会结合使用两者,先用Magisk获得root权限,再安装Xposed,以兼顾安全性和功能性,但需要注意模块兼容性。
与之相对的还有CydiaSubstrate框架,不过xposed是开源项目,所以培养了更加庞大的开发者社区,网上基于Xposed框架的模块插件非常多。
Xposed Hook实现原理及缺陷
Xposed虽好,但也存在缺陷,比较致命的就是兼容性差。
Xposed框架的运作依赖于Android系统的Zygote进程和app_process
,但其机制并非简单的替换。准确地说,Xposed通过替换系统默认的/system/bin/app_process
为一个修改过的版本来实现其功能,这个修改后的app_process
包含了Xposed框架的核心代码,以及方法Hook机制。
系统启动时,init.rc脚本启动Zygote进程,使用的是这个被Xposed替换后的/system/bin/app_process
。因此,Zygote进程本身就加载了Xposed框架。所有应用进程都是Zygote的子进程,因此它们继承了Xposed框架的代码。
开发者编写的Xposed模块定义了Hook规则,这些模块会被Xposed框架加载,并根据规则执行Hook操作。Xposed框架会管理这些模块,并确保它们能够正确地与Zygote进程和应用进程交互。Xposed的Hook操作并非在应用运行时动态进行,而是在Zygote进程启动的早期阶段就完成了,这使得Hook操作能够影响所有从Zygote fork出的应用进程。这与在应用运行时动态Hook方法相比,效率更高,也更稳定。
听起来很不错,但问题也就出在这里。Android系统的更新迭代频繁,且不说Android本身的各种大小版本,各家手机厂商也会在原本的基础上进行魔改,这就导致Android系统版本繁多。每次系统更新都可能改变app_process
的结构或行为。Xposed框架需要针对每次系统更新进行适配,才能保证其正常工作。如果Xposed框架没有及时更新以适应新的app_process
,那么它就可能无法正常工作,甚至导致系统崩溃或bootloop(无限重启)。知名项目可以依赖庞大的贡献者群体及时更新,小项目跟不上版本就会慢慢废弃。
EdXposed框架
GitHub - ElderDrivers/EdXposed: Elder driver Xposed Framework.
EdXposed是Xposed框架的改进版,主要解决了Xposed在高版本Android系统上的兼容性问题。Xposed通过替换核心文件app_process
工作,这种方式在新的Android系统中容易冲突,导致不稳定甚至崩溃。而EdXposed则基于Riru项目,通过注入代码到zygote进程,避免了直接修改系统文件,从而提升了兼容性和稳定性。 两者功能相似,都允许安装模块扩展系统功能,但EdXposed在兼容性和稳定性方面显著优于Xposed。
LSPosed框架
LSPosed是EdXposed的进一步发展,旨在提供更高的兼容性和用户体验。与EdXposed类似,LSPosed也基于Riru项目,通过注入代码到Zygote进程来实现功能扩展,避免了直接修改系统文件的问题,从而提升了稳定性。
LSPosed在模块管理方面进行了优化,提供了更直观的用户界面,使得用户可以更方便地安装和管理模块。此外,LSPosed支持无root模式,降低了使用门槛,这个特点降低了用户的使用门槛,可以拉更多人入坑。
LSPosed仍然需要针对不同