diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 132fc19..fb77f7d 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -719,7 +719,6 @@ dependencies = [ "http", "hudsucker", "is_elevated", - "libloading", "once_cell", "open", "rcgen", @@ -1887,16 +1886,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "libloading" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" -dependencies = [ - "cfg-if 1.0.0", - "winapi", -] - [[package]] name = "line-wrap" version = "0.1.1" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 2ac2197..39dca36 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -56,7 +56,6 @@ futures-util = "0.3.14" rcgen = { version = "0.9", features = ["x509-parser"] } # metadata stuff -libloading = "0.7" regex = "1" # other diff --git a/src-tauri/lang/vi.json b/src-tauri/lang/vi.json index 443250b..8ad6524 100644 --- a/src-tauri/lang/vi.json +++ b/src-tauri/lang/vi.json @@ -3,59 +3,70 @@ "main": { "title": "Cultivation", "launch_button": "Khởi Chạy", - "gc_enable": "Kết nối đến Grasscutter", - "https_enable": "Sử dụng HTTPS", + "gc_enable": "Kết nối qua Grasscutter", + "https_enable": "Dùng HTTPS", "ip_placeholder": "Địa chỉ máy chủ...", "port_placeholder": "Cổng...", - "files_downloading": "Đang tải file: ", - "files_extracting": "Đang giải nén tệp tin: " + "files_downloading": "Đang tải tập tin: ", + "files_extracting": "Đang giải nén tập tin: " }, "options": { "enabled": "Bật", "disabled": "Tắt", - "game_exec": "Đường dẫn đến GenshinImpact.exe", - "grasscutter_jar": "Đường dẫn đến Grasscutter.jar", - "toggle_encryption": "Bật/Tắt mã hoá", - "java_path": "Đường dẫn Java tuỳ chỉnh", - "grasscutter_with_game": "Tự động khởi chạy Grasscutter cùng game", + "game_path": "Đường dẫn cài game", + "game_executable": "Tập tin thực thi game", + "recover_metadata": "Khôi phục Metadata khẩn cấp", + "grasscutter_jar": "Tập tin JAR Grasscutter", + "toggle_encryption": "Bật/tắt mã hóa", + "install_certificate": "Cài chứng chỉ proxy", + "java_path": "Đường dẫn Java tùy chỉnh", + "grasscutter_with_game": "Tự động chạy Grasscutter cùng với game", "language": "Chọn ngôn ngữ", - "background": "Ảnh nền tuỳ chỉnh (đường dẫn hoặc tệp tin ảnh)", - "theme": "Chọn giao diện" + "background": "Hình nền tùy chỉnh (liên kết hoặc tập tin hình ảnh)", + "theme": "Giao diện", + "patch_metadata": "Tự động sửa Metadata", + "use_proxy": "Sử dụng proxy nội bộ" }, "downloads": { - "grasscutter_stable_data": "Tải xuống dữ liệu Grasscutter bản ổn định", - "grasscutter_latest_data": "Tải xuống dữ liệu Grasscutter bản mới nhất", + "grasscutter_stable_data": "Tải dữ liệu Grasscutter bản ổn định", + "grasscutter_latest_data": "Tải dữ liệu Grasscutter bản mới nhất", "grasscutter_stable_data_update": "Cập nhật dữ liệu Grasscutter bản ổn định", "grasscutter_latest_data_update": "Cập nhật dữ liệu Grasscutter bản mới nhất", - "grasscutter_stable": "Tải xuống Grasscutter phiên bản ổn định", - "grasscutter_latest": "Tải xuống Grasscutter phiển bản mới nhất", - "grasscutter_stable_update": "Cập nhật Grasscutter ổn định", - "grasscutter_latest_update": "Cập nhật Grasscutter mới nhất", - "resources": "Tải xuống tài nguyên cho Grasscutter" + "grasscutter_stable": "Tải Grasscutter bản ổn định", + "grasscutter_latest": "Tải Grasscutter bản mới nhất", + "grasscutter_stable_update": "Cập nhật Grasscutter bản ổn định", + "grasscutter_latest_update": "Cập nhật Grasscutter bản mới nhất", + "resources": "Tải tài nguyên Grasscutter", + "game": "Tải game" }, "download_status": { - "downloading": "Đang tải", + "downloading": "Đang tải xuống", "extracting": "Đang giải nén", "error": "Lỗi", - "finished": "Đã xong", + "finished": "Hoàn thành", "stopped": "Đã dừng" }, "components": { - "select_file": "Chọn tệp tin hoặc thư mục...", + "select_file": "Chọn tập tin hoặc thư mục...", "select_folder": "Chọn thư mục...", - "download": "Tải xuống" + "download": "Tải xuống", + "install": "Cài đặt" }, "news": { - "latest_commits": "Cập nhật gần đây", - "latest_version": "Phiên bản mới nhất" + "latest_commits": "Thay Đổi Gần Đây", + "latest_version": "Phiên Bản Mới Nhất" }, "help": { - "port_help_text": "Đảm bảo đây là cổng của server Dispatch, không phải cổng của server Game. Thường là '443'.", - "game_help_text": "Bạn không cần phải sử dụng một bản sao riêng để chơi với Grasscutter. Việc này chỉ xảy ra nếu bạn hạ phiên bản xuống 2.6 hoặc chưa cài đặt trò chơi.", - "gc_stable_jar": "Tải xuống phiên bản ổn định của Grasscutter, bảo gồm file jar và các file dữ liệu.", - "gc_dev_jar": "Tải xuống phiên bản phát triển mới nhất của Grasscutter, bảo gồm file jar và các file dữ liệu.", - "gc_stable_data": "Tải xuống bản ổn định các tệp dữ liệu của Grasscutter, không bao gồm file jar. Phù hợp khi cập nhật.", - "gc_dev_data": "Tải xuống bản phát triển mới nhất các tệp dữ liệu của Grasscutter, không bao gồm file jar. Phù hợp khi cập nhật.", - "resources": "Chúng được yêu cầu để chạy máy chủ Grasscutter. Nút này sẽ có màu xám nếu bạn có một thư mục tài nguyên có nội dung bên trong" + "port_help_text": "Hãy đảm bảo đây là cổng của máy chủ Dispatch, không phải cổng của máy chủ game. Thường sẽ là '443'.", + "game_help_text": "Bạn không cần phải sử dụng một bản sao riêng để chơi với Grasscutter. Việc này chỉ xảy ra nếu bạn hạ phiên bản xuống 2.6 hoặc chưa cài game.", + "gc_stable_jar": "Tải xuống phiên bản ổn định của Grasscutter, bao gồm tập tin jar và các tệp dữ liệu.", + "gc_dev_jar": "Tải xuống phiên bản phát triển mới nhất của Grasscutter, bao gồm tập tin jar và các tệp dữ liệu.", + "gc_stable_data": "Tải xuống tệp dữ liệu phiên bản ổn định hiện hành của Grasscutter. Bản này không đi kèm với tập tin jar, hữu dụng khi muốn cập nhật.", + "gc_dev_data": "Tải xuống tệp dữ liệu phiên bản mới nhất của Grasscutter. Bản này không đi kèm với tập tin jar, hữu dụng khi muốn cập nhật.", + "resources": "Chúng được yêu cầu để chạy máy chủ Grasscutter. Nút này sẽ có màu xám nếu bạn đã có sẵn một thư mục tài nguyên có nội dung bên trong" + }, + "swag": { + "akebi": "Tập tin thực thi Akebi", + "migoto": "Tập tin thực thi 3dMigoto" } } diff --git a/src-tauri/mhycrypto.dll b/src-tauri/mhycrypto.dll deleted file mode 100644 index 111a2e4..0000000 Binary files a/src-tauri/mhycrypto.dll and /dev/null differ diff --git a/src-tauri/mhycrypto/metadata.cpp b/src-tauri/mhycrypto/metadata.cpp index 392112b..d40f358 100644 --- a/src-tauri/mhycrypto/metadata.cpp +++ b/src-tauri/mhycrypto/metadata.cpp @@ -53,7 +53,7 @@ bool gen_global_metadata_key(uint8_t* src, size_t srcn) { return true; } -extern "C" void decrypt_global_metadata(uint8_t *data, size_t size) { +void decrypt_global_metadata_inner(uint8_t *data, size_t size) { uint8_t longkey[0xB00]; uint8_t longkeyp[0xB0]; uint8_t shortkey[16]; @@ -87,7 +87,16 @@ extern "C" void decrypt_global_metadata(uint8_t *data, size_t size) { recrypt_global_metadata_header_string_literals(data, size, literal_dec_key); } -extern "C" void encrypt_global_metadata(uint8_t* data, size_t size) { +extern "C" int decrypt_global_metadata(uint8_t *data, size_t size) { + try { + decrypt_global_metadata_inner(data, size); + return 0; + } catch (...) { + return -1; + } +} + +void encrypt_global_metadata_inner(uint8_t* data, size_t size) { uint8_t literal_dec_key[0x5000]; gen_global_metadata_key(data + size - 0x4000, 0x4000); @@ -126,3 +135,12 @@ extern "C" void encrypt_global_metadata(uint8_t* data, size_t size) { } } } + +extern "C" int encrypt_global_metadata(uint8_t* data, size_t size) { + try { + encrypt_global_metadata_inner(data, size); + return 0; + } catch (...) { + return -1; + } +} diff --git a/src-tauri/mhycrypto/metadata.h b/src-tauri/mhycrypto/metadata.h index f2c8c5b..d92c18d 100644 --- a/src-tauri/mhycrypto/metadata.h +++ b/src-tauri/mhycrypto/metadata.h @@ -4,7 +4,7 @@ #include #include -extern "C" void decrypt_global_metadata(uint8_t *data, size_t size); -extern "C" void encrypt_global_metadata(uint8_t *data, size_t size); +extern "C" int decrypt_global_metadata(uint8_t *data, size_t size); +extern "C" int encrypt_global_metadata(uint8_t *data, size_t size); #endif //METADATA_H diff --git a/src-tauri/src/metadata_patcher.rs b/src-tauri/src/metadata_patcher.rs index d551330..7965676 100644 --- a/src-tauri/src/metadata_patcher.rs +++ b/src-tauri/src/metadata_patcher.rs @@ -4,29 +4,10 @@ use std::fs::OpenOptions; use std::io::Read; use std::io::Write; +// For these two functions, a non-zero return value indicates failure. extern "C" { - fn decrypt_global_metadata(data: *mut u8, size: u64); - fn encrypt_global_metadata(data: *mut u8, size: u64); -} - -fn dll_decrypt_global_metadata( - data: *mut u8, - size: u64, -) -> Result> { - unsafe { - decrypt_global_metadata(data, size); - Ok(true) - } -} - -fn dll_encrypt_global_metadata( - data: *mut u8, - size: u64, -) -> Result> { - unsafe { - encrypt_global_metadata(data, size); - Ok(true) - } + fn decrypt_global_metadata(data: *mut u8, size: usize) -> i32; + fn encrypt_global_metadata(data: *mut u8, size: usize) -> i32; } #[tauri::command] @@ -89,15 +70,13 @@ fn decrypt_metadata(file_path: &str) -> Vec { } // Decrypt metadata file - match dll_decrypt_global_metadata(data.as_mut_ptr(), data.len().try_into().unwrap()) { - Ok(_) => { - println!("Successfully decrypted global-metadata"); - data - } - Err(e) => { - println!("Failed to decrypt global-metadata: {}", e); - Vec::new() - } + let success = unsafe { decrypt_global_metadata(data.as_mut_ptr(), data.len()) } == 0; + if success { + println!("Successfully decrypted global-metadata"); + data + } else { + println!("Failed to decrypt global-metadata"); + Vec::new() } } @@ -150,15 +129,13 @@ fn replace_rsa_key(old_data: &str, to_replace: &str, file_name: &str) -> String fn encrypt_metadata(old_data: &[u8]) -> Vec { let mut data = old_data.to_vec(); - match dll_encrypt_global_metadata(data.as_mut_ptr(), data.len().try_into().unwrap()) { - Ok(_) => { - println!("Successfully encrypted global-metadata"); - data - } - Err(e) => { - println!("Failed to encrypt global-metadata: {}", e); - Vec::new() - } + let success = unsafe { encrypt_global_metadata(data.as_mut_ptr(), data.len()) } == 0; + if success { + println!("Successfully encrypted global-metadata"); + data + } else { + println!("Failed to encrypt global-metadata"); + Vec::new() } } diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index e5bc109..41b4c5a 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -40,7 +40,7 @@ "providerShortName": null, "signingIdentity": null }, - "resources": ["lang/*.json", "keys/*", "./mhycrypto.dll"], + "resources": ["lang/*.json", "keys/*"], "targets": "all", "windows": { "allowDowngrades": false,