diff --git a/src-tauri/keys/dispatchKey.txt b/src-tauri/keys/dispatchKey.txt new file mode 100644 index 0000000..82b5d74 --- /dev/null +++ b/src-tauri/keys/dispatchKey.txt @@ -0,0 +1 @@ +AMW28dptX3h8q0O4z/vJrQxf6cmC6yVilgHRL98GazrYzmc3ixj87JpHIJ3IKEYV+HU/tYrUjEfY/ZtPzsLB9lKBelN9i8QjkFkA9QDICGYwJCXibxU67Z/HzENe9NQpG2i01SI0TJU8PJDV7zQPwPVGraIg5ouExRupq8UymaSHEyJ7zxKZCtgO0LKdROLJBSvI5srMu7kYTGmB7T07Ab8T9M595YSgd1vh06qZ3nsF1h4wg3y+zW28vdY28+RCj2V1i7oVyL0dQruLYq7qK8FycZl2j9R0GaJ8rRAjVP1Dsz+hjS3atHhQxOG9OFo6d/euedRvfWIhT9p6h1SeTjE=AQAB \ No newline at end of file diff --git a/src-tauri/keys/passwordKey.txt b/src-tauri/keys/passwordKey.txt new file mode 100644 index 0000000..abcc662 --- /dev/null +++ b/src-tauri/keys/passwordKey.txt @@ -0,0 +1,7 @@ + + AQAB + yytg/H9lz7Lm0XcA8LMqIyXPVNApYTcSepT4VDLB4qqqFC3s + /Huv8vN7zA/P4uoREIu8KMenADFk7uwrZSxoMWwJgn6A7sbAt1cqAaUXB + 9J4NzhL0x3AFTiHEQbw86hRvm2VGkbA5sWnr0NZw8SGBBY+EODwNIt51G + dBA7eoUQU= + \ No newline at end of file diff --git a/src-tauri/src/metadata.rs b/src-tauri/src/metadata.rs index bcdec5f..2e30e23 100644 --- a/src-tauri/src/metadata.rs +++ b/src-tauri/src/metadata.rs @@ -1,18 +1,21 @@ use core::ffi::c_void; -use std::fs::File; -use std::io::Read; -use std::io::Write; use libloading::os::windows::Library; use libloading::os::windows::Symbol; use regex::Regex; +use std::fs::File; +use std::io::Read; +use std::io::Write; -fn dll_decrypt_global_metadata(data : *mut u8, size : u64) -> Result<*const c_void, Box> { +fn dll_decrypt_global_metadata( + data: *mut u8, + size: u64, +) -> Result<*const c_void, Box> { unsafe { // Load DLL let lib = Library::new("mhycrypto.dll")?; // Load function and call it - let func : Symbol *const c_void> = lib.get_ordinal(0x1)?; + let func: Symbol *const c_void> = lib.get_ordinal(0x1)?; let decrypted_data = func(data, size); // Close DLL and return result @@ -21,13 +24,16 @@ fn dll_decrypt_global_metadata(data : *mut u8, size : u64) -> Result<*const c_vo } } -fn dll_encrypt_global_metadata(data : *mut u8, size : u64) -> Result<*const c_void, Box> { +fn dll_encrypt_global_metadata( + data: *mut u8, + size: u64, +) -> Result<*const c_void, Box> { unsafe { // Load DLL let lib = Library::new("mhycrypto.dll")?; // Load function and call it - let func : Symbol *const c_void> = lib.get_ordinal(0x2)?; + let func: Symbol *const c_void> = lib.get_ordinal(0x2)?; let encrypted_data = func(data, size); // Close DLL and return result @@ -40,22 +46,16 @@ fn dll_encrypt_global_metadata(data : *mut u8, size : u64) -> Result<*const c_vo pub fn patch_metadata(metadata_folder: &str) { let metadata_file = &(metadata_folder.to_owned() + "\\global-metadata.dat"); println!("Patching metadata file: {}", metadata_file); - let decrypted : Vec = decrypt_metadata(metadata_file); + let decrypted: Vec = decrypt_metadata(metadata_file); - //write decrypted to file - let mut file = File::create(&(metadata_folder.to_owned() + "\\decrypted-metadata.dat")).unwrap(); - file.write_all(&decrypted).unwrap(); + let modified = replace_keys(&decrypted); - replace_rsa_key(&decrypted); - - /*if decrypted != Vec::new() { - - } else { - // error - }*/ + //write modfied to file + let mut file = File::create(&(metadata_folder.to_owned() + "\\modified-metadata.dat")).unwrap(); + file.write_all(&modified).unwrap(); } -fn decrypt_metadata(file_path: &str) -> Vec{ +fn decrypt_metadata(file_path: &str) -> Vec { let mut file = match File::open(file_path) { Ok(file) => file, Err(e) => { @@ -84,7 +84,9 @@ fn decrypt_metadata(file_path: &str) -> Vec{ } } -fn replace_rsa_key(data: &Vec) { +fn replace_keys(data: &Vec) -> Vec { + let mut new_data = String::new(); + unsafe { let data_str = String::from_utf8_unchecked(data.to_vec()); @@ -94,36 +96,54 @@ fn replace_rsa_key(data: &Vec) { // dispatch key is index 3 // password key is index 2 - //println!("Found {} RSA Key(s)", matches.count()); for (i, rmatch) in matches.enumerate() { let key = rmatch.as_str(); - println!("{} - RSA Key {}", i, key); - println!("\n"); + if i == 2 { + println!("Replacing password key"); + new_data = replace_rsa_key(&data_str, &key, "passwordKey.txt"); + } else if i == 3 { + println!("Replacing dispatch key"); + new_data = replace_rsa_key(&new_data, &key, "dispatchKey.txt"); + } } } - + return new_data.as_bytes().to_vec(); +} - /*if matches.count() < 1 { - println!("No RSA keys found"); - return Vec::new(); - }*/ +fn replace_rsa_key(old_data: &str, to_replace: &str, file_name: &str) -> String { + // Read dispatch key file + unsafe { + let mut new_key_file = match File::open(&("keys/".to_owned() + file_name)) { + Ok(file) => file, + Err(e) => { + println!("Failed to open keys/{}: {}", file_name, e); + return String::new(); + } + }; + let mut key_data = Vec::new(); + new_key_file.read_to_end(&mut key_data).unwrap(); + let new_key = String::from_utf8_unchecked(key_data.to_vec()); + + // Replace old key with new key + return old_data.replace(to_replace, &new_key); + } } /*let mut file = match OpenOptions::new().write(true).create(true).open(&(file_location.to_owned() + "\\decrypted_metadata.dat")) { - Ok(file) => file, - Err(e) => { - println!("Failed to open file: {}", e); - return; - } - }; - match file.write_all(&data) { - Ok(_) => { - println!("Successfully decrypted metadata"); - } - Err(e) => { - println!("Failed to write to file: {}", e); - return; - } - }*/ \ No newline at end of file + Ok(file) => file, + Err(e) => { + println!("Failed to open file: {}", e); + return; + } +}; +match file.write_all(&data) { + Ok(_) => { + println!("Successfully decrypted metadata"); + } + Err(e) => { + println!("Failed to write to file: {}", e); + return; + } +}*/ diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 8daae45..b7f5d60 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -56,6 +56,7 @@ }, "resources": [ "lang/*.json", + "keys/*", "./mhycrypto.dll" ], "targets": "all",