Xposed Android hook -方法介绍

进入其他应用的进程

创建一个类,继承IXposedHookLoadPackage类,覆写handleLoadPackage方法,xposed的该方法在任何应用启动时都会被调用,故可以进入任何应用程序的进程,但是一般只针对某个特定的应用,例如,只要进入qq的进程:

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XposedBridge;

public class XposedInit implements IXposedHookLoadPackage {

    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        if (!loadPackageParam.packageName.contains("com.tencent.mobileqq")) //参数:包名
            return;

        XposedBridge.log("Loaded app: " + loadPackageParam.packageName);
    }

}
ps: XposedBridge.logLog差不多,Log打印的语句会出现在控制台,而XposedBridge.log的打印会输出到xposed框架的启动程序的日志功能中,要调试的话就要到xposed的日志下查看log输出。 

拦截某个方法

1.拦截com.tencent.mobileqq.app.message.QQMessageFacade类中的a方法,该方法有2个参数,类型分别是ArrayList、boolean。一般拦截用到的回调对象是XC_MethodHook。

findAndHookMethod("com.tencent.mobileqq.app.message.QQMessageFacade", loadPackageParam.classLoader, "a", ArrayList.class, boolean.class, new XC_MethodHook() {
    @Override
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
        try {
            // 在原先方法执行之后要执行的逻辑代码
        } catch (Throwable t) {
            XposedBridge.log(t);
        }
    }
});
ps: 方法的拦截分执行前拦截(beforeHookedMethod)和执行后拦截(afterHookedMethod),顾名思义,一个是在方法执行前先执行我们自己的代码,一个是在方法执行后再执行我们自己的代码。

2.如果你根本不行让原来的方法执行,那可以直接对方法的执行逻辑进行替换,回调时使用XC_MethodReplacement对象进行处理即可。

findAndHookMethod("com.tencent.mobileqq.app.message.QQMessageFacade", loadPackageParam.classLoader, "a", ArrayList.class, boolean.class, new XC_MethodReplacement() {
    @Override
    protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
        try {
            // 直接替换原来要执行的逻辑代码
        } catch (Throwable t) {
            XposedBridge.log(t);
        }
    }
});
ps:
    对于回调过来的参数MethodHookParam param一般有以下2种用处:
    param.args[0]:得到被拦截方法的第一个参数,返回值是Object
    param.getResult():得到被拦截方法的执行结果,返回值是Object

得到所有已经安装的应用程序

findAndHookMethod("android.app.ApplicationPackageManager", loadPackageParam.classLoader, "getInstalledApplications", int.class, new XC_MethodHook() {
    @Override
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
        @SuppressWarnings("unchecked") 
        List<ApplicationInfo> applicationInfoList = (List<ApplicationInfo>) param.getResult();
    }
});

得到上下文

try {
    Class<?> ContextClass = findClass("android.content.ContextWrapper", loadPackageParam.classLoader);
    findAndHookMethod(ContextClass, "getApplicationContext", new XC_MethodHook() {
        @Override
        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
            super.afterHookedMethod(param);
            if (applicationContext != null)
                return;
            applicationContext = (Context) param.getResult();
            XposedBridge.log("CSDN_LQR-->得到上下文");
        }
    });
} catch (Throwable t) {
    XposedBridge.log("CSDN_LQR-->获取上下文出错");
    XposedBridge.log(t);
}

未完待续。。。
原文链接(点击文字进入)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值