Xposed尝试

Xposed尝试

环境搭建

  • 已root手机
  • 安装xpose installer及xposed框架
  • Android Studio + xposed framework api

由于手机刷机,rom已经root,而且带有xposed。
系统版本是android 5.0.2,xposed installer v89

xposed framework api - 82

如需更新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
2
3
4
5
6
7

|__src
| |__main
| |_java_
| |__libs
| |__api-82.jar
| |__api-82-source.jar

修改AndroidManifest.xml:
在application标签中加入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
<application>
...
<meta-data
android:name="xposedmodule"
android:value="true"/>
<meta-data
android:name="xposeddescription"
android:value="hook test"/>
<meta-data
android:name="xposedminversion"
android:value="53"/>
</application>
...

新建类,继承IXposedHookLoadPackage
hook操作就在这个类中编写

指定模块入口,如果没有main中没有assets文件夹,就先新建,再在文件夹下添加文本文件xposed_init:

1
com.fancy.tohook.Main//你的当前类所在的包名+类名

编写hook代码后,编译apk,adb安装,在Xposed installer中选择模块,之后在你的模块上打勾,手机重启即可使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
if(lpparam.packageName!=null){
String packstring=lpparam.packageName.toString();
if (packstring.contains("com.fancy.tobeenhook") || packstring.indexOf("com.fancy.tobeenhook")!=-1) {
XposedBridge.log(String.format("HOOK app: %s", lpparam.packageName));


//类名,类加载器,方法名,参数,。。。
XposedHelpers.findAndHookMethod("com.fancy.tobeenhook.MainActivity", lpparam.classLoader, "onCreate", Bundle.class, new XC_MethodHook() {


@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {

Class clazz = param.thisObject.getClass();
XposedBridge.log("XXX class name:"+clazz.getName());

Field field = clazz.getDeclaredField("btn");
Field field2=clazz.getDeclaredField("edit");//控件变量名

field.setAccessible(true);
field2.setAccessible(true);//非public成员会遇到报错

Button btn = (Button) field.get(param.thisObject);
EditText edt=(EditText) field2.get(param.thisObject);
edt.setText("BeenHook");
btn.setEnabled(true);


}
});
}

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是个空对象,产生报错。