谢谢,我能够看到 catalog.bin 的内容。
有两件事我想问一下:
第一步是获取 ab_hash_key,但您需要获取 p.txt 并将其添加到代码中,对吗?
我还没有能够尝试,因为我还没有能够下载 p.txt。
(我不知道如何下载)
第二个问题是,我能够使用“dewrfe53535”的代码获取资源文件,但无法提取它。
我尝试使用 AssetStudioGui 提取它,但没有成功。我需要对下载的文件做些什么吗?或者是部署工具版本的问题?
请告诉我。
【星光偶像计划】数据下载和解包方法探索 - 雾雾的百宝箱 参考本楼朋友们写的
谢谢你,“yjzyl9008”。
- 我对它的神奇之处感到十分惊讶。
- 我尝试加载它,但无法确认,我想我不太明白。
“joyingwol”
我朋友的文章非常有帮助,我能够对其进行扩展,这是一个很大的帮助!
我还有一个问题。提取的 ab 文件似乎不包含任何场景文本。
我可以得到场景文件吗?
如果您只拥有自己拥有的角色,则在开发人员工具中查找时将无法找到任何文件(例如场景文本)
数据表上次看了下是服务器动态下发,而且解密用的ck每次都会变,好像是在decryptfile这个函数,你可以研究一下
谢谢,我想我自己做不到…
我想为自己创建一个玩家,但即使使用我拥有的角色,似乎也无法保存场景文本
不好意思,打扰了。我是个新手,之前尝试了一下提取文本但完全没有思路,能麻烦大佬给指点下方向么,谢谢。
劇情文本是從伺服器下載的,應該有驗證玩家資料。
下載mitmproxy,再用mitmweb -s [腳本]。
只有解Response,Resquest沒效。View選項選「msgpacksiprj」
# siprj_decrypt.py
# pipx inject mitmproxy msgpack pycryptodome
import base64
import json
import msgpack
import logging
from mitmproxy import http
from mitmproxy import contentviews
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
KEY = "dxVAV9m1wG2YY/GUiPmSHA=="
IV = "A1C3PyrC3EqOFDie97WijQ=="
KEY_BYTES = base64.b64decode(KEY)
IV_BYTES = base64.b64decode(IV)
JSON_INDENT = 2
class MsgpackSIPRJ(contentviews.Contentview):
def prettify(self, data: bytes, metadata: contentviews.Metadata) -> str:
if metadata.flow.server_conn.address[0] == "prod.app.siprj.com":
content = self.decrypt_msg(data)
result = self.convert_dict(content)
return json.dumps(result, indent=JSON_INDENT)
def decrypt_aes_cbc_pkcs7(self, ciphertext: bytes, key: bytes, iv: bytes) -> bytes:
cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = cipher.decrypt(ciphertext)
return unpad(plaintext, AES.block_size)
def decrypt_msg(self, msg: bytes):
raw_dict = msgpack.unpackb(msg)
encrypted_bytes = base64.b64decode(raw_dict['p'])
decrypted_bytes = self.decrypt_aes_cbc_pkcs7(encrypted_bytes, KEY_BYTES, IV_BYTES)
return msgpack.unpackb(decrypted_bytes, strict_map_key=False)
def convert_dict(self, data):
if isinstance(data, str):
return data
elif isinstance(data, bytes):
return data.decode()
elif isinstance(data, dict):
newdata = {} # Build a new dict
for key, val in data.items():
# Simplify code path by just doing decoding in conditional, insertion unconditional
if isinstance(key, bytes):
key = key.decode()
newdata[key] = self.convert_dict(val) # Update new dict (and use the val since items() gives it for free)
return newdata
elif isinstance(data,list):
return [self.convert_dict(dt) for dt in data]
else:
return data
contentviews.add(MsgpackSIPRJ)
腳本有兩服通用??
另外有抓音樂的方式??
這遊戲不是只有日服嗎?是指哪兩服?
音樂在AB檔,看上面的教學能不能單獨下載,不知道就下載全部後再柝。
一般向跟成人向
看起來一樣。
工程師沒事應該不會做兩個不一樣的系統,維護起來給自己找麻煩,頂多密鑰換一下。
请问你是使用什么工具或方法看到catalog.bin的内容的?使用py下载资源文件并提取是弄明白了。
我使用 py 显示了 catalog.bin 的内容。
但是,查看内容并不能检索资源。
如果知道如何检索资源就太好了。
另外,我无法解码和检索 terafony6208 编写的场景脚本,请问您能解码和检索该场景吗?
terafony6208编写的脚本需要安装mitmproxy这个软件,我并没有安装这个软件,在这方面我帮不上忙,抱歉。
请问catalog.bin的内容里,有哪个文件包含在哪个bundle这样的信息吗?
之前pipx inject msgpack-python,已換新的module msgpack。
程式碼有修改,你再試試看。
# siprj_decrypt.py
# pipx inject mitmproxy msgpack pycryptodome
import base64
import json
import msgpack
import logging
from mitmproxy import http
from mitmproxy import contentviews
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
KEY = "dxVAV9m1wG2YY/GUiPmSHA=="
IV = "A1C3PyrC3EqOFDie97WijQ=="
KEY_BYTES = base64.b64decode(KEY)
IV_BYTES = base64.b64decode(IV)
JSON_INDENT = 2
class MsgpackSIPRJ(contentviews.Contentview):
def prettify(self, data: bytes, metadata: contentviews.Metadata) -> str:
if metadata.flow.server_conn.address[0] == "prod.app.siprj.com":
content = self.decrypt_msg(data)
result = self.convert_dict(content)
return json.dumps(result, indent=JSON_INDENT)
def decrypt_aes_cbc_pkcs7(self, ciphertext: bytes, key: bytes, iv: bytes) -> bytes:
cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = cipher.decrypt(ciphertext)
return unpad(plaintext, AES.block_size)
def decrypt_msg(self, msg: bytes):
raw_dict = msgpack.unpackb(msg)
encrypted_bytes = base64.b64decode(raw_dict['p'])
decrypted_bytes = self.decrypt_aes_cbc_pkcs7(encrypted_bytes, KEY_BYTES, IV_BYTES)
return msgpack.unpackb(decrypted_bytes, strict_map_key=False)
def convert_dict(self, data):
if isinstance(data, str):
return data
elif isinstance(data, bytes):
return data.decode()
elif isinstance(data, dict):
newdata = {} # Build a new dict
for key, val in data.items():
# Simplify code path by just doing decoding in conditional, insertion unconditional
if isinstance(key, bytes):
key = key.decode()
newdata[key] = self.convert_dict(val) # Update new dict (and use the val since items() gives it for free)
return newdata
elif isinstance(data,list):
return [self.convert_dict(dt) for dt in data]
else:
return data
contentviews.add(MsgpackSIPRJ)
这是 catalog.bin 的解密版本。您需要进行一些修改来指定存储位置和目录版本,但请按原样使用。
如果可以通过解密获取资源,我很想知道。


