安卓游戏发行-应届生安卓反编译初探

作者

大家好,我叫小嘉?;

本人20年毕业于广东工业大学,于2020年6月加入37手游安卓团队;

目前主要负责国内游戏发行安卓相关开发。

背景

最近在接触游戏包生成渠道包相关业务,其中涉及到一个安卓相关知识点《安卓Apk的反编译》,本人认为除了忙于日常业务外,还需要花点时间沉淀技术点(如:写写博客),帮助自己成长;

虽然目前自己初入职场很多不懂,但是相信一点点的积累到了后面会很有帮助。

最后希望这篇文章也可以对刚进职场和游戏发行行业的安卓同学有借鉴作用,一起交流,共同进步。

APK内容

apk 实际上是一个zip 文件,打开后的内容如下图所示:

【META-INF】

存放的是签名信息,用来保证apk包的完整性和系统的安全。里面包含了三个文件,MANIFEST.MF、CERT.SF、CERT.RSA

1)MANIFEST.MF:列出了apk的所有文件,以及这些文件内容所对应的base64-encoded SHA1 哈希值,具体如下:

Name: classes.dex


SHA1-Digest: l8Lc+gtdLvtxJ1K+kscUmWQGQ1E=

2)CERT.SF:列出了MANIFEST.MF这个文件中每条信息的hash值,具体如下:

Name: classes.dex


SHA1-Digest: ubmMiUS24rU/6K5JloMVG4vHKIU=

上面这条hash值ubmMiUS24rU/6K5JloMVG4vHKIU=对应的是MANIFEST.MF中下面这几行字符串的hash值

Name: classes.dex


SHA1-Digest: l8Lc+gtdLvtxJ1K+kscUmWQGQ1E=

3)CERT.RSA:包含了公钥和私钥签名后的一些信息

【res目录】

这个目录主要是存放资源的

1)animator:用于定义属性动画的 XML 文件

2)anim:定义渐变动画的 XML 文件。(属性动画也可以保存在此目录中,但是为了区分这两种类型,属性动画首选 animator/ 目录。)

3)color:用于定义颜色状态列表的 XML 文件。请参阅颜色状态列表资源
4)drawable:位图文件(.png、.9.png、.jpg、.gif)或编译为以下可绘制对象资源子类型的 XML

5)mipmap:适用于不同启动器图标密度的可绘制对象文件。

6)layout:用于定义用户界面布局的 XML 文件

7)menu:用于定义应用菜单(如选项菜单、上下文菜单或子菜单)的 XML 文件

8)raw:要以原始形式保存的任意文件

APK反编译后的内容
apktool 反编译apk 后的内容如下:

1)assets: 一些媒体相关资源,aapt 打包时没有进行压缩,也没有资源ID值。

2)META-INF:apk 包相关签名文件。

3)lib: so 文件相关。

4)res: apk 所会用到的一些资源文件。aapt 工具将 xml 文件进行压缩,节省空间,所以都是 二进制文件。

5)class_xxx.dex 文件:dalvik 虚拟机的可执行文件(java->class->dex)。

6)AndroidManifest.xml:清单文件,aapt 工具也将其压缩成了二进制文件。

7)resources.arsc:Resources 是通过 resources.arsc 把Resource的ID转化成资源文件的名称,然后交由AssetManager来加载的。而Resources.arsc这个文件是存放在APK包中的,他是由AAPT工具在打包过程中生成的,他本身是一个资源的索引表,里面维护者资源ID、Name、Path或者Value的对应关系,AssetManager通过这个索引表,就可以通过资源的ID找到这个资源对应的文件或者数据。将一个 apk 拖进 AS 之后,显示resources.arsc 内容如下:

8)其余文件夹:apk 会用到,但不是公共结构。

APK反编译相关流程

apktool 反编译针对不同的文件夹进行了不同的处理。下面是decode 的大致流程(描述的是一般大致流程):

下面将按图中标红步骤,根据apktool源码来进行讲解:

1)程序主要类入口:

开始反编译前会有一些参数的设置,如:d 代表反编译/ b 代表回编译等

2)解析resource.arsc:

调用顺序:setTargetSdkVersion-》getResTable-》loadMainPkg-》getResPackagesFromApk-》,最终是调用到 apktool 的 ARSCDecoder 来进行解析,并将 resources.arsc 存储在 mResTable 中。

3)解码 AndroidManifest.xml 文件:

调用顺序:decodeManifestWithResources –》decodeManifest –》decode

解码文件的同时此处会保存该 APK 的一些信息,比如:package,versionCode,versionName,minSdkVersion,targetSdkVersion。

4)解码 res 文件夹:

调用顺序:decodeResourcesFull –》decode — 》 fileDecoder.decode –》不同文件格式的 decode对于不同的文件格式:1 raw 文件,直接拷贝 2 .xml 文件,需要进行解码 3 .9patch ,需要进行解码。4 其余文件格式,直接复制。

5)生成 values 文件夹:

values 文件夹内容:

其中,这些文件内容是根据 resources.arsc 内容来进行生成。

调用顺序:pkg.listValuesFiles — 》mResSpecs.values() –》ARSCDecoder.readEntry() –》mPkg.addResSpec(spec)

对于不同类型的 xml 文件,生成方法也不一样。

调用顺序:AndrolibResources.generateValuesFile –》AndrolibResources. serializeToResValuesXml

public.xml 内容:

public.xml 是为了固定 id,因为apktool 在编译资源的时候会对资源ID ,资源ID 是随机编译的。所以需要用到一些固定值先固定好。而这里的id值是一个整型值,8个字节;由三部分组成的:

PackageId+TypeId+EntryId

PackageId:是包的Id值,Android中如果是第三方应用的话,这个值默认就是0x7F,系统应用的话就是0x01,具体我们可以后面看aapt源码得知,他占用两个字节。

TypeId:是资源的类型Id值,一般Android中有这几个类型:attr,drawable,layout,dimen,string,style等,而且这些类型的值是从1开始逐渐递增的,而且顺序不能改变,attr=0x01,drawable=0x02….他占用两个字节。

EntryId:是在具体的类型下资源实体的id值,从0开始,依次递增,他占用四个字节。

6)生成 smali 文件夹:

这里需要借助一个工具包dexlib,他是用来处理dex文件的,处理完dex文件之后,在交给baksmali这个工具类生成smali文件即可。

7)生成 libs,lib,assets 文件夹:

对于这类文件直接进行复制,不需要对这些资源进行改动

8)生成 unknown 文件夹

未知文件指非apk固定文件的内容:”classes.dex”, “AndroidManifest.xml”, “resources.arsc”, “res”, “r”, “R”, “lib”, “libs”, “assets”, “META-INF”, “kotlin”

此处会对未知格式文件放在 unknown 文件夹下,并记录文件路径。

9)生成Original 文件夹:

将 AndroidManifest.xml 和 META-INF 放在该目录下。

10)记录不压缩文件

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

11)生成 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配置

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

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

结束语

过程中有问题或者需要交流的同学,可以扫描二维码加好友,然后进群进行问题和技术的交流等;

企业微信截图_5d79a123-2e31-42cc-b03f-9312b8b99df3.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYdKTg7X' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片