diff --git a/Cargo.lock b/Cargo.lock index aeccb05..6d4db60 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1510,6 +1510,18 @@ dependencies = [ "rle-decode-fast", ] +[[package]] +name = "libsteamless" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73e463ef0797adef557f8747a89ea24fcc402b787f4c75465c8b3392ccc73fc3" +dependencies = [ + "aes", + "anyhow", + "cbc", + "pelite", +] + [[package]] name = "libtlg-rs" version = "0.2.4" @@ -1681,6 +1693,7 @@ dependencies = [ "json", "lazy_static", "libflac-sys", + "libsteamless", "libtlg-rs", "lz4", "markup5ever", diff --git a/Cargo.toml b/Cargo.toml index 2cdc258..7783924 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,6 +39,7 @@ json = { version = "0.12", optional = true } jpegxl-sys = { package = "msg-tool-jpegxl-sys", version = "0.11", optional = true, features = ["vendored"] } lazy_static = "1.5.0" libflac-sys = { version = "0.3", optional = true } +libsteamless = { version = "0.1", optional = true } libtlg-rs = { version = "0.2", optional = true, features = ["encode"] } lz4 = { version = "1.28", optional = true } markup5ever = { version = "0.38", optional = true } @@ -109,7 +110,7 @@ hexen-haus = ["dep:memchr", "utils-str"] hexen-haus-arc = ["hexen-haus"] hexen-haus-img = ["hexen-haus", "image"] kirikiri = ["emote-psb", "fancy-regex", "flate2", "json", "dep:lz4", "utils-escape"] -kirikiri-arc = ["kirikiri", "dep:adler", "dep:aes", "dep:argon2", "dep:base64", "dep:blake2", "dep:bytes", "dep:cbc", "dep:chacha20", "chacha20/legacy", "chacha20/xchacha", "dep:fastcdc", "flate2", "dep:hex", "dep:int-enum", "dep:md5", "dep:memchr", "msg_tool_macro/kirikiri-arc", "dep:msg_tool_xp3data", "dep:parse-size", "dep:pelite", "serde/rc", "dep:sha2", "dep:sha3", "dep:shake", "dep:siphasher", "dep:tjs2dec", "utils-case-insensitive-string", "utils-lzss", "utils-serde-base64bytes", "utils-simple-pack", "zopfli", "zstd"] +kirikiri-arc = ["kirikiri", "dep:adler", "dep:aes", "dep:argon2", "dep:base64", "dep:blake2", "dep:bytes", "dep:cbc", "dep:chacha20", "chacha20/legacy", "chacha20/xchacha", "dep:fastcdc", "flate2", "dep:hex", "dep:int-enum", "dep:libsteamless", "dep:md5", "dep:memchr", "msg_tool_macro/kirikiri-arc", "dep:msg_tool_xp3data", "dep:parse-size", "dep:pelite", "serde/rc", "dep:sha2", "dep:sha3", "dep:shake", "dep:siphasher", "dep:tjs2dec", "utils-case-insensitive-string", "utils-lzss", "utils-serde-base64bytes", "utils-simple-pack", "zopfli", "zstd"] kirikiri-img = ["kirikiri", "image", "dep:libtlg-rs"] musica = [] musica-arc = ["musica", "dep:crc32fast", "flate2", "dep:include-flate", "utils-blowfish", "utils-rc4", "utils-serde-base64bytes", "utils-xored-stream"] diff --git a/src/scripts/kirikiri/archive/xp3/crypt/cx.rs b/src/scripts/kirikiri/archive/xp3/crypt/cx.rs index 68838bb..4de6bdc 100644 --- a/src/scripts/kirikiri/archive/xp3/crypt/cx.rs +++ b/src/scripts/kirikiri/archive/xp3/crypt/cx.rs @@ -3655,7 +3655,36 @@ fn load_key_packages_from_exe + ?Sized>(path: &S) -> V fn load_key_package_from_path + ?Sized>(path: &S) -> Result { let view = pelite::FileMap::open(path)?; - load_key_package(&view, path) + let mut last_error = match load_key_package(&view, path) { + Ok(key) => return Ok(key), + Err(e) => e, + }; + if libsteamless::is_steamstub(&view) { + let options = libsteamless::SteamlessOptions::default(); + match libsteamless::process_data(view.as_ref().to_vec(), &options, &|_level, _message| {}) { + Ok(unpacked) => match load_key_package(&unpacked, path) { + Ok(key) => return Ok(key), + Err(e) => { + last_error = e; + } + }, + Err(err) => { + last_error = err; + } + } + } + let v = view.as_ref(); + // DMM DRM may put game exe at the end of protected exe + if let Some(pos) = memchr::memmem::find(&v[4..], &v[..4]) { + let nv = &v[4 + pos..]; + match load_key_package(&nv, path) { + Ok(key) => return Ok(key), + Err(e) => { + last_error = e; + } + } + } + Err(last_error) } fn find_resource<