From c7bf9e540f2c653bbdc9f72cc4ff76a082b19dd3 Mon Sep 17 00:00:00 2001 From: KIT! Date: Mon, 11 Nov 2024 15:46:07 +0100 Subject: [PATCH 1/3] Fixed LayeredFS not always encrypting 08.18 Fumens --- README.md | 1 + src/patches/layeredfs.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 90569e8..c22477d 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ It currently supports the following versions: ## Setup Copy the extracted contents of `dist.zip` to the same directory as Taiko.exe +If your game hangs on a black screen at launch for more than a minute, Start Taiko.exe as Administrator ! ### config.toml diff --git a/src/patches/layeredfs.cpp b/src/patches/layeredfs.cpp index 5f8f44e..1a8d759 100644 --- a/src/patches/layeredfs.cpp +++ b/src/patches/layeredfs.cpp @@ -151,12 +151,12 @@ bool IsFumenEncrypted (const std::string &filename) { std::ifstream file (filename, std::ios::binary); file.seekg (0x210, std::ios::beg); - std::vector buffer (32); + std::vector buffer (28); file.read (reinterpret_cast (buffer.data ()), buffer.size ()); // Check if the read bytes match the expected pattern std::vector expected_bytes = {0x00, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00}; + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; return buffer != expected_bytes; } From 2cf94175c58f667de68b63e37628ac66d3b0bcfa Mon Sep 17 00:00:00 2001 From: KIT! Date: Mon, 11 Nov 2024 16:04:04 +0100 Subject: [PATCH 2/3] Turns out some files still weren't being encrypted --- src/patches/layeredfs.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/patches/layeredfs.cpp b/src/patches/layeredfs.cpp index 1a8d759..dcbb447 100644 --- a/src/patches/layeredfs.cpp +++ b/src/patches/layeredfs.cpp @@ -150,12 +150,12 @@ EncryptFile (const std::string &input_file, const std::string &hex_key) { bool IsFumenEncrypted (const std::string &filename) { std::ifstream file (filename, std::ios::binary); - file.seekg (0x210, std::ios::beg); - std::vector buffer (28); + file.seekg (0x214, std::ios::beg); + std::vector buffer (24); file.read (reinterpret_cast (buffer.data ()), buffer.size ()); // Check if the read bytes match the expected pattern - std::vector expected_bytes = {0x00, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + std::vector expected_bytes = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; return buffer != expected_bytes; From 87b6044e531d2896ccf7b073c7bba22d268fd1cb Mon Sep 17 00:00:00 2001 From: KIT! Date: Mon, 11 Nov 2024 16:16:16 +0100 Subject: [PATCH 3/3] Added extra security for detecting fumen files Making sure the file ends with .bin to avoid false positives --- src/patches/layeredfs.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/patches/layeredfs.cpp b/src/patches/layeredfs.cpp index dcbb447..0148e4c 100644 --- a/src/patches/layeredfs.cpp +++ b/src/patches/layeredfs.cpp @@ -149,7 +149,13 @@ EncryptFile (const std::string &input_file, const std::string &hex_key) { bool IsFumenEncrypted (const std::string &filename) { - std::ifstream file (filename, std::ios::binary); + // Check if the filename ends with ".bin" + if (filename.size() < 4 || filename.substr(filename.size() - 4) != ".bin") { + std::cout << "Not a Fumen file: " << filename << std::endl; + return true; // If it doesn't we return early, as the file we're seeing isn't a fumen ! + } + + std::ifstream file(filename, std::ios::binary); file.seekg (0x214, std::ios::beg); std::vector buffer (24); file.read (reinterpret_cast (buffer.data ()), buffer.size ()); @@ -192,7 +198,7 @@ HOOK (HANDLE, CreateFileAHook, PROC_ADDRESS ("kernel32.dll", "CreateFileA"), LPC uint32_t crc = CRC32C (0, crc_vector.data (), crc_vector.size ()); WriteFile (encPath, EncryptFile (newPath, fumenKey), crc); // And we save it } else { - std::cout << "Missing or invalid fumen key : " << std::filesystem::relative (newPath) << " couldn't be encrypted." + std::cout << "Missing or invalid fumen key: " << std::filesystem::relative (newPath) << " couldn't be encrypted." << std::endl; encPath = path.string (); } @@ -223,7 +229,7 @@ HOOK (HANDLE, CreateFileAHook, PROC_ADDRESS ("kernel32.dll", "CreateFileA"), LPC uint32_t crc = CRC32C (0, crc_vector.data (), crc_vector.size ()); WriteFile (encPath, EncryptFile (json_path.string (), datatableKey), crc); // And save it } else { - std::cout << "Missing or invalid datatable key : " << std::filesystem::relative (newPath) << " couldn't be encrypted." + std::cout << "Missing or invalid datatable key: " << std::filesystem::relative (newPath) << " couldn't be encrypted." << std::endl; encPath = path.string (); }