从 .APP 到可以运行的游戏

二胡 发布于 阅读:5901

image

从 .APP 到可以运行的游戏

上古先人对于掌握日本原神的启动方法 | Secret Home

解包操作

使用 unsega解包,然后用 osfmount,把unsega出来的vhd改名img扔到osf里面打开

关于解包key可以从:此处查阅

具体步骤:

使用管理员权限启动CMD命令行,然后将exe拖入执行,会提示需要参数

​image​

将你获取到的app文件位置填入

unsega.exe \<input_file1> [\<input_file2> ...] [--offset ]

例如 unsega.exe sdez1.50.app​

这时候就会执行自动解包操作

​image​

解包之后是vhd文件

​image​

修改后缀为img

​image​

第一次被osf读取时文件为 internal_0​

只需要提取出来再次用osf读取一次即可

读取出来的目录如下

​image​

这就是我们需要的文件了(现在知道为什么hdd不能放在E盘下了吧),现在只需要放入segatools就可以启动了

‍


法2

从 .APP 到可以运行的游戏 — 凌莞咕噜咕噜~

2024/10/26

前提

本文假设你已经拿到了 .app 格式的文件。你需要自己取得所需的资源,本文不会直接提供所需要的文件,也不会提供任何支持。阅读本文后的操作产生的任何问题,作者不承担任何责任

准备解密 App 所需文件

这个步骤和下面的一些步骤需要一些工具,可以在这里获取。请将这整个仓库的内容都下载下来

首先创建一个文件夹作为这次的工作区,放入你要解密的 .APP 文件,并且把刚才那个仓库里的 tools/Filesystem/fsdecrypt.exe​ 这个文件复制进去

然后,你需要找到你想解密的游戏的 AES Key。以 SDEZ_1.45.00_20240214060142_0.app​ 为例,在刚才那个仓库的 keys/AES128_Nu_ALLS​ 这个目录下,找到 SDEZ.bin​ 复制到文件夹里

解密 App 文件

在上一步创建的工作区目录里打开一个命令窗口,有一种简单的方式是点击地址栏然后输入 cmd​ 回车

然后使用下面的命令开始解密

fsdecrypt SDEZ.bin 0x200000 SDEZ_1.45.00_20240214060142_0.app out.vhd

这一步需要很长时间,这时候你可以看到有个 out.vhd​ 文件并且它的大小在增加。可以用过这个文件的大小来推断进度。可以通过十六进制编辑器打开看一下 out.vhd​,如果出现以下内容就代表解密的结果是正确的

image​

这个文件其实并不是一个微软 VHD 磁盘镜像,而是一个分区镜像。严格来说它应该是 .img​ 后缀的,只是很多教程里喜欢以 out.vhd​ 命名这个文件

提取 internal_0.vhd

因为它不是微软 VHD 镜像,所以正常双击是不能挂载它的。但是我们可以使用 ImDisk 挂载

image​

挂载之后打开新出现的盘符,把 internal_0.vhd​ 复制出来并解除挂载 out.vhd​。如果不复制出来的话是没法直接挂载的

​internal_0.vhd​ 是标准的 VHD 格式,所以我们可以直接双击挂载。然后把 Package 这个目录复制出来,里面是我们需要的游戏文件。游戏不可以放在 E 盘,否则会出现奇怪的问题。尽量放在 C 盘和 D 盘

千万不要手滑点到 game.bat,否则你的时间会变成日本时区并且 Y: 盘会被清空(如果有)

给 amdaemon.exe​ 脱壳

由于 Segatools 通过创建远程线程的方式 hook amdaemon.exe​,然而 amdaemon 加的 HyperTech Crackproof 壳会阻止这个行为,所以我们必须先给 amdaemon.exe​ 脱壳。

脱壳非常容易,只需要把 amdaemon.exe​ 复制到第一步下载的工具仓库的 tools\Crackproof\DecryptCrackproofExe64​ 这个文件夹里面(复制进去是必须的),并且把 amdaemon.exe​ 拖放到 DecryptCrackproofExe64.exe​ 的图标上(不是双击打开再拖入)

然后你会得到一个大约 10MB 的 amdaemon.unpack.exe​。把这个复制到游戏目录替换原先的 amdaemon.exe​

请注意,DecryptCrackproofExe64.exe​ 只能给 amdaemon.exe​ 脱壳,而游戏中加了壳的文件包括 Sinmai.exe​ Assembly-CSharp.dll​ Cake.dll​ amdaemon_api.dll​。其他的这些无法由这个程序脱壳,并且也不需要脱壳

准备 Segatools

Segatools 是一套开源的组件,用于 hook AMDaemon 提供基础的启动环境,它在这里提供源码。

正常的 Segatools 只包括 mai2hook.dll​ 和外围组件 inject.exe​ segatools.ini​ 和 start.bat​。但是很多人会把包含了 Sinmai_Data​ 下很多东西甚至包括了魔改并加了不需要的功能的 Assembly-CSharp.dll​ 的压缩包叫做 “Segatools”

Segatools 可以自己编译,非常简单。只需要在电脑上安装 Docker,下载仓库之后点击 docker-build.bat​ 并花费一点时间就可以自动完成编译并产生 mai2hook.dll​。如果不想自己编译,也可以去其他已有的可以运行的游戏中复制 inject.exe​ 和 mai2hook.dll​ 这两个文件

准备 odd.sys​

​odd.sys​ 是街机系统上用于辅助解密 HyperTech Crackproof 加壳的 exe 的内核模块。脱壳前面说的另外四个文件非常麻烦也没有必要,所以带壳运行是更高效的方法

首先下载并保存为 odd.sys​,放在某个文件夹里。然后在那个文件夹中打开一个管理员 cmd,输入以下命令

sc create odd binPath="%~dp0odd.sys" type=kernel
sc start odd

你也可以在 create 命令后面加一个 start=auto​ 来开机自启

如果发现 odd 在这之前就已经存在了并且已经在运行了就跳过这一步吧,可能你之前运行其他版本的时候已经安装了 odd

安装 MelonLoader

原版的游戏程序需要进行一些修补来实现在普通电脑上运行以及连接私服之类的操作。以前很多人的做法是将 Assembly-CSharp.dll​ 反编译,修改好再编译回去。这样的话可能会导致各种人有各种不同的 Assembly-CSharp.dll​ 引发兼容性问题,还容易导致代码混乱以及对于每个版本的游戏都得重复做相同的修改。

现代化一点的方式是通过独立的 Mod 来动态修改游戏。这样同一份 Mod 可以实现所有版本的游戏通用,并且安装容易,破坏性小

MelonLoader 是对于 Unity 游戏的 Mod 加载器。前往官方 GitHub Release 下载 MelonLoader.x64.zip,然后将 NOTICE.txt​ 以外的文件都解压到游戏目录下,MelonLoader 就安装好了

看起来 0.6.5 版本的 MelonLoader 不太工作,最好是用 0.6.4 版本的

安装 AquaMai

AquaMai 是开源的 Sinmai mod,它不仅实现了游戏启动所需要的修补还提供了很多有用的功能

AquaMai 编译好的版本可以通过 GitHub Actions 获取。这需要一个 GitHub 账号,否则无法下载附件。打开这个页面后点击右边第一个绿色的运行结果,然后在 Artifacts 中下载

image​

安装也非常简单,只需要在游戏目录中新建一个 Mods 文件夹,然后把 dll 复制进去就可以了

AquaMai 和 MelonLoader 的安装也可以通过 MaiChartManager 一键完成

创建配置文件

mai2.ini

首先我们需要创建一个 mai2.ini​ 文件。在绝大多数情况下,mai2.ini​ 中配置的内容都是游戏本体自带的。我们现在在这里需要配置的是让游戏忽略错误并且以开发模式运行。同时这里还可以开启歌曲全解和自定义一 PC 的歌曲数量

[AM]
Target=0
IgnoreError=1
DummyTouchPanel=1
DummyLED=1
DummyCodeCamera=1
DummyPhotoCamera=1

[Sound]
Sound8Ch=0

[Debug]
AllOpen=1
AllMap=0
AllCollection=0
AllChara=0
MaxTrack=3
Debug=1

[DebugVersion]
DebugMajorVersion=1
DebugMinorVersion=45
DebugReleaseVersion=00

其中 Target 是游戏是否以生产环境运行的开关。它控制比如说开了之后游戏会把 ErrorLog 之类的文件夹放在 Y: 盘里,但是关了之后这些文件就会被放在当前目录下

Dummy 开头的那些就是假如你没有对应的硬件就开启,会加载虚拟的

AllOpen 是开启歌曲全解

DebugVersion 可以设置游戏认为自己是的版本号

segatools.ini

新建一个 segatools.ini​,以下是一些固定的设置,比如说 vfs 指定保存数据的位置

[vfs]
amfs=amfs
option=options
appdata=appdata

[netenv]
enable=1

模拟 Aime 相关的设置,如果有实体读卡器,那么就把 enable 设置为 0。设为 1 的话在游戏中按 Enter 模拟刷卡,卡号读取的是 Device\aime.txt​。如果没有这个文件会自动生成一个

[aime]
enable=1
aimeGen=1

关于联网的设置,KeyChip 可在 AquaDX 注册账号后获取

[dns]
default=aquadx.hydev.org
[keychip]
id=你获取的 KeyChip

test 和 service 键我习惯映射成 9 和 8

[io4]
; 9
test=0x39
; 8
service=0x38

[button]
enable=1

gpio 设置用于确定当前机台是否作为服务端。一般来说会设为服务端,否则会卡在搜索服务器界面。这个选项也可以使用 AquaMai 的强制作为服务端来设置

[gpio]
dipsw1=1

AquaMai.toml

这个文件是 AquaMai Mod 的配置。在开始之前需要去这里获取一个最新的配置文件模板。原版没修改过的游戏程序要启动需要开启以下设置项

[Fix]
RemoveEncryption=true
ForceAsServer=true
ForceFreePlay=true

照理说可以直接只把以上内容写入 AquaMai.toml,不过 AquaMai 还提供了很多有用的功能,比如说单人模式。这些功能可以依据你的需要开启

​ForceFreePlay​ 也可以换成 ForcePaidPlay​,游戏中会锁定 24 个币

修改 AMDaemon 配置

AMDaemon 会读取三个 json 格式的配置,我们需要修改一些默认的设置来确保它们符合我们的需要。打开 config_common.json​,修改以下设置

找到 allnet_auth​,将 type​ 修改为 "1.0"​,因为私服使用的是 AuthV1

找到 allnet_accounting​,将 enable​ 改为 false​

找到 aime​,将 high_baudrate​ 改为 true​,如果你的配置中不是的话(例如 SDGA),因为大多数市面上的读卡器都是 115200 波特率的。同时可以把 firmware_path​ 数组清空,可以加快启动速度

创建 start.bat​

新建一个文本文件,命名为 start.bat​,写入以下内容

pushd %~dp0
start inject -d -k mai2hook.dll amdaemon.exe -f -c config_common.json config_server.json config_client.json
sinmai.exe
taskkill /f /im amdaemon.exe

在游戏目录里创建空的 Device​ 目录

启动游戏

点击 start.bat​ 就可以启动游戏了。游戏可能会卡在加载的最后一个界面,如下图

image​

这时候只要按一下 9 进入 test 模式,按 w​ 键选择游戏设置,将店内招募设置设为关。同时也可以在这里开启续关设置

image​

image​

设置完成后就可以正常进入游戏了

常见问题解答

怎么解包版本内小更新(internal_1.vhd)

internal_1.vhd 是差分 VHD 文件,这需要你有 internal_0.vhd

然后,你需要在电脑上安装 Hyper-V 功能,因为我们需要用到它的管理器来修复关联。打开管理器之后,在右侧点击编辑磁盘镜像

image​

浏览到 internal_1.vhd 的位置,选择修复关联,再浏览 internal_0.vhd 就可以了。完成之后可以点击 internal_1.vhd 直接挂载

如何解包 .opt 格式的包

opt 镜像用的是 tools\Filesystem​ 中的 fstool.exe​,keys\AES128_Nu_ALLS​ 中的 OPT.bin​

命令如下

fstool dec OPT.bin file.opt out.vhd

得到的是一个 exFAT 格式的原始镜像。提取其中的文件可以使用 PowerISO 来解压

那些不需要 odd.sys​ 的包是怎么做出来的

理论上将 Sinmai.exe​ Assembly-CSharp.dll​ Cake.dll​ amdaemon_api.dll​ 全部脱壳即可。但是这些文件脱壳都比较麻烦

​Assembly-CSharp.dll​ 是这里面脱壳最简单的也是最重要的,因为它是 C# 编写的,并且它包含游戏程序代码

Sinmai.exe 只是一个普通的 Unity Player,随便从什么游戏里面抠一个过来就可以直接用。但是未加壳的 Sinmai.exe 不能和加壳的这些 dll 一起使用

​Cake.dll​ 包含连接官方所需要的一些数据,我们完全不需要它。常见的做法是做一个空壳或者把相关引用从 Assembly-CSharp.dll​ 里全部剔除。空壳也是所有版本都通用的

然而 amdaemon_api.dll​ 包含和 amdaemon.exe​ 通信的接口,并且 amdaemon_api.dll​ AMDaemon.NET.dll​ 和 amdaemon.exe​ 这三个文件的版本是绑定的。它的脱壳非常麻烦,很少有人愿意做,并且也不能简单替换成旧版本脱好壳的。现在常见的做法是把 amdaemon_api.dll​ 和amdaemon.exe​ 换成老版本脱好的,然后反编译 AMDaemon.NET.dll​ 把新增的方法补上

如果有这个需求,可以尝试使用 这个(适用于 1.25 - 1.45)