环境
夜神(Android5.1)
XposedInstaller(这里我用的是夜神软件商店下载的)
点击立即安装就行,切记:不要再去稀奇古怪找一些其它版本的,那样没办法激活的(即使有,也得费半天劲),自带的直接双击式安装
下载后直接点击version进行install
然后就会显示已激活
插件(i春秋教程教导)
过程
导入(注意这里不是libs,而是新建的lib)lib文件XposedBridgeApi-54.jar(把implemention改为provided模式,也就是不参与编译到最终文件中)
原来:
更改:
AndroidManifest.xml文件编写
<meta-data android:name="xposedmodule" android:value="true"/>
<meta-data android:name="xposeddescription" android:value="模块说明"/>
<meta-data android:name="xposedminversion" android:value="54"/>
<meta-data android:name="xposedmodule" android:value="true"/>
true的话,xposed尝试去加载apk作为插件的一部分
<meta-data android:name="xposeddescription" android:value="模块说明"/>
<meta-data android:name="xposedminversion" android:value="54"/>
或者在assets目录下的version文件里
入口类编写
package com.example.xposed;
import android.app.Application;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
public class XposedEntry implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam Param) throws Throwable {
findAndHookMethod("com.example.xposed.times",Param.classLoader,"test", Application.class,new myget_times());
}
}
class myget_times extends XC_MethodHook{
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
param.setResult(null);
}
protected void afterHookedMethod(MethodHookParam param) throws Throwable {}
}
创建一个类继承IXposedHookLoadPackage
,然后把接口函数handleLoadPackage
进行相应的重写
findAndHookMethod("com.example.xposed.times",Param.classLoader,"test", Application.class,new myget_times());
hook函数的思路是先找到类,然后再近一步找到函数, findAndHookMethod
的第一个参数是函数所在的类名(包名+类名),第二个参数Param.classLoader
类装载器,第三个参数是函数名,第四个参数是函数所需要的参数(参数类型+class),第五个参数是回调函数(还需近一步实现)
回调函数编写
class myget_times extends XC_MethodHook{
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
param.setResult(null);
}
protected void afterHookedMethod(MethodHookParam param) throws Throwable {}
}
创建一个类,继承XC_MethodHook
,然后对beforeHookedMethod
(函数调用前操作,举例 :直接让它别调这个函数)和afterHookedMethod
(函数调用后操作,举例:直接把返回值(返回值在param中)更改再进行返回)
设置启动入口
创建assests文件,在文件夹中,新建xposed_init文件,写入入口类的信息
安装激活插件,重启即看到插件效果
可以看到,xp是在程序启动的时候同时加载的,因此它的钩子函数是区分进程的。如果有想对特定进程下钩的话可以很方便使用xposed。而挂钩函数方面可能没有Cydia那样容易写,不过有一个优点是,对于程序的类和参数,可以通过名字来进行下构。比如说,对于String类,类名是java.lang.String,那么传递的参数可以使“java.lang.String”,与传递String.class效果是一样的
xp的Hook分为函数执行前,和执行后两个位置,可以分别进行参数修改和结果修改。如果不想进行调用的话,可以在执行前使用setResult(NULL)
参数
实战
times类
package com.example.xposed;
import android.app.Application;
import android.widget.Toast;
import static android.widget.Toast.LENGTH_LONG;
public class times {
public void test(Application a){
Toast.makeText(a, "点击成功",LENGTH_LONG).show();
}
}
hook掉times类中的test函数,让它不再调用
package com.example.xposed;
import android.app.Application;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
public class XposedEntry implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam Param) throws Throwable {
findAndHookMethod("com.example.xposed.times",Param.classLoader,"test", Application.class,new myget_times());
}
}
class myget_times extends XC_MethodHook{
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
param.setResult(null);
}
protected void afterHookedMethod(MethodHookParam param) throws Throwable {}
hook前(无这行代码param.setResult(null);)
hook后(有这行代码param.setResult(null);)
classLoader
与java上的类似,就是一个类装载器,与java不同的是,classLoader所加载的就是dex文件本身,所以通过程序的classLoader,可以取得程序的classLoader,可以取得程序的dex中所定义的所有类以及成员函数。同理,如果一个程序有多个dex,那么则会对应着多个classLoader,特别是使用动态加载的dex,则需要传递想要的classLoader才可以进行数据获取,这点请注意。