• Android移动安全攻防实战 ApkTool工具源码分析


    1.ApkTool的是由java写的,在之前的MobSF中也有使用到。可以反编译Apk,拿到 resource、dex、manifest、xml 等文件。也可以获得smali文件。
    2. 在apktool-cli/src/main/java/brut/apktool/Main 文件下有Main函数,也就是ApkTool的Main函数。
    在这里插入图片描述
    3. 然后就是检查输入的参数了,比如d就是解码,跟进d

    1. 跟进d之后是,创建了一个ApkDecoder,后面就是由这个ApkDecoder来解码了。
      在这里插入图片描述
    2. 然后就是在查看有没有其他的参数,然后就开始解码。
      跟进decode
            decoder.decode();
    
    • 1
    1. ApkDecoder位于
      apktool-lib/src/main/java/brut/androlib/ApkDecoder这个地方
      查看Apk是否有问题然后创建文件夹
      在这里插入图片描述
    2. 然后就开始解析了如果有resources文件,则对应自己的输入安排解码的方式。全部接吗或者原始解码。而且解码MainFest的方法也不一样。
     if (hasResources()) {
                    switch (mDecodeResources) {
                        case DECODE_RESOURCES_NONE:
                            mAndrolib.decodeResourcesRaw(mApkFile, outDir);
                            if (mForceDecodeManifest == FORCE_DECODE_MANIFEST_FULL) {
                                // done after raw decoding of resources because copyToDir overwrites dest files
                                if (hasManifest()) {
                                    mAndrolib.decodeManifestWithResources(mApkFile, outDir, getResTable());
                                }
                            }
                            break;
                        case DECODE_RESOURCES_FULL:
                            if (hasManifest()) {
                                mAndrolib.decodeManifestWi+thResources(mApkFile, outDir, getResTable());
                            }
                            mAndrolib.decodeResourcesFull(mApkFile, outDir, getResTable());
                            break;
                    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    resources.arsc是什么
    8. 如果全部解码的话就是

    public void decodeManifestWithResources(ResTable resTable, ExtFile apkFile, File outDir)
                throws AndrolibException {
    
            Duo<ResFileDecoder, AXmlResourceParser> duo = getManifestFileDecoder(true);
            ResFileDecoder fileDecoder = duo.m1;
            ResAttrDecoder attrDecoder = duo.m2.getAttrDecoder();
    
            attrDecoder.setCurrentPackage(resTable.listMainPackages().iterator().next());
    
            Directory inApk, in = null, out;
            try {
                inApk = apkFile.getDirectory();
                out = new FileDirectory(outDir);
                LOGGER.info("Decoding AndroidManifest.xml with resources...");
    
                fileDecoder.decodeManifest(inApk, "AndroidManifest.xml", out, "AndroidManifest.xml");
    
                // Remove versionName / versionCode (aapt API 16)
                if (!resTable.getAnalysisMode()) {
    
                    // check for a mismatch between resources.arsc package and the package listed in AndroidManifest
                    // also remove the android::versionCode / versionName from manifest for rebuild
                    // this is a required change to prevent aapt warning about conflicting versions
                    // it will be passed as a parameter to aapt like "--min-sdk-version" via apktool.yml
                    adjustPackageManifest(resTable, outDir.getAbsolutePath() + File.separator + "AndroidManifest.xml");
    
                    ResXmlPatcher.removeManifestVersions(new File(
                            outDir.getAbsolutePath() + File.separator + "AndroidManifest.xml"));
    
                    mPackageId = String.valueOf(resTable.getPackageId());
                }
            } catch (DirectoryException ex) {
                throw new AndrolibException(ex);
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    解码resources文件

      public void decode(ResTable resTable, ExtFile apkFile, File outDir)
                throws AndrolibException {
            Duo<ResFileDecoder, AXmlResourceParser> duo = getResFileDecoder();
            ResFileDecoder fileDecoder = duo.m1;
            ResAttrDecoder attrDecoder = duo.m2.getAttrDecoder();
    
            attrDecoder.setCurrentPackage(resTable.listMainPackages().iterator().next());
            Directory inApk, in = null, out;
    
            try {
                out = new FileDirectory(outDir);
    
                inApk = apkFile.getDirectory();
                out = out.createDir("res");
                if (inApk.containsDir("res")) {
                    in = inApk.getDir("res");
                }
                if (in == null && inApk.containsDir("r")) {
                    in = inApk.getDir("r");
                }
                if (in == null && inApk.containsDir("R")) {
                    in = inApk.getDir("R");
                }
            } catch (DirectoryException ex) {
                throw new AndrolibException(ex);
            }
    
            ExtMXSerializer xmlSerializer = getResXmlSerializer();
            for (ResPackage pkg : resTable.listMainPackages()) {
                attrDecoder.setCurrentPackage(pkg);
    
                LOGGER.info("Decoding file-resources...");
                for (ResResource res : pkg.listFiles()) {
                    fileDecoder.decode(res, in, out);
                }
    
                LOGGER.info("Decoding values */* XMLs...");
                for (ResValuesFile valuesFile : pkg.listValuesFiles()) {
                    generateValuesFile(valuesFile, out, xmlSerializer);
                }
                generatePublicXml(pkg, out, xmlSerializer);
            }
    
            AndrolibException decodeError = duo.m2.getFirstError();
            if (decodeError != null) {
                throw decodeError;
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    接下来是解析class.dex文件
    如果只有一个就解析一个,如果有很多就放到List里,一个个解析
    在这里插入图片描述
    class.dex
    之后解析一些其他文件,就可以了。

  • 相关阅读:
    【Echarts】自定义提示框tooltip样式,实现点击路由跳转
    LeetCode 462. 最小操作次数使数组元素相等 II【贪心,排序或快速选择】中等
    初识HashMap
    【华为机试真题 JAVA】勾股数元组-100
    汽车电子——产品标准规范汇总和梳理(车载网络)
    一张图了解JVM八大原子操作
    CSS动画实现节流
    『现学现忘』Docker基础 — 36、CMD指令和ENTRYPOINT指令的区别
    16-自动化测试——selenium介绍
    Spring系列文章:Spring集成Log4j2⽇志框架、整合JUnit
  • 原文地址:https://blog.csdn.net/v_3483608762/article/details/126725939