主要类介绍
IXposedHookLoadPackage.java 接口
@Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { }
方法:handleLoadPackage,在加载应用程序包的时候,执行这个方法
参数:XC_LoadPackage.LoadPackageParam,这个参数包含了加载的应用程序的一些基本信息
XposedHelpers.java
XposedHelpers.findAndHookMethod(Class<?> clazz, String methodName, Object... parameterTypesAndCallback) { @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { { @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { return object ; } }); } });
方法:findAndHookMethod,是一个辅助方法,可以通过静态导入使用
参数:
第一个参数为包名.类名;
第二个参数固定为lpparam.classLoader
第三个参数为方法名(要被hook的函数名)
第四,五…个参数为函数参数(用类型.class表示)
最后一个参数为new XC_MethodHook() {…}XposedBridge.java
public static synchronized void log(String text) { Log.i("Xposed", text); if(logWriter != null) { logWriter.println(text); logWriter.flush(); } }
方法:log,顾名思义是日志打印的方法。输出到标准的logcat以及写入到/data/xposed/debug.log 这个文件中
XposedBridge.hookAllMethods(Class<?> hookClass, String methodName, XC_MethodHook callback) { });
XposedBridge.hookAllConstructors(Class<?> hookClass,XC_MethodHook callback) { });
方法:hookAllMethods/hookAllConstructors,用于hook某个类中所有方法或者构造函数
参数:
第一个参数为包名.类名;
第二个参数,方法名(hookAllConstructors无此参数)
第三个参数,方法回调
Hook
在Xposed框架,最基本的核心就是对方法的hook,所以寻找目标的正确类和方法名就变得尤为重要。
- 针对系统应用,可以通过google开放的源码进行查看相应的类和方法
- 针对第三方应用,可以通过反编译目标程序,查看目标源码。(常见的反编译工具可以百度上搜一搜)
上一篇文章中提到的就是对于系统的方法进行劫持Hook传送门
接下来我们来hook一下第三方的应用
Hook第三方应用
demo代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tvName= (TextView) findViewById(R.id.tv_name);
TextView tvInfo= (TextView) findViewById(R.id.tv_info);
Test001 test001=new Test001("我是车","我是有四个轮子的高档车");
tvName.setText(test001.getName());
tvInfo.setText(test001.getDes());
}
正常显示内容
hook内容,hook Test001 这个类的getDes方法
public class XModuleTest001 implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
//将包名不是com.ycss.test_001的应用剔除
if (!loadPackageParam.packageName.equals("com.ycss.test_001")) {
return;
}
XposedBridge.log("Loaded app: " + loadPackageParam.packageName);
XposedHelpers.findAndHookMethod("com.ycss.test_001.Test001", loadPackageParam.classLoader, "getDes", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
String str =(String)param.getResult();
XposedBridge.log("劫持后返回的内容" + (String)param.getResult());
param.setResult("我的轮子已经被hook了,成破车了");
}
});
}
}
效果图如下