Xposed尝试
环境搭建
- 已root手机
- 安装xpose installer及xposed框架
- Android Studio + xposed framework api
由于手机刷机,rom已经root,而且带有xposed。
系统版本是android 5.0.2,xposed installer v89
如需更新xposed framework以及xposed installer
xposed framework选择系统对应sdk版本
xposed uninstaller、xposed installer框架卸载程序及新版本框架安装器
测试用例
随便写个应用。
我的用例是,MainActivity中按钮不启用,监听编辑框内容,如果为“android”则启用,点击可跳转到SecondActivity,并传递编辑框内容,SecondActivity获取后与“BeenHook”比较,如果相等就会显示“Successful!”,由于传递过来的一定会是“android”,所以尝试通过hook,将按钮强制启用,在编辑框是“BeenHook”就可以跳转。
查看代码
Hook程序
新建无活动过程,在java目录下新建一个包libs
,将下载的api-82.jar和api-82-source.jar放入libs,add as library,修改build.gradle,将compile改为provided
1 |
|
修改AndroidManifest.xml:
在application标签中加入以下内容
1 | ... |
新建类,继承IXposedHookLoadPackage
hook操作就在这个类中编写
指定模块入口,如果没有main中没有assets文件夹,就先新建,再在文件夹下添加文本文件xposed_init
:
1 | com.fancy.tohook.Main//你的当前类所在的包名+类名 |
编写hook代码后,编译apk,adb安装,在Xposed installer中选择模块,之后在你的模块上打勾,手机重启即可使用。
1 | if(lpparam.packageName!=null){ |
hook之间
查看代码
hook之后,启动时就可更改
点击按钮,显示成功
一些问题
开始时遇到ClassNotFound,原因是muiltdex,Android studio编译产生多个dex,导致hook的类不在默认dex中,导致错误,可以在build.gradle中的defaultconfig添加
multiDexEnabled false
。不要把xposed framework api包放在app下的libs,android studio好像也能识别,不过这样会导致不编译到dex中,log中会看的
cannot load module
的错误。不兼容的问题没遇到,索尼大法好。
直接判断
lpparam.packageName==“xxx.xxx.xxx”
在老版本xposed framework会报错,不知道为什么会先加载一个无名的包,导致packageName是个空对象,产生报错。