蓝毒小天使天下第一!
本文拆包教程不限于明日方舟,在后面也会给出其他手游的拆包教程,例如少女前线,碧蓝航线等
最近一次更新于2019年8月7日
目录
拆包简介和使用工具:
首先拆包最简单的无非就是拆取游戏资源,例如游戏立绘,音频,视频等,再深层次一点有拆取游戏配置文件,apk反编译得到部分源码等
在本文,我们只介绍拆取游戏资源和对游戏资源的后期处理,但是这里的方法不能保证所有的手游立绘都能提取,不同游戏对立绘等游戏文件的处理不同,这里只提供几种思路 XD
可能需要用到的工具有 Unity Studio,装有 opencv 的python或C++,PhotoShop
其中 Unity Studio 是必要工具,可以用来提取市面上大部分手游的游戏资源
装有 opencv 的python或C++,PhotoShop 等可以对提取的游戏资源(立绘)进行处理,如果是要批量处理的话首推 C++ ,python 虽然方便但是太慢,PhotoShop 也可以进行批量处理,但是麻烦且慢
PS:如果有其他有同样功能的工具也可以,不限于上面的几个软件,点击蓝色可以进网盘下载,理论上用 python的 PIL库 更好,不过我直接用 opencv 了,导致最后生成的可执行文件比较大
提取资源的方法:
首先,如果要拆取立绘等文件,就需要对应用程序进行处理,最简单的有两种方式:
- 对下载的 apk 安装包 进行解压
方法如下,在电脑上下载对应游戏的apk安装包,把后缀 .apk 改为压缩包文件格式,如 .rar 等,利用解压软件对其进行解压得到解压文件夹 - 对已经安装在手机的游戏,寻找系统目录,找到其文件夹
以少女前线为例,通常在手机上安装的软件,会把资源文件等放在 Android 文件夹的 data 文件夹下,这个时候找到其对应的游戏文件夹即可,下图是 少女前线 的文件夹,明日方舟比较特殊,它将资源文件隐藏在了其他文件目录下,所以最好使用第一种方法
通常进入文件夹后按照顺序进入以下文件夹 files 文件夹—— AB 文件夹 ——Android 文件夹,会看到里面的游戏资源文件,如果你是按照第一个解压方法做的,也可以看到上面的文件路径,按照该顺序点进去就行,然后根据游戏的不同,不同的文件可能会被放在一起,也可能会被分类在不同文件夹中,这个时候只需要按照自己需要的进行复制提取到电脑上就好了,注意不要剪切,特别是用第二种方法的,千万别剪切
当然,到这里还没有结束,我们看到的资源文件并不是原来格式,而是以 ab后缀的文件 展示的,这个时候就需要 Unity Studio 来提取目标文件(当然不是所有手游都会用Unity,所以这个方法并不适用于所有手游,如果以后我遇到其他类型的再更新吧XD)
这里我们以明日方舟为例,如果你正确的找到了路径,那么你可以看到一个名为 charpack 的文件夹,其中储存了明日方舟的干员立绘文件
这个时候打开 Unity Studio ,用如下选项 Extract folder 批量解压提取ab文件,之后使用 load folder 加载处理后的文件
然后在 Asset List 中就可以看到提取的内容
资源的后续处理:
提取出来的图片大部分情况下是有瑕疵的,因为他们需要进一步处理才能得到原图
而对于其中提取的内容,我们通常需要关心很多文件
常规情况下(使用通道分离压缩图片的):我们需要找到一个是Type为Texture2D的原图,一个是Type为Texture2D或Sprite的透明度背景图,而且通常情况下,原图有一个文件名,对应透明度背景图文件名会在原图文件名后面加上alpha字样,我们通过处理这两个图才能得到最终的png图像文件,所以现在就将所有对应的图片文件从 Unity Studio 导出
还有一些情况,有些手游会对图片进行加密或者是做一些额外处理:这种情况我们就需要按照情况来分析哪些文件有用,哪些文件没用,例如碧蓝航线需要使用一张图片 + 一张obj 3D模型文件来还原原图
A. 通道分离图像的合成:
首先我们在前面提到过,如果我们能找到一个是Type为Texture2D的原图,一个是Type为Texture2D或Sprite的透明度背景图,那么就说明这个立绘需要进行通道分离图像的合成来得到原图
那么这个时候我们应该如何处理呢,首先 png 图像有4个通道,前三个是 RGB 颜色通道,第四个是透明度通道,实际上为了减少图片的大小,大部分游戏厂商都会先对图片进行 ETC 等压缩算法的处理,再将透明通道单独剥离出去,以达到最大程度的压缩,其中你会发现我们经手的立绘和在游戏中展示的一样,但仔细看会发现不够清晰,正是因为在打包成apk文件之前,游戏公司就已经先对图片进行了压缩处理,丧失了一部分信息,所以说并不是画师的原图,如果想提高清晰度,有两种方法,一种是找原画师或官方公布等途径得到原图,一种是利用图片优化软件对其进行清晰度优化
进入正题,如何处理我们得到文件?
1. 利用 PS 进行处理:
这里我们直接引用一下这位贴吧老哥的方法: 透明立绘简单合成方法,小白一键操作
方法很简单,但缺点是对大量处理文件十分无力,而且需要手工对文件顺序进行排序,也没法判断两个图片尺寸比,适合小量立绘的手工处理
效果图:
输出效果:
2. 利用python或C++进行处理:
这个方法适合大量处理,而且不用对图片进行分类,甚至你在 Untiy Studio上导出图片时,可以毫无顾忌的将图片一股脑导出来,让程序自己去找原图和透明度背景图
在这里我用到的工具是 opencv 库
以明日方舟为例: 可以发现它 Alpha 图像中 R 通道 的值代表原图片透明度,那么我只需要将这个图片矩阵的 R 通道 信息赋值给原图像的 透明度通道 即可,然后注意一下有些Alpha图像是原图像大小的 1/2 倍,需要放大 2 倍
其中放大方法调用的是 双立方插值算法 ,这个算法效果比较好
另外就是 PhotoShop 的默认放大算法也是这个算法
python代码: (本来想用C++的,但无奈python太方便了Orz,导致处理速度会慢很多)
# -*- coding: utf-8 -*-
import shutil
import time
import cv2
import os
def read_png(s):
img = cv2.imread(s, cv2.IMREAD_UNCHANGED)
return img
def save_png(s, img):
cv2.imwrite(s, img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
def exchange(img, x): #放大图像
w, h = img.shape[0:2]
tempimg = cv2.resize(i