Apktool 源码-反编译

知道了Apktool 的基本用法Apktool 使用教程 - 简书,以及Apktool的全部参数配置Apktool 参数详解 - 简书之后,对于Apktool的用法,可以说已经基本搞定,不过源码的阅读也是比不可少的,懂得源码,能改会改,才是解决棘手问题的根本能力。

注意:本文使用的源码为github上拉取的最新代码,2.4.2版本,目前暂未发布。 -- 2020年3月18日

1、查看apktool.jar的入口类

    通过查看jar包的Manifest.MF文件,看到入口类为brut.apktool.Main

apktool.jar的Manifest文件

2、使用Android studio打开apktool的源码    

项目结构

3、找到入口类 brut.apktool.Main

    main函数主要做了以下事情,很简单,此处不详述。

    (1)设置系统属性 System.setProperty("java.awt.headless", "true");

            这里的system,系统指的是 JRE (runtime)system,不是指 OS。

    (2)new一个命令行解析器,后续进行命令行参数的解析

    (3)初始化配置类,包括各种配置,日志输出等级,是否处理资源文件等等

                分所属分别存储在 normalOptions;DecodeOptions;BuildOptions;等变量中

    (4)设置日志级别,初始化Logger,设置是否打印步骤日志

    (5)解析到底是反编译、重新打包还是安装framework等参数

4、反编译资源

    private static void cmdDecode(CommandLine cli)

    (1)创建核心类ApkDecoder,其构造方法中,new了一个Androlib类

    (2)解析反编译相关的配置,都设置到decoder中备用

解析配置

    (3)创建输出目录    

默认以apk名字作为目录名

    (4)调用反编译核心方法    

反编译核心方法

    (5)decod方法

            将--keep-broken-res配置值,存入AndrolibResources类中

            检查输出目录,输入文件是否OK,不OK抛出异常

            OK则创建输出目录

检查

            输出我们最常见到的一句log

版本信息等log

              之后就开始主要的反编译逻辑了。

        (6)处理资源

资源处理流程

    (7)具体的解析流程,网上各位大神分析的很到位。这里推荐一个,部分注释也是参考了这位的帖子内容!

        ApkTool项目解析resources.arsc详解 - 掘金

5、反编译源码

        (1)反编译最基础的classes.dex文件

反编译主dex

            (2)输出log,开始反编译dex

Baksmaling log

                        进入 SmaliDecoder 的 decode 方法。

                        最终执行Baksmali库的方法进行反编译

反编译代码

                        具体解析过程,后续我准备再写一篇关于 Baksmali 文章吧。

                        解析 dex 可以参考:Android逆向笔记 —— DEX 文件格式解析 - 掘金

                (3)处理多个dex,和解析一个dex一个道理,不再重复

处理多个dex

6、处理assets和libs

处理未经压缩文件

7、处理未知文件

处理未知文件

    未知文件指非apk固定文件的内容:

        "classes.dex", "AndroidManifest.xml", "resources.arsc", "res", "r", "R", "lib", "libs", "assets", "META-INF", "kotlin"

判断是否为未知文件内容

        将未知文件拷贝到 unknown 目录,并且记录下这些文件。

        记录不压缩的文件,读取文件压缩等级,当文件压缩等级为不压缩或者文件符合下列类型时,不进行压缩。

不压缩类型文件
记录不压缩的文件
记录不压缩文件

        处理原始文件,如果你配置了 -c, --copy-original ,则会将 AndroidManifest.xml 和 META-INF 拷贝到 original 目录下。如下图:

处理原始文件
original目录

8、生成 apktool.yml 文件

生成 apktool.yml 文件
apktool.ym 包含的内容

    apktool.yml 内容示例如下:

apktool.yml内容

        (1)putUsesFramework(meta); 记录使用的framework   ----  usesFramework配置项

        (2)putSdkInfo(meta); 记录sdkversion信息。 ---- sdkInfo配置项

        (3)putPackageInfo(meta);记录packageInfo。  ---- packageInfo配置项

        (4)putVersionInfo(meta); 记录包体versioncode,versionname   ---- versionInfo配置项

        (5)putSharedLibraryInfo(meta);记录是否是一个库。 ---- sharedLibrary配置项

        (6)putSparseResourcesInfo(meta); 这个暂时没去了解。---- sparseResources配置项

                    不过看注释,是与aapt2有关的东西,aapt1忽略这个。估计是aapt1和aapt2之间的处理差异,记录下来,方便重新打包时进行不同的处理。

sparseResources

        (7)putUnknownInfo(meta); 记录未知文件。 ---- unknownFiles配置项

        (8)putFileCompressionInfo(meta);记录文件压缩信息。 ---- doNotCompress配置项


8、小结

    粗浅的写了一些流程上的东西,目前只是总结了反编译过程。具体的一些细节,比如 resources.arsc 的解析过程,我也是参考网上大佬的帖子来进行一步步解析的,所以没有自己再去重复写,自己也肯定没有大佬们写的好。另外dex的反编译因为apktool也是直接使用的baksmali库来进行的,后续自己阅读的时候再另起帖子说说。

    下面一篇就还是写写重新打包就算完成任务啦。

附上apktool和baksmali的github地址

GitHub - iBotPeaches/Apktool: A tool for reverse engineering Android apk files

GitHub - JesusFreke/smali: smali/baksmali

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • https://www.cnblogs.com/ermu-learn/p/5913760.html 编译之前执行控...
    chasing_dream阅读 207评论 0 0
  • 《国王的演讲》是由英国著名电影导演汤姆·霍珀执导、科林·费斯与杰弗里·拉什主演的,曾经在第83届奥斯卡颁奖典...
    风兮勇者阅读 1,043评论 0 2
  • 一件小小内衣的故事 我一个80的宝妈,刚刚读书出来,准备好了简历去面试,每间厂的企业招聘人,“你有工作经验吗?在哪...
    AOAOAO姐阅读 197评论 0 0
  • 匆匆赶到车站,才发现把围巾忘在了闺蜜那里。看看表,离发车还有15分钟,赶回去拿无论如何是来不及了。虽...
    画楼西畔9039阅读 240评论 0 2