SmaliInjector (对重度混淆过的apk处理得比dex2jar更好)

DEX转JAR与SMALI注入
本文介绍了一种利用enjarify将DEX转换为JAR的方法,此方法相较于dex2jar更为稳定可靠,特别是在处理重度混淆的APK时。此外,还详细介绍了如何直接在JAR文件中进行SMALI代码注入,避免了传统的从JAR到SMALI再回转的过程。
部署运行你感兴趣的模型镜像
说明:
===================================================================
1). dex 转 jar 用的 enjarify,比目前常用的 dex2jar(d2j) 要稳定可靠得多,尤其是在处理重度混淆过的apk时


2). 用于对apk进行代码修改,扫描目标apk中函数,并在指定函数的开头部分 添加 调用自定义静态函数的代码


3). 省略 jar 转 smali 再回转的步骤,转而使用 objectweb.asm(ow2) 直接对 jar 文件进行 smali 注入


4). dex2jar 的步骤使用的是 google 自家的 enjarify 工具,没使用老掉牙的、对部分混淆apk处理极不准确极不稳定的 dex2jar(d2j)


5). jar2dex 使用的是 android studio 自带的 dx.bat 工具,貌似 dex2jar(d2j) 在做jar回转的时候也是调用dx.jar


6). 手机无需 root




下载地址:

http://download.youkuaiyun.com/detail/jizhitp/9904209



public static int processJarFile(String fnOldjar, String fnNewjar) {
		int nFunctionProcess = 0;
        try {
            JarFile Oldjar = new JarFile(new File(fnOldjar));
            File Newjar = new File(fnNewjar);

            try (final JarOutputStream output = new JarOutputStream(new FileOutputStream(Newjar))) {
                Enumeration<JarEntry> enumeration = Oldjar.entries();
                while (enumeration.hasMoreElements()) {

                    //<editor-fold defaultstate="collapsed" desc="遍历jar文件中的所有.class文件">
                    JarEntry next = enumeration.nextElement();
                    if (next.getName().endsWith(".class")) {

                        ClassNode cn = new ClassNode(ASM5);
                        ClassReader cr = new ClassReader(Oldjar.getInputStream(next));
                        cr.accept(cn, 0);

                        //<editor-fold defaultstate="collapsed" desc="根据类名来判断当前类是否为需要注入smali的类">
                        if (cn.name.equals("com/test/u/t")) {
                            for (Object methodNodeObj : cn.methods) {
                                MethodNode methodNode = (MethodNode) methodNodeObj;

                                //<editor-fold defaultstate="collapsed" desc="根据函数名判断该函数是否需要注入">
                                if (methodNode.name.equals("a")) {
                                    //new MethodHelper(methodNode.access, cn.name, methodNode.name, methodNode.desc, (MethodVisitor) methodNode);
                                    String tmpInject_ClassName = SmaliInjector.pc.Injector.Inject_ClassName.replace(".", "/");
                                    String tmpInjectMethodName = SmaliInjector.pc.Injector.InjectMethodName;

                                    //<editor-fold defaultstate="collapsed" desc="根据函数的参数列表来判断是否为需要注入的函数">
                                    if (methodNode.desc.equals("([B[BLcom/test/pointers/PInt;Lcom/test/protocal/c/asb;)[B")) {
                                        System.out.println("\tfound: "+cn.name+"."+methodNode.name+methodNode.desc);
										nFunctionProcess++;

                                        InsnList injectCode = new InsnList();
                                        injectCode.add(new VarInsnNode(Opcodes.ALOAD, 1));
                                        injectCode.add(new MethodInsnNode(Opcodes.INVOKESTATIC, tmpInject_ClassName, tmpInjectMethodName, "([B)V", false));

                                        AbstractInsnNode firstIns = methodNode.instructions.get(0);//.getFirst();//
                                        methodNode.instructions.insertBefore(firstIns, injectCode);

                                    } else if (methodNode.desc.equals("(I[B[B)Z")) {
                                        System.out.println("\tfound: "+cn.name+"."+methodNode.name+methodNode.desc);
										nFunctionProcess++;

                                        InsnList injectCode = new InsnList();
                                        injectCode.add(new VarInsnNode(Opcodes.ALOAD, 3));
                                        injectCode.add(new MethodInsnNode(Opcodes.INVOKESTATIC, tmpInject_ClassName, tmpInjectMethodName, "([B)V", false));

                                        AbstractInsnNode firstIns = methodNode.instructions.get(0);//.getFirst();//
                                        methodNode.instructions.insertBefore(firstIns, injectCode);
                                    }
                                    //</editor-fold>

                                }
                                //</editor-fold>

                            } // end of methods loop

                        } // end of java class name filter
                        //</editor-fold>

                        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
                        cn.accept(cw);

                        output.putNextEntry(new JarEntry(cn.name.replaceAll("\\.", "/") + ".class"));
                        output.write(cw.toByteArray());
                        output.closeEntry();

                    } // end of if jarEntry == .class
                    //</editor-fold>

                } // end of .class loop
            }

            Oldjar.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
		
		return nFunctionProcess;
    }




您可能感兴趣的与本文相关的镜像

ComfyUI

ComfyUI

AI应用
ComfyUI

ComfyUI是一款易于上手的工作流设计工具,具有以下特点:基于工作流节点设计,可视化工作流搭建,快速切换工作流,对显存占用小,速度快,支持多种插件,如ADetailer、Controlnet和AnimateDIFF等

说明: =================================================================== 1). dexjar 用的 enjarify,比目前常用的 dex2jar(d2j) 要稳定可靠得多,尤其是在处理重度混淆过的apk2). 用于对apk进行代码修改,扫描目标apk中函数,并在指定函数的开头部分 添加 调用自定义静态函数的代码 3). 省略 jarsmali 再回转的步骤,转而使用 objectweb.asm(ow2) 直接对 jar 文件进行 smali 注入 4). dex2jar 的步骤使用的是 google 自家的 enjarify 工具,没使用老掉牙的、对部分混淆apk处理极不准确极不稳定的 dex2jar(d2j) 5). jar2dex 使用的是 android studio 自带的 dx.bat 工具,貌似 dex2jar(d2j) 在做jar回转的时候也是调用dx.jar 6). 手机无需 root 要求: =================================================================== 已安装 jdk1.7 或 jdk1.8 已安装 Android Studio 已安装 pypy3 或者 python,pypy3 下载地址:http://download.youkuaiyun.com/detail/jizhitp/9902691 步骤: =================================================================== 1). 使用 jeb、jadx、jd 等静态分析工具分析源apk,确定要注入代码的类及函数 2). 用记事本打开 main.bat,设置正确的路径,以及源apk文件名 3). 在当前文件夹空白处点一下,然后按 shift + 右击,选择 "在此处打开命令行窗口" 4). 编辑静态类源文件:SmaliInjector\android\StaticClass.java,这个类将会被包进目标apk中 5). 编辑注入器源文件:SmaliInjector\pc\Injector.java,这是注入器关键文件,作用是调用ow2.asm来对目标jar中特定类的特定函数进行代码注入 6). 运行 main.bat即可 错误处理: =================================================================== 1). 此工具默认使用pypy来运行py脚本,若想使用 python 请打开 google_enjarify\enjarify.bat 把 pypy 改成 python 2). 安装重包后的apk时,若出现 INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES 错误,请将手机中原有的应用卸载后再安装 3). android.jar 最好选用跟目标手机版本一致的,否则重包后的apk几乎100%闪退 4). 若在 jar 转加 dex 的过程中出现 java.lang.OutOfMemoryError: GC overhead limit exceeded 的错误,请调大 main.bat 中的 -Xmx 和 -Xss 其它: =================================================================== 1). pypy3 比 python 快蛮多,推荐使用 2). enjarify 有两种模式: 默认的模式,转换出来的代码阅读性比较好,但比较慢 --fast 快速模式 3). main.bat 内有两个便捷开关,赋值表示启用,参数留空表示开关不启用 Resign_Only 是否只做 重签名 的动作,可用于验证目标 apk 有没有做签名保护 SkipDex2jar 是否跳过 dexjar 的步骤,转换很耗时,第二次调用 main.bat 时可以选择跳过,能省蛮多时间
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值