Add support to extract keys from protected exe

This commit is contained in:
2026-06-09 23:12:47 +08:00
parent 789711214a
commit ee7b34cadf
3 changed files with 45 additions and 2 deletions

13
Cargo.lock generated
View File

@@ -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",

View File

@@ -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"]

View File

@@ -3655,7 +3655,36 @@ fn load_key_packages_from_exe<S: AsRef<std::path::Path> + ?Sized>(path: &S) -> V
fn load_key_package_from_path<S: AsRef<std::path::Path> + ?Sized>(path: &S) -> Result<KeyPackage> {
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<