首页
社区
课程
招聘
[原创]xposed的一些经验分享
发表于: 2020-11-5 10:45 5199

[原创]xposed的一些经验分享

2020-11-5 10:45
5199
  • 加壳的应用上如何用xposed

    如下代码是某个通过棒棒加固的APP,首先获取到加固替换掉的Application然后再获取到ClassLoader,其实跟Xposed的loadPackageParam.classLoader一个原理,只是加固应用多了一步。

final Class clazz = XposedHelpers.findClassIfExists("com.secneo.apkwrapper.AW",loadPackageParam.classLoader);
if(clazz!=null) {
    XposedHelpers.findAndHookMethod(clazz, "onCreate", new XC_MethodHook() {
        public void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {

                sApplication = (Application)XposedHelpers.getStaticObjectField(clazz,"a");
                sClassLoader = syApplication.getClassLoader();
                HookTools.hookFunc(sClassLoader);
        }
    });
}
  •  函数中传的接口类(interface)

       这个很多网站上有案例,通过java.lang.reflect.Proxy能解决。很多人到了hook异步请求或者rxjava就头疼,因为很多参数或者返回值都是类似A<T>或者interface,配合下面实例可以轻松解决。

public static Object Proxy(ClassLoader classLoader) {
    return Proxy.newProxyInstance(classLoader, new Class[]{XposedHelpers.findClass("bolts.Continuation", classLoader)}, new InvocationHandler() {
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            if (method.getName().equals("then")) {
                Object task = args[0];
                Gson gson = new Gson();
                JSONObject object = JSON.parseObject(gson.toJson(XposedHelpers.callMethod(task,"getResult")));
                //获取值
                return null;
            }
            return null;
        }
    });
}

//调用方法
XposedHelpers.callMethod(respon,"continueWith",Proxy(classLoader));
  • 其他问题

  • 如果需要用APP内的Context的话直接搜索public static Context关键词能搜索到很多函数随便调用。

  • 需要某个实例化类先找找APP内的instance函数或者获取实例的static函数,如果没有的话用xposed去instance

  • callMetchod传enum类型的参数

//
XposedHelpers.callMethod(classObject,"method", Enum.valueOf(enumClass, "One"))
  • 处理异步请求结果时配合Map和sleep

//保存异步结果的全局map
public static Map<String,String> keymap = new ConcurrentHashMap();

//异步框架的参数实现类代理
public static Object Proxy(ClassLoader classLoader,String key) {
    return Proxy.newProxyInstance(classLoader, new Class[]{XposedHelpers.findClass("bolts.Continuation", classLoader)}, new InvocationHandler() {
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //获取到值后放到map里
            keymap.put(key,object);
            return null;
        }
    });
}

/**
 * 省略一段代码
 */
//response等于bolts框架的Task.onSuccessTask或者Task.call的返回。
String key = String.valueOf(System.currentTimeMillis());
XposedHelpers.callMethod(response,"continueWith",Proxy(classLoader,key));
Thread.sleep(1000);
if(keymap.containsKey(key)){
    return JSON.parseObject(keymap.remove(key));
}

上述的一些问题可能不常见或者网上资料少分散的,xposed开发时遇到的问题其实很多,有些跟国产ROM相关,有些跟安卓版本相关,这些只能看命了。


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

最后于 2020-11-5 10:51 被AyonA333编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回