在手机/模拟器中用ZArchiver打包Assets文件然后导出进行解包并不是一种高效的做法,另一个思路是直接从服务器获取增量更新的列表然后下载。

通过HttpCanary在游戏更新时抓包

GET https://line3-patch-blhx.bilibiligame.net/android/resource/***,这部分似乎是assets的下载,下载后导入AssetsStudio查看后证实这一点。往前可以看到GET https://line3-patch-blhx.bilibiligame.net/android/hash/***,打开看看raw。

看起来这部分是从服务器请求hash文件。hash文件包括的内容是filename,size,md5,而前面的下载过程中https://line3-patch-blhx.bilibiligame.net/android/resource/******部分也就是文件的md5做的hash。不过这个hash文件包含的是这个版本的客户端的所有资源的hash,不能直接获取增量部分。好在com.bilibili.azurlane/files中有hashes-***.csv(不记得是哪个版本更新后出现的,印象中两三年前的时候是没有的),那么只要比较两侧的区别就能拿到增量了。不过实际上,还要从apk中补全一部分。

那么hash文件的请求参数怎么来的呢,再往前看可以看到一个TCP报文

可以看到游戏向203.107.54.123:80发送了000a002a3000000837120130,然后收到一段报文。

b'\x01\xaf\x00*1\x00\x00\n\x0f118.178.152.242\x10P\x1aPhttps://pkgdl.biligame.net/games/blhx_7.1.1_20230610_1_20230616_031339_073b2.apk" $azhash$7$1$266$4bc0dbd043097096"\x1c$cvhash$701$7f526608257a7b81"\x1d$l2dhash$619$ac3a7c9a7f40ea77"\x1c$pichash$46$097e60419734291d"\x1c$bgmhash$36$ea9de9ee37d80caf""$paintinghash$150$d5aa16d792db3d39"\x1e$mangahash$44$b0f7f1aa9be9177d"\x1f$cipherhash$12$e118ea269b44292f"\x06dTag-1**line1-bak-login-bili-blhx.bilibiligame.net0\x90?8\x00@\xa8\xa7\xef\xab\x06H\x80\x96\xea\xfd\x05'

第一段是最新的apk的链接,后面就是hashfile的请求参数,最后一段是游戏的登陆验证的请求url。

到这里思路就很明确了,先从com.bilibili.azurlane/files和apk中拉取hashes.csv,然后从服务器获取新的hashfile,对比差异得到增量文件,然后一一从服务器请求。

这里是Github链接,后续可能会把整个解包流程也整合进去。