mirror of
https://github.com/Grasscutters/Cultivation.git
synced 2025-12-18 10:04:36 +01:00
Merge branch 'main' of github.com:Grasscutters/Cultivation
This commit is contained in:
11
src-tauri/Cargo.lock
generated
11
src-tauri/Cargo.lock
generated
@@ -719,7 +719,6 @@ dependencies = [
|
|||||||
"http",
|
"http",
|
||||||
"hudsucker",
|
"hudsucker",
|
||||||
"is_elevated",
|
"is_elevated",
|
||||||
"libloading",
|
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"open",
|
"open",
|
||||||
"rcgen",
|
"rcgen",
|
||||||
@@ -1887,16 +1886,6 @@ dependencies = [
|
|||||||
"pkg-config",
|
"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]]
|
[[package]]
|
||||||
name = "line-wrap"
|
name = "line-wrap"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ futures-util = "0.3.14"
|
|||||||
rcgen = { version = "0.9", features = ["x509-parser"] }
|
rcgen = { version = "0.9", features = ["x509-parser"] }
|
||||||
|
|
||||||
# metadata stuff
|
# metadata stuff
|
||||||
libloading = "0.7"
|
|
||||||
regex = "1"
|
regex = "1"
|
||||||
|
|
||||||
# other
|
# other
|
||||||
|
|||||||
@@ -3,59 +3,70 @@
|
|||||||
"main": {
|
"main": {
|
||||||
"title": "Cultivation",
|
"title": "Cultivation",
|
||||||
"launch_button": "Khởi Chạy",
|
"launch_button": "Khởi Chạy",
|
||||||
"gc_enable": "Kết nối đến Grasscutter",
|
"gc_enable": "Kết nối qua Grasscutter",
|
||||||
"https_enable": "Sử dụng HTTPS",
|
"https_enable": "Dùng HTTPS",
|
||||||
"ip_placeholder": "Địa chỉ máy chủ...",
|
"ip_placeholder": "Địa chỉ máy chủ...",
|
||||||
"port_placeholder": "Cổng...",
|
"port_placeholder": "Cổng...",
|
||||||
"files_downloading": "Đang tải file: ",
|
"files_downloading": "Đang tải tập tin: ",
|
||||||
"files_extracting": "Đang giải nén tệp tin: "
|
"files_extracting": "Đang giải nén tập tin: "
|
||||||
},
|
},
|
||||||
"options": {
|
"options": {
|
||||||
"enabled": "Bật",
|
"enabled": "Bật",
|
||||||
"disabled": "Tắt",
|
"disabled": "Tắt",
|
||||||
"game_exec": "Đường dẫn đến GenshinImpact.exe",
|
"game_path": "Đường dẫn cài game",
|
||||||
"grasscutter_jar": "Đường dẫn đến Grasscutter.jar",
|
"game_executable": "Tập tin thực thi game",
|
||||||
"toggle_encryption": "Bật/Tắt mã hoá",
|
"recover_metadata": "Khôi phục Metadata khẩn cấp",
|
||||||
"java_path": "Đường dẫn Java tuỳ chỉnh",
|
"grasscutter_jar": "Tập tin JAR Grasscutter",
|
||||||
"grasscutter_with_game": "Tự động khởi chạy Grasscutter cùng game",
|
"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ữ",
|
"language": "Chọn ngôn ngữ",
|
||||||
"background": "Ảnh nền tuỳ chỉnh (đường dẫn hoặc tệp tin ảnh)",
|
"background": "Hình nền tùy chỉnh (liên kết hoặc tập tin hình ảnh)",
|
||||||
"theme": "Chọn giao diện"
|
"theme": "Giao diện",
|
||||||
|
"patch_metadata": "Tự động sửa Metadata",
|
||||||
|
"use_proxy": "Sử dụng proxy nội bộ"
|
||||||
},
|
},
|
||||||
"downloads": {
|
"downloads": {
|
||||||
"grasscutter_stable_data": "Tải xuống dữ liệu Grasscutter bản ổn định",
|
"grasscutter_stable_data": "Tải 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_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_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_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_stable": "Tải Grasscutter bản ổn định",
|
||||||
"grasscutter_latest": "Tải xuống Grasscutter phiển bản mới nhất",
|
"grasscutter_latest": "Tải Grasscutter bản mới nhất",
|
||||||
"grasscutter_stable_update": "Cập nhật Grasscutter ổn định",
|
"grasscutter_stable_update": "Cập nhật Grasscutter bản ổn định",
|
||||||
"grasscutter_latest_update": "Cập nhật Grasscutter mới nhất",
|
"grasscutter_latest_update": "Cập nhật Grasscutter bản mới nhất",
|
||||||
"resources": "Tải xuống tài nguyên cho Grasscutter"
|
"resources": "Tải tài nguyên Grasscutter",
|
||||||
|
"game": "Tải game"
|
||||||
},
|
},
|
||||||
"download_status": {
|
"download_status": {
|
||||||
"downloading": "Đang tải",
|
"downloading": "Đang tải xuống",
|
||||||
"extracting": "Đang giải nén",
|
"extracting": "Đang giải nén",
|
||||||
"error": "Lỗi",
|
"error": "Lỗi",
|
||||||
"finished": "Đã xong",
|
"finished": "Hoàn thành",
|
||||||
"stopped": "Đã dừng"
|
"stopped": "Đã dừng"
|
||||||
},
|
},
|
||||||
"components": {
|
"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...",
|
"select_folder": "Chọn thư mục...",
|
||||||
"download": "Tải xuống"
|
"download": "Tải xuống",
|
||||||
|
"install": "Cài đặt"
|
||||||
},
|
},
|
||||||
"news": {
|
"news": {
|
||||||
"latest_commits": "Cập nhật gần đây",
|
"latest_commits": "Thay Đổi Gần Đây",
|
||||||
"latest_version": "Phiên bản mới nhất"
|
"latest_version": "Phiên Bản Mới Nhất"
|
||||||
},
|
},
|
||||||
"help": {
|
"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'.",
|
"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 đặt trò chơi.",
|
"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, bảo gồm file jar và các file dữ liệu.",
|
"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, 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, bao gồm tập tin jar và các tệp 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_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 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.",
|
"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ó một thư mục tài nguyên có nội dung bên trong"
|
"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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
@@ -53,7 +53,7 @@ bool gen_global_metadata_key(uint8_t* src, size_t srcn) {
|
|||||||
return true;
|
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 longkey[0xB00];
|
||||||
uint8_t longkeyp[0xB0];
|
uint8_t longkeyp[0xB0];
|
||||||
uint8_t shortkey[16];
|
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);
|
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];
|
uint8_t literal_dec_key[0x5000];
|
||||||
|
|
||||||
gen_global_metadata_key(data + size - 0x4000, 0x4000);
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
extern "C" void decrypt_global_metadata(uint8_t *data, size_t size);
|
extern "C" int decrypt_global_metadata(uint8_t *data, size_t size);
|
||||||
extern "C" void encrypt_global_metadata(uint8_t *data, size_t size);
|
extern "C" int encrypt_global_metadata(uint8_t *data, size_t size);
|
||||||
|
|
||||||
#endif //METADATA_H
|
#endif //METADATA_H
|
||||||
|
|||||||
@@ -4,29 +4,10 @@ use std::fs::OpenOptions;
|
|||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
|
|
||||||
|
// For these two functions, a non-zero return value indicates failure.
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn decrypt_global_metadata(data: *mut u8, size: u64);
|
fn decrypt_global_metadata(data: *mut u8, size: usize) -> i32;
|
||||||
fn encrypt_global_metadata(data: *mut u8, size: u64);
|
fn encrypt_global_metadata(data: *mut u8, size: usize) -> i32;
|
||||||
}
|
|
||||||
|
|
||||||
fn dll_decrypt_global_metadata(
|
|
||||||
data: *mut u8,
|
|
||||||
size: u64,
|
|
||||||
) -> Result<bool, Box<dyn std::error::Error>> {
|
|
||||||
unsafe {
|
|
||||||
decrypt_global_metadata(data, size);
|
|
||||||
Ok(true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn dll_encrypt_global_metadata(
|
|
||||||
data: *mut u8,
|
|
||||||
size: u64,
|
|
||||||
) -> Result<bool, Box<dyn std::error::Error>> {
|
|
||||||
unsafe {
|
|
||||||
encrypt_global_metadata(data, size);
|
|
||||||
Ok(true)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
@@ -89,17 +70,15 @@ fn decrypt_metadata(file_path: &str) -> Vec<u8> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Decrypt metadata file
|
// Decrypt metadata file
|
||||||
match dll_decrypt_global_metadata(data.as_mut_ptr(), data.len().try_into().unwrap()) {
|
let success = unsafe { decrypt_global_metadata(data.as_mut_ptr(), data.len()) } == 0;
|
||||||
Ok(_) => {
|
if success {
|
||||||
println!("Successfully decrypted global-metadata");
|
println!("Successfully decrypted global-metadata");
|
||||||
data
|
data
|
||||||
}
|
} else {
|
||||||
Err(e) => {
|
println!("Failed to decrypt global-metadata");
|
||||||
println!("Failed to decrypt global-metadata: {}", e);
|
|
||||||
Vec::new()
|
Vec::new()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
fn replace_keys(data: &[u8]) -> Vec<u8> {
|
fn replace_keys(data: &[u8]) -> Vec<u8> {
|
||||||
let mut new_data = String::new();
|
let mut new_data = String::new();
|
||||||
@@ -150,17 +129,15 @@ fn replace_rsa_key(old_data: &str, to_replace: &str, file_name: &str) -> String
|
|||||||
|
|
||||||
fn encrypt_metadata(old_data: &[u8]) -> Vec<u8> {
|
fn encrypt_metadata(old_data: &[u8]) -> Vec<u8> {
|
||||||
let mut data = old_data.to_vec();
|
let mut data = old_data.to_vec();
|
||||||
match dll_encrypt_global_metadata(data.as_mut_ptr(), data.len().try_into().unwrap()) {
|
let success = unsafe { encrypt_global_metadata(data.as_mut_ptr(), data.len()) } == 0;
|
||||||
Ok(_) => {
|
if success {
|
||||||
println!("Successfully encrypted global-metadata");
|
println!("Successfully encrypted global-metadata");
|
||||||
data
|
data
|
||||||
}
|
} else {
|
||||||
Err(e) => {
|
println!("Failed to encrypt global-metadata");
|
||||||
println!("Failed to encrypt global-metadata: {}", e);
|
|
||||||
Vec::new()
|
Vec::new()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
fn do_vecs_match<T: PartialEq>(a: &Vec<T>, b: &Vec<T>) -> bool {
|
fn do_vecs_match<T: PartialEq>(a: &Vec<T>, b: &Vec<T>) -> bool {
|
||||||
let matching = a.iter().zip(b.iter()).filter(|&(a, b)| a == b).count();
|
let matching = a.iter().zip(b.iter()).filter(|&(a, b)| a == b).count();
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
"providerShortName": null,
|
"providerShortName": null,
|
||||||
"signingIdentity": null
|
"signingIdentity": null
|
||||||
},
|
},
|
||||||
"resources": ["lang/*.json", "keys/*", "./mhycrypto.dll"],
|
"resources": ["lang/*.json", "keys/*"],
|
||||||
"targets": "all",
|
"targets": "all",
|
||||||
"windows": {
|
"windows": {
|
||||||
"allowDowngrades": false,
|
"allowDowngrades": false,
|
||||||
|
|||||||
Reference in New Issue
Block a user