Xposed快速hook关键点

0x01 导读java

  工做中,经常须要针对各类app进行快速代码定位,找到代码修改和调试各类功能,就不得不面对xposed来进行一系列快速定位关键代码的问题了。那么问题来了,如何快速找到代码呢?shell

这里值这针对代码在java层的进行分析,在so中的,目前做者是无能为力的。app

0x02 众所周知ide

  咱们的通常作法就是经过界面定位到具体的Activity ,执行adb 命令 “adb shell dumpsys activity | findstr "mFocusedActivity"”工具

就能够快速找到咱们当前须要hook页面的Activity功能块,而后经过,XposedHelpers的测试

  findAndHookMethod方法来,监控方法。少许的工做没什么,可是若是代码量不少,很难看,就比较麻烦了。 因此这里介绍一种做者目前使用的,自仍未快速的方式。url

0x03 推荐使用spa

  一、安装apk后,能够获得app使用的dex文件。插件

  二、而后解包dex文件获得jar文件。调试

  三、经过xposed读取jar中的全部类,

  四、而后hook,而后读取全部方法hook.

  五、而后经过关键字,匹配参数,匹配返回值,快速获得操做日志。

  注意:若是是多个dex,同样是能够的,多个jar。解压而后覆盖保存到一个里面,而后打包成jar就能够,jar就使用zip打包工具就能够,修改后缀就ok.,

dex文件通常均可以经过apk解压获得,而后用apktool工具获得jar文件,针对某些apk没法apktool解包的能够添加-r等操做,不处理资源文件就OK.

  懒加载plugin如何操做呢? 找到不类呢?有一种状况,某些dex是专门存放插件,插件是进入到某些页面才会进行加载的,经过懒hook,进入某某页面,而后再进行hook操做,或者hook文件操做便可。

部分参考代码:

public static void hook_byJar(final XC_LoadPackage.LoadPackageParam loadPackageParam, String jarFile) throws Exception {
        try {
            //经过将给定路径名字符串转换为抽象路径名来建立一个新File实例
            File f = new File(jarFile);
            URL url1 = f.toURI().toURL();
            URLClassLoader myClassLoader = new URLClassLoader(new URL[]{url1}, Thread.currentThread().getContextClassLoader());

            //经过jarFile和JarEntry获得全部的类
            JarFile jar = new JarFile(jarFile);
            //返回zip文件条目的枚举
            Enumeration<JarEntry> enumFiles = jar.entries();
            JarEntry entry;

            //测试此枚举是否包含更多的元素
            while (enumFiles.hasMoreElements()) {
                entry = (JarEntry) enumFiles.nextElement();
                if (entry.getName().indexOf("META-INF") < 0) {
                    String classFullName = entry.getName();
                    if (classFullName.indexOf(".class") < 0) {
                                classFullName = classFullName.substring(0, classFullName.length() - 1);
                            } else {
                                Map<String, Object> hashMap = new HashMap<String, Object>();
                                
                                // 这里经过包名对部分类进行过滤,方式因为类不存在引发的错误。
                                hashMap.put("com/test/test/test/", new ArrayList<String>());
                                boolean isOkClass = false;
                                for (Map.Entry<String, Object> m : hashMap.entrySet()) {
                                    String name = m.getKey();
                                    ArrayList<String> list = (ArrayList<String>) m.getValue();
                                    if (classFullName.startsWith(name)) {
                                        isOkClass = true;
                                        for (String str : list) {
                                            if (classFullName.startsWith(str)) {
                                                isOkClass = false;
                                            }
                                        }

                                        break;
                                    }
                                }

                                if (isOkClass) {
                                    //去掉后缀.class
                                    String className = classFullName.substring(0, classFullName.length() - 6).replace("/", ".");
                                    // log(classFullName);
                                    try {
                                        final Class<?> myclass = myClassLoader.loadClass(className);
                                        for (final Method method : myclass.getDeclaredMethods()) {
                                            if (!Modifier.isAbstract(method.getModifiers())) {
                                                XposedBridge.hookMethod(method, new XC_MethodHook() {
                                                    @Override
                                                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                                                        String before_className = myclass.getName();
                                                        String methodName = param.method.getName();

                                                        super.beforeHookedMethod(param);
                                                    }

                                                    @Override
                                                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                                                        String before_className = myclass.getName();
                                                        String methodName = param.method.getName();
                                                        
                                                        super.afterHookedMethod(param);
                                                    }
                                                });
                                            }
                                        }
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                }
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
View Code 读取jarhook方法和类

0x04 其余方式

  一、针对app使用的开源库进行了解而后方便hook注关键代码,由于开源代码都是开源的,不须要看app解包的混淆,羞涩的代码。

  二、针对app做者,写入Log的内容进行hook,由于发布的app通常都是把其中的一个true或者false进行注释掉了,方法调用日志自己没有注释掉,因此能够针对写入的日志的地方进行处理。

相关文章
相关标签/搜索