LSPosed 模块开发入门和踩的坑

最近工作中一直在使用LSPosed工具,所以想着记录下来,总结一下,顺便分享给有需要的人

环境

我使用的是 Magisk + LSPosed。

如何使用

官方有写好的wiki,这里不再赘述。

模块开发

温馨提示:

在开发之前,一定要弄清楚:

  1. 模块工作的原理:模块处于哪个进程?有哪些目录的权限?

  2. classloader双亲委托机制:为什么我用模块类的classloader 无法找到要hook的类?怎么反射获取目标类?获取到目标类之后,hook只是调用api的事情了。

模块创建时如何配置:

Module Scope · LSPosed/LSPosed Wiki · GitHub

Native Hook相关: Native Hook · LSPosed/LSPosed Wiki · GitHub

基本上只要安装官方的文档来操作,运行第一个模块不会有什么问题。

Native 注意事项

  1. 开发的动态库不要跟原app的动态库的符号冲突了。

没有native开发经验的同学可以和遇到该问题,并且遇到代码逻辑不是安装自己预期工作的。

避免出现该问题的方法:

  1. 检查目标app自身使用了哪些第三方动态库,我们自己的模块是否也有使用?如果也有相同的动态库,则要考虑去掉自己的那个动态库,要么复用目标app的要么不用。

系统动态库和ndk自带的动态库共用则没关系。

  1. 如果遇到hook 动态库函数后,程序崩溃的情况,除了是我们代码写的有问题之外,很可能是应用程序做了hook检测。一般app会检测某些关键的函数,如 jni相关的接口。 怎么区分是bug还是目标app做了检测呢?验证方法:hook自己的写的一个demo, 如果demo能正常工作,就说明接口hook是正确的。

实操经验(踩过的坑)分享

LSPosed Manager 如何安装?

  1. 下载magisk对应的模块(需要弄清楚自己用的是Zygisk还是riru方案,我用的是Zygisk),推荐下载最新版 下载地址

  2. 在magisk Modules界面安装模块即可

LSPosed Manager在哪?

我第一次启动模块的时候就遇到了问题,这个module状态magisk里面了,但是没有启动的方法。后面看看文档才知道,原来入口在通知栏。LSPosed默认会启动一个常住通知在通知栏,通过点击通知即可打开LSPosed界面。

每次模块更新都要重启手机?

我目前测试的效果是 如果把需要hook的应用数据清除了,则模块代码会立即生效,也就是说

如果能接受清除数据,可以不重启;但我也遇到过异常情况,应用非常卡,修改的代码也没生效,重启后解决。

另外网上有人写了可以动态加载apk的模块,可以解决每次重启的问题,不过我没有使用该方法。未经本人验证,有需要的拿去: 参考博客 代码仓库地址

root检测怎么过?

  1. 安装Shamiko可以过很多检测,推荐下载最新版本 下载地址

  2. 如果发现有的app还是能检测出root,那请先逆向分析找到它检测root的方式,再针对性hook检测的代码来解决

Magsik中一项很重要的配置-DenyList

Magisk hide/Denylist 是一种用于隐藏ROOT 权限的工具,它可以让用户在ROOT 状态下使用一些应用程序,同时隐藏ROOT 权限,以避免被一些应用程序检测到ROOT 权限而无法正常运行。

如果要hook的应用具有多个进程,并且安装root防检测模块后还是被发现了root权限,请检查该配置

点击Magisk 首页左下角Home,再点击右上角设置按钮,下滑找到 Configure DenyList(对应的中文是 配置排除列表),接着点击目标应用,然后可以看到一个展开的进程列表,点击应用右侧的方块复选框,就可以全选所有的进程啦。

如果我要记录日志,日志放在哪?

很多同学可能有这样的习惯,日志路径使用context获取外置存储或内置存储,初始化放在application attach的时候,这么做自然没错,但在lsposed模块中则不可以。

因为程序的入口变了,不再是application。所以这时要做的也是先获取到当前应用的context,再去获取日志存储路径。

模块在hook进程工作时,怎么和模块app通信?

模块在工作的时候,属于目标app进程,做的很多跨进程通信的行为是可以被感知到的,如:拉起activity、绑定服务、ContentProvider调用、FireProvider分享文件、不在原app中存在的广播action等等。

我觉得比较安全的方式是进行自定义加密的socket通信,其次是携带加密数据的广播。其他几种被检测到的风险则比较大。

总结

今天只是讲讲基本的入门和注意事项,以后有空再讲讲 lsposed hook细节和实战,如 okhttp自吐、文件操作、加解密自吐等等。

相关推荐
darkb1rd5 小时前
五、PHP类型转换与类型安全
android·安全·php
gjxDaniel6 小时前
Kotlin编程语言入门与常见问题
android·开发语言·kotlin
csj506 小时前
安卓基础之《(22)—高级控件(4)碎片Fragment》
android
峥嵘life6 小时前
Android16 【CTS】CtsMediaCodecTestCases等一些列Media测试存在Failed项
android·linux·学习
stevenzqzq7 小时前
Compose 中的状态可变性体系
android·compose
似霰8 小时前
Linux timerfd 的基本使用
android·linux·c++
darling3319 小时前
mysql 自动备份以及远程传输脚本,异地备份
android·数据库·mysql·adb
你刷碗10 小时前
基于S32K144 CESc生成随机数
android·java·数据库
TheNextByte110 小时前
Android上的蓝牙文件传输:跨设备无缝共享
android
言之。11 小时前
Kotlin快速入门
android·开发语言·kotlin