游戏快关服了,希望有大佬来解一下包
游戏下载:https://apkpure.com/jp/alice-fiction-puzzle-rpg/com.alicefiction
样本:链接:https://pan.baidu.com/s/1wPI3udjounKHU42ht2SC3g
提取码:c9r6
没记错的话是xor
只是提示:IKA9nt魔改版本
y9JUY4yttVeCBvZVdXsRMDLuL8H7vNyh
其一
import requests
import json
import os
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Cipher import AES
from concurrent.futures import ThreadPoolExecutor, as_completed
def aes_decrypt_cbc(key, iv, input):
aes = AES.new(key, AES.MODE_CBC, iv)
decrypted = aes.decrypt(input)
padding_len = decrypted[-1]
output = decrypted[:-padding_len]
return output
def get_keyandiv(password, salt):
return PBKDF2(password, salt, 32+16, count=2000)
def download_and_decrypt(url, key, iv, output_dir):
response = requests.get(url)
decrypted_data = aes_decrypt_cbc(key, iv, response.content)
file_name = os.path.join(output_dir, os.path.basename(url))
with open(file_name, 'wb') as f:
f.write(decrypted_data)
print(f"下载并解密: {file_name}")
def download_and_decrypt_multithreaded(file_info, key, iv, output_dir):
file_url = f"https://data.alice-fiction.com/{file_info['url']}"
download_and_decrypt(file_url, key, iv, output_dir)
def main():
url = "https://data.alice-fiction.com/manifest/zh_TW/5b7a5d01cd37b1fbc1a8ce3b78019e3a/manifest.json"
password = "xC3bPrzXVZLqrgzD"
salt = "eGXSHZGTnpQmmueyzn5D2zDn2pFngTN9"
keyiv = get_keyandiv(password, salt)
key, iv = keyiv[:32], keyiv[32:]
response = requests.get(url)
decrypted_data = aes_decrypt_cbc(key, iv, response.content)
decrypted_str = decrypted_data.decode('utf-8')
result = json.loads(decrypted_str)
with open('manifest.json', 'w') as f:
json.dump(result, f, indent=4)
master_file_list = result.get("master_file_list", [])
output_dir = "MasterFiles"
os.makedirs(output_dir, exist_ok=True)
with ThreadPoolExecutor(max_workers=16) as executor:
futures = [executor.submit(download_and_decrypt_multithreaded, file_info, key, iv, output_dir)
for file_info in master_file_list]
for future in as_completed(futures):
future.result()
if __name__ == "__main__":
main()
解密算法,我也不知道过时没
const assetKey = "y9JUY4yttVeCBvZVdXsRMDLuL8H7vNyh"
func decryptAsset(data []byte, salt string, maxLength int) []byte {
key := pbkdf1(assetKey, salt)
block, err := aes.NewCipher(key)
panicOnErr(err)
blockSize := 16
nonce := make([]byte, 16)
blockNumber := uint64(1)
keyBuffer := make([]byte, 16)
output := make([]byte, len(data))
if maxLength == 0 {
maxLength = len(data)
}
for i := 0; i < len(data) && i < maxLength; i+=16 {
if i % blockSize == 0 {
binary.LittleEndian.PutUint64(nonce, blockNumber)
block.Encrypt(keyBuffer, nonce)
blockNumber++
}
for keyPos := 0; keyPos < blockSize && i+keyPos < len(data) && i+keyPos < maxLength; keyPos++ {
output[i+keyPos] = data[i+keyPos] ^ keyBuffer[keyPos]
}
}
return output
}
我该如何运行第二段代码,第一段代码下载了MasterFiles内的json。
我也是,谢谢关心
非常感谢上面几位大佬的热心回复,只可惜解包小白实在是愚笨,自己捣鼓了好久也不知道该如何使用密钥和解密代码,只能再次来恳请大佬们,希望大佬们不计前嫌,能给出更为详细的解包过程,圆小白一个心愿,这游戏9月30日就关服了,想在最后时刻再抢救一下QwQ
第二段代码不是python啊,好像是go
也只能等那些大佬們回復了
個人實測用不了,該代碼缺乏salt值生成部分
“檔名,檔名md5/sha1/sha256/前16位值都試過,但都無法正常解密”
看在大佬們有研究!加上自己這陣子也忙,就不想再插手了!
同上默默地去解包其他遊戲了 : )
看來似乎大家都少salt
今天邊上網看教程邊研究GO 腳本 : )
IKA9nt解密網上教程
GO 腳本也安裝了 : )
和python 不一樣
後綴 : decrypt.py & decrypt.go
CMD命令 : python decrypt.py
CMD命令 : go run decrypt.go
邊試邊還原go腳本
然後也發現少了salt : )
所以要自己手動去找了
然後默默地去看其他帖子了 : )
const assetKey = “y9JUY4yttVeCBvZVdXsRMDLuL8H7vNyh”
func decryptAsset(data byte, salt string, maxLength int) byte {
key := pbkdf1(assetKey, salt)
用的IKA9nt这个插件加密,所以解密也有点蛋疼,是魔改的AES。具体可以看看https://github.com/Kihara777/IKA9nt.Decryptor/tree/main,但是游戏还在这个上面有改动。
盐是下载的文件名,catalog的盐是hash文件里面的内容,密钥是y9JUY4yttVeCBvZVdXsRMDLuL8H7vNyh。
拆包一时爽,整理火葬场!
帮人帮到底,送佛送到西,阿弥陀佛
大佬!你是赛博菩萨吧!还整合进了AS里,感激之情无以言表,太感谢大佬了
ps:github的包不知道为什么下载后解压失败,有遇到一样情况的人吗
用的啥压缩软件?已知winrar和7zip都没问题
原来如此。。。7z版本太高也不是好事。。。新版本的7z极限压缩对arm架构的程序有专门一套压缩算法,结果这个东西别的压缩软件支持没跟上。。。
文件名不对,他的文件名就是salt,所以文件名要用看起来是明文的那个