本文章仅仅用于技术交流与探讨,请尊重版权,如内容侵犯到您的权益,请及时与我联系 首先感谢Azalea的这篇Blog[Maimai 街机音游逆向!][1]里面的教程大多有效,但部分步骤现在已经有了更好的解决方案,又因为我在这条路上踩了太多坑,所以才有了这篇文章 ## 需要准备的工具 1. 你需要解密的app原包文件(废话 2. fsdecrypt.exe 3. calculate_iv.py 4. RStudioPortable.exe fsdecrypt.exe以及calculate_iv.py文件可前往[SEGA Decryption Guide][2]获取 # 出发咯~ ## 以下内容已过时,虽然能用但不是最方便的解法,往下翻翻有新方法 #### 前期步骤与SEGA Decryption Guide内的Readme文件一致,在此仅作大致说明 首先你需要一个包含了AES key的Bin文件,嗯?没有那种东西?[在这里或许能找到你想要的][3] 如果你不知道应该下载哪一个Bin文件的话,或许可以从app文件的名称找到线索 随后用16进制编辑器打开你的Bin文件(这里用Sublime Text演示) ![可以从这里用16进制打开][4] 随后换行写入`EB 52 90 4E 54 46 53 20 20 20 20 00 10 01 00 00`(如果你也使用Sublime Text的话,记得将大写字母转换为小写,并且使用英文输入法添加空格)并保存 在当前目录下打开cmd或者powershell窗口并执行下列指令 fsdecrypt .bin 0x200000 其中` .bin`应改为修改好的bin文件的文件名,``应改为app文件完整路径``应改为你想要的输出的文件的名字。 请注意应该去掉前后的‘<>‘再执行 运行完毕后,你的目录下应该会出现类似于out.vhd的文件。 - 随后转移到calculate_iv.py生成key 1 在这一步之前,请确保你的系统中有python环境。为了避免异常情况,你可以将该py文件删减至以下内容 ``` import os import glob def byte_xor(ba1, ba2): return bytes([_a ^ _b for _a, _b in zip(ba1, ba2)]) print("You must decrypt the opt first using fstools and the OPT.bin\nPlace everything in the same directory\nONLY HAVE ONE VHD IN THE DIRECTORY AT A TIME") cwd = os.getcwd() with open(str(cwd) + "/exfat.bin", "rb") as f: exfat_HEADER = f.read(-1) print("exFAT Header = " + str(exfat_HEADER.hex())) placeholder = glob.glob("*.vhd") vhd = str(placeholder[0]) with open(str(cwd) + "/" + vhd, "rb") as f: key1 = f.read(16) print("key1 =" + str(key1.hex())) ``` 随后运行(请保证py文件和vhd文件处于同一目录下) ``` python calculate_iv.py ``` 然后你应该会看见key1的内容,将他复制下来,并打开Bin文件,替换掉你刚才写入的内容,并再次运行fsdecrypt的指令 **至此,你将得到一个解密过后的VHD文件** ### 试试更快速的方法? 你也可以使用[unsega.exe](https://lemonno.xyz/usr/uploads/2025/08/unsega.exe)来进行快速解密 unsega的使用方法很简单,将app文件拖动到unsega.exe图标上就能完成整个解密过程。 随后再进行下面的流程即可 # 注意注意~ ###### 至此,你可以切换至RStudio进行后续操作,你也同样可以使用Azalea Blog内的内容提取文件,但同样你也可以使用本Blog的教程在Windows环境下完成操作。 打开RStudio,点击左上角驱动器,选择打开镜像,并找到你的vhd文件打开  但如果你和我一样,打开后发现是internal\_1.vhd的话,则需要你去找到当前版本的大版本app文件进行同样的解包操作。 比如,你当前操作的游戏版本为1.41,那么你就需要找到1.40的app文件,解密后得到internal\_0.vhd文件,随后再在RStudio里面打开internal\_1.vhd,并选择internal\_0.vhd文件打开,你就能得到完整的文件了。 ###### 至于游戏的脱壳操作,还请移步至[Maimai 街机音游逆向!](https://aza.moe/blog?post=2023-11-30-Maimai-Reversing)进行更深入的研究。 opt文件我还没有实际操作过,等有机会再更新吧 [1]: https://aza.moe/blog?post%EF%BC%9D2023-11-30-Maimai-Reversing&post=2023-11-30-Maimai-Reversing [2]: https://gitdab.com/SEGA/sega/src/branch/master/tools/Filesystem [3]: https://gitdab.com/SEGA/sega/src/branch/master/keys/AES128_Nu_ALLS [4]: https://lemonno.xyz/usr/uploads/2025/08/1816876877.png Loading... <p class="center" style="color:red">本文章仅仅用于技术交流与探讨,请尊重版权,如内容侵犯到您的权益,请及时与我联系</p> 首先感谢Azalea的这篇Blog[Maimai 街机音游逆向!][1]里面的教程大多有效,但部分步骤现在已经有了更好的解决方案,又因为我在这条路上踩了太多坑,所以才有了这篇文章 ## 需要准备的工具 1. 你需要解密的app原包文件(废话 2. fsdecrypt.exe 3. calculate_iv.py 4. RStudioPortable.exe fsdecrypt.exe以及calculate_iv.py文件可前往[SEGA Decryption Guide][2]获取 # 出发咯~ ## 以下内容已过时,虽然能用但不是最方便的解法,往下翻翻有新方法 #### 前期步骤与SEGA Decryption Guide内的Readme文件一致,在此仅作大致说明 首先你需要一个包含了AES key的Bin文件,嗯?没有那种东西?[在这里或许能找到你想要的][3] 如果你不知道应该下载哪一个Bin文件的话,或许可以从app文件的名称找到线索 随后用16进制编辑器打开你的Bin文件(这里用Sublime Text演示) ![可以从这里用16进制打开][4] 随后换行写入`EB 52 90 4E 54 46 53 20 20 20 20 00 10 01 00 00`(如果你也使用Sublime Text的话,记得将大写字母转换为小写,并且使用英文输入法添加空格)并保存 在当前目录下打开cmd或者powershell窗口并执行下列指令 fsdecrypt <PCB CODE>.bin 0x200000 <path/to/app> <out.vhd> 其中` <PCB CODE>.bin`应改为修改好的bin文件的文件名,`<path/to/app>`应改为app文件完整路径`<out.vhd>`应改为你想要的输出的文件的名字。 请注意应该去掉前后的‘<>‘再执行 运行完毕后,你的目录下应该会出现类似于out.vhd的文件。 - 随后转移到calculate_iv.py生成key 1 在这一步之前,请确保你的系统中有python环境。为了避免异常情况,你可以将该py文件删减至以下内容 ``` import os import glob def byte_xor(ba1, ba2): return bytes([_a ^ _b for _a, _b in zip(ba1, ba2)]) print("You must decrypt the opt first using fstools and the OPT.bin\nPlace everything in the same directory\nONLY HAVE ONE VHD IN THE DIRECTORY AT A TIME") cwd = os.getcwd() with open(str(cwd) + "/exfat.bin", "rb") as f: exfat_HEADER = f.read(-1) print("exFAT Header = " + str(exfat_HEADER.hex())) placeholder = glob.glob("*.vhd") vhd = str(placeholder[0]) with open(str(cwd) + "/" + vhd, "rb") as f: key1 = f.read(16) print("key1 =" + str(key1.hex())) ``` 随后运行(请保证py文件和vhd文件处于同一目录下) ``` python calculate_iv.py ``` 然后你应该会看见key1的内容,将他复制下来,并打开Bin文件,替换掉你刚才写入的内容,并再次运行fsdecrypt的指令 **至此,你将得到一个解密过后的VHD文件** ### 试试更快速的方法? 你也可以使用[unsega.exe](https://lemonno.xyz/usr/uploads/2025/08/unsega.exe)来进行快速解密 unsega的使用方法很简单,将app文件拖动到unsega.exe图标上就能完成整个解密过程。 随后再进行下面的流程即可 # 注意注意~ ###### 至此,你可以切换至RStudio进行后续操作,你也同样可以使用Azalea Blog内的内容提取文件,但同样你也可以使用本Blog的教程在Windows环境下完成操作。 打开RStudio,点击左上角驱动器,选择打开镜像,并找到你的vhd文件打开  但如果你和我一样,打开后发现是internal\_1.vhd的话,则需要你去找到当前版本的大版本app文件进行同样的解包操作。 比如,你当前操作的游戏版本为1.41,那么你就需要找到1.40的app文件,解密后得到internal\_0.vhd文件,随后再在RStudio里面打开internal\_1.vhd,并选择internal\_0.vhd文件打开,你就能得到完整的文件了。 ###### 至于游戏的脱壳操作,还请移步至[Maimai 街机音游逆向!](https://aza.moe/blog?post=2023-11-30-Maimai-Reversing)进行更深入的研究。 opt文件我还没有实际操作过,等有机会再更新吧 [1]: https://aza.moe/blog?post%EF%BC%9D2023-11-30-Maimai-Reversing&post=2023-11-30-Maimai-Reversing [2]: https://gitdab.com/SEGA/sega/src/branch/master/tools/Filesystem [3]: https://gitdab.com/SEGA/sega/src/branch/master/keys/AES128_Nu_ALLS [4]: https://lemonno.xyz/usr/uploads/2025/08/1816876877.png 最后修改:2025 年 08 月 24 日 © 允许规范转载 打赏 赞赏作者 赞 1 如果觉得我的文章对你有用,请随意赞赏