前言
勇敢的程序猿,总结日常开发中反编译使用场景时的问题,大概会分3个阶段来进行总结:
1、apk文件结构;
2、apktool工具使用及部分关键原理;
3、注入插件回编;
延伸技术点介绍apk编译相关及使用到的SDK内的工具包简介,侧重点以问题为切入点总结相关,不会涉及太深的内核知识,如是逆向大神或者需要了解较深的技术点请绕过,希望此系列在自己总结的同时,会对一部分开发者有帮助。
一、apk文件是什么,结构是怎样的?
(运营及技术经理会关注)
使用AS查看一个常规的apk文件,如下图所示:
APK文件目录说明:
> lib cpu类型的so文件
> classesx.dex 可执行文件
> res 资源文件目录
> assets 不会AAPT的资源文件目录
> META-INF 签名摘要信息
> kt\okhttp3 其他文件:常见okhttp、kt、af等三方
> AndroidManifest.xml 清单文件
跳出开发者视野,可以把apk文件作为zip包进行解压查看,会看到如上一样的目录结构;常规确认需求则asset目录查看对应配置的清单文件及其他类型文件内容即可。
二、如何注入自己的插件?
(一般为团队内协同开发需要了解)
如需要注入插件资源或者查看AndroidManifest中的相关配置(meta-data,activity等),就需要使用apktool工具,具体原理后续讲解;那么一起来看下apktool工具执行后的目录:
apktool d /xxx/xxx.apk -only-main-classes
常规的反编命令,具体option的定义及-only-main-classes等其他操作符可以后续一起总结;
反编后目录如下:
apk文件反编后目录说明:
> lib cpu类型的so文件
> smail dex执行文件反编后的smail文件
> res 资源文件目录
> assets 不会AAPT的资源文件目录
> original 签名摘要信息
> unknown 其他文件:对应apk中的kt\okhttp3
> AndroidManifest.xml 清单文件
> apktool.yml 工具清单文件:version、unknown等配置
经过对比apk文件结构目录与反编后的结构目录,发现基本类似,除了可执行文件dex转smail, 其他目录基本保持一致;那么注入插件就可以直接把插件的源码构建为dex,然后转smail后放置到上述smail中即可,或者修改清单文件参数等等操作,即可达到插件注入的效果,当然中间会存在资源文件,R文件等生成的,后续分析apktool工具原理时会一一说明。
注意:apktool.yml中的unknownFiles对应unknown目录下文件配置,如未配置,回编时,apktool会自动过滤不会再进入apk文件中。
三、注入后如何再次生成apk文件?
使用apktool工具命令即可回编为正常的apk文件:
apktool b /xxx/xxx
回编成功后,跟目录会多出一个build目录和dist目录,其中回编后的apk就在dist目录下,重新签名后即可安装测试了\
到这里反编中apk文件结构就结束了,后面会以apktool工具的option切入进行关键节点的原理分析,感兴趣的小伙伴可以查看后续文章:dex可执行文件是如何生成smail文件的。