首页
论坛
专栏
课程

[原创]xposed新思路,伪代码都见鬼去吧

2019-4-4 14:06 8020

[原创]xposed新思路,伪代码都见鬼去吧

2019-4-4 14:06
8020
最近研究了两天xposed,发现真实个神器。本人对java略懂皮毛,对so一窍不通。总结出几个新思路,发出来抛砖引玉。
直接通过xposed拦截一个类加载器的所有类的所有方法,上代码。
    /**
     * HOOK一个类加载器中的所有类的所有方法
     *
     * @param classLoader 类加载器
     */
    private void hookClassLoaderAnyMethod(ClassLoader classLoader) throws Exception {
        Object[] dexElements = (Object[]) getFieldValue(classLoader, "pathList", "dexElements");
        // 获取到dex文件
        DexFile dexFile = (DexFile) getFieldValue(dexElements[0], "dexFile");
        // 找到所有的类
        Enumeration<String> enumeration = dexFile.entries();
        while (enumeration.hasMoreElements()) {
            String clsName = enumeration.nextElement();
            Log.i(TAG, "hook ClassLoader By Class Name: " + clsName);
            Class<?> cls = XposedHelpers.findClass(clsName, classLoader);
            Method[] methods = cls.getDeclaredMethods();
            for (Method method : methods) {
                int paramSize = method.getParameterTypes().length;
                Object[] objs = new Object[paramSize + 1];
                System.arraycopy(method.getParameterTypes(), 0, objs, 0, paramSize);
                // 最后一个参数设置为回调
                objs[paramSize] = new XC_MethodHook() {
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        StringBuilder builder = new StringBuilder();
                        builder.append("call method:").append(method.toString());
                        // 记录参数
                        if (param.args != null && param.args.length > 0) {
                            for (int i = 0; i < param.args.length; i++) {
                                builder.append('\n');
                                builder.append("arg").append(i).append(":");
                                builder.append(param.args[i]);
                            }
                        }
                        // 记录结果
                        builder.append("\n").append("result:").append(param.getResult());
                        Log.i(TAG, builder.toString());
                    }
                };
                XposedHelpers.findAndHookMethod(cls, method.getName(), objs);
            }
        }
    }

getFieldValue方法,就是通过反射递归获取对象属性值
    private Object getFieldValue(Object obj, String... fieldNames) throws Exception {
        if (obj == null) {
            return null;
        }
        for (String fieldName : fieldNames) {
            obj = getFieldValue(obj, fieldName);
        }
        return obj;
    }

    /**
     * 获取对象中的属性
     *
     * @param obj       对象
     * @param fieldName 属性名称
     * @return 属性值
     * @throws Exception 异常信息
     */
    private Object getFieldValue(Object obj, String fieldName) throws Exception {
        Field field = getField(obj.getClass(), fieldName);
        if (field == null) {
            return null;
        }
        // 设置允许访问
        field.setAccessible(true);
        return field.get(obj);
    }

    /**
     * 递归获取类的所有属性,直到找到指定属性为止
     *
     * @param cls       类
     * @param fieldName 属性名
     * @return 属性
     */
    private Field getField(Class<?> cls, String fieldName) {
        Field[] fields = cls.getDeclaredFields();
        if (fields != null && fields.length > 0) {
            for (Field field : fields) {
                if (field.getName().equals(fieldName)) {
                    return field;
                }
            }
        }
        Class<?> supperCls = cls.getSuperclass();
        if (!supperCls.equals(Object.class)) {
            return getField(supperCls, fieldName);
        }
        return null;
    }

在此我们只需要一个东西,就是类加载器对象,这个只要hook目标app的启动类就可以拿到。

启动app这时我们的控制台会哗哗哗的打印方法调用日志
作用一:
比如说我们要hook一个按钮,等app进入到某个界面,把日志清理掉,点一下那个按钮,看下那些个方法被调用了。
作用二:
比如说我们要找一个加密方法或解密方法,直接看日志,那个方法是明文进去密文出来或者哪个方法是密文进去明文出来的。
思路一:
利用ThreadLocal加入一个count计数器,查看任意线程的方法执行顺序。(没实践过,猜得,可能行不通)
思路二:
对所有类的方法被调用次数做统计,将从没被调用过的类直接排除,对代码量大的app分析有帮助。
思路三:
将该代码接入控制端,通过白名单、黑名单机制来打印日志。减少日志输出量。
思路四:
将代码接入控制端,直接动态篡改方法参数,方法返回值,免改代码,免xposed重启。
思路五:
想不到了,剩下的交给你们啦。

希望懂so的大牛研究出类似的东西,so我完全看不懂。


看雪线上公开课第01期《安全编码之SQL注入》,周日下午14:00,提前报名免费参与!

最后于 2019-4-4 16:01 被菜鸟学术编辑 ,原因:
最新回复 (15)
芃杉 2019-4-4 18:58
2
0
mark
xmhwws 2019-4-5 12:40
3
0
这好像就是Fdex的思路啊,但现在对于加壳的apk基本无效了(乐固和360除外)
supperlitt 2019-4-8 09:19
4
0
方法很好,谢谢分享
roysue 3 2019-4-9 17:49
5
0
谢谢分享
你瞒我瞒 2019-4-19 14:34
6
0
非常感谢,
miyuecao 2019-4-22 11:42
7
0
很赞的思路
brokenC 2019-4-22 13:58
8
0
什么新思路,秦朝的东西了
coolsnake 2019-4-26 12:33
9
0
谢谢,我需要这个东东。
shuair 2 2019-5-2 22:01
10
0
不错,SO不需要。大部分直接找调用函数就可以了。
I3I87477774 2019-5-4 12:15
11
0
谢谢老大分享
Monkeylord 2019-5-6 15:03
12
0
不算新的做法,你这个代码会碰到OOM
不如试试这个 https://github.com/monkeylord/XServer
小童net 2019-5-27 02:14
13
0
mark
小白abc 2019-8-25 10:30
14
0
大型app会导致app无法打开的
荧光之夏 2019-9-5 17:12
15
0
大佬好 我刚使用了这个工具 感觉非常牛逼 想问一个问题

native方法需要context的类  该如何调用呢
笑林小子 2019-9-5 19:40
16
0
早有了,都玩烂了
游客
登录 | 注册 方可回帖
返回