求助DMM新事前游戏STELLAR IDOL PROJECT的资源路径获取

谢谢,我能够看到 catalog.bin 的内容。
有两件事我想问一下:
第一步是获取 ab_hash_key,但您需要获取 p.txt 并将其添加到代码中,对吗?
我还没有能够尝试,因为我还没有能够下载 p.txt。
(我不知道如何下载)

第二个问题是,我能够使用“dewrfe53535”的代码获取资源文件,但无法提取它。
我尝试使用 AssetStudioGui 提取它,但没有成功。我需要对下载的文件做些什么吗?或者是部署工具版本的问题?
请告诉我。

【星光偶像计划】数据下载和解包方法探索 - 雾雾的百宝箱 参考本楼朋友们写的

谢谢你,“yjzyl9008”。

  1. 我对它的神奇之处感到十分惊讶。
  2. 我尝试加载它,但无法确认,我想我不太明白。

“joyingwol”
我朋友的文章非常有帮助,我能够对其进行扩展,这是一个很大的帮助!

我还有一个问题。提取的 ab 文件似乎不包含任何场景文本。
我可以得到场景文件吗?
如果您只拥有自己拥有的角色,则在开发人员工具中查找时将无法找到任何文件(例如场景文本)

数据表上次看了下是服务器动态下发,而且解密用的ck每次都会变,好像是在decryptfile这个函数,你可以研究一下

剧情脚本是从api获取的


谢谢,我想我自己做不到…
我想为自己创建一个玩家,但即使使用我拥有的角色,似乎也无法保存场景文本

不好意思,打扰了。我是个新手,之前尝试了一下提取文本但完全没有思路,能麻烦大佬给指点下方向么,谢谢。

劇情文本是從伺服器下載的,應該有驗證玩家資料。
下載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)
2 个赞

腳本有兩服通用??

另外有抓音樂的方式??

這遊戲不是只有日服嗎?是指哪兩服?
音樂在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 的解密版本。您需要进行一些修改来指定存储位置和目录版本,但请按原样使用。
如果可以通过解密获取资源,我很想知道。