From e504ae41ae9d742bbd8521699230b6f99eada356 Mon Sep 17 00:00:00 2001 From: traffic95 Date: Sat, 24 May 2025 01:51:32 +0200 Subject: [PATCH 1/6] CNBeta2.0.4 support --- launcher/src/main.rs | 2 +- vivian/src/lib.rs | 4 ++-- vivian/src/modules/crypto.rs | 10 +++++----- vivian/src/modules/hoyopass_patch.rs | 8 ++++---- vivian/src/modules/network.rs | 22 +++++++++++++++++++--- 5 files changed, 31 insertions(+), 15 deletions(-) diff --git a/launcher/src/main.rs b/launcher/src/main.rs index 9f27341..b611481 100644 --- a/launcher/src/main.rs +++ b/launcher/src/main.rs @@ -12,7 +12,7 @@ use windows::Win32::System::Threading::{ PROCESS_INFORMATION, STARTUPINFOA, }; -const GAME_EXECUTABLE: PCSTR = s!("ZenlessZoneZero.exe"); +const GAME_EXECUTABLE: PCSTR = s!("ZenlessZoneZeroBeta.exe"); const INJECT_DLL: &str = "vivian.dll"; fn inject_standard(h_target: HANDLE, dll_path: &str) -> bool { diff --git a/vivian/src/lib.rs b/vivian/src/lib.rs index b958196..1999791 100644 --- a/vivian/src/lib.rs +++ b/vivian/src/lib.rs @@ -31,8 +31,8 @@ unsafe fn thread_fn() { thread::sleep(Duration::from_secs(5)); util::disable_memory_protection(); - println!("vivian-patch (1.7.0 PROD) is initializing"); - println!("to work with vivian-rs: https://git.xeondev.com/vivian-rs/vivian-rs"); + println!("vivian-patch (2.0.4 BETA) is initializing"); + println!("to work with vivian-rs: https://git.xeondev.com/traffic95/vivian-rs/src/branch/CNBeta2.0.4"); let mut module_manager = NapModuleManager::default(); module_manager.add::(); diff --git a/vivian/src/modules/crypto.rs b/vivian/src/modules/crypto.rs index 9085e4d..a141a50 100644 --- a/vivian/src/modules/crypto.rs +++ b/vivian/src/modules/crypto.rs @@ -7,14 +7,14 @@ use crate::{ util::{import, GAME_ASSEMBLY_BASE}, }; -import!(rsa_create() -> usize = 0x19034F20); -import!(rsa_from_xml_string(instance: usize, xml_string: usize) -> usize = 0x19035160); -import!(il2cpp_string_new(cstr: *const u8) -> usize = 0x1242D60); +import!(rsa_create() -> usize = 0x1B56B2E0); +import!(rsa_from_xml_string(instance: usize, xml_string: usize) -> usize = 0x1B56B520); +import!(il2cpp_string_new(cstr: *const u8) -> usize = 0x115F1B0); pub unsafe fn initialize_rsa_public_key() { const SERVER_PUBLIC_KEY: &str = include_str!("../../server_public_key.xml"); let rsa_public_key_backdoor_field = - ((*(GAME_ASSEMBLY_BASE.wrapping_add(0x4E072F0) as *const usize)) + 235872) as *mut usize; + ((*(GAME_ASSEMBLY_BASE.wrapping_add(0x5552100) as *const usize)) + 252792) as *mut usize; let rsa = rsa_create(); rsa_from_xml_string( @@ -44,7 +44,7 @@ pub unsafe fn replace_sdk_public_key_string_literal() { pub unsafe fn monitor_network_state(interceptor: &mut Interceptor) { interceptor .attach( - GAME_ASSEMBLY_BASE.wrapping_add(0xAE84F80), + GAME_ASSEMBLY_BASE.wrapping_add(0xD8AAEC0), on_network_state_change, ) .unwrap(); diff --git a/vivian/src/modules/hoyopass_patch.rs b/vivian/src/modules/hoyopass_patch.rs index 9ad2907..27f5abf 100644 --- a/vivian/src/modules/hoyopass_patch.rs +++ b/vivian/src/modules/hoyopass_patch.rs @@ -4,10 +4,10 @@ use crate::util::GAME_ASSEMBLY_BASE; use super::{ModuleInitError, NapModule, NapModuleContext}; -const ON_COMBO_INIT_SUCCESS: usize = 0x18AE4030; -const STATICS: usize = 0x4E072F0; -const STATIC_ID: usize = 34344; -const FIELD_OFFSET: usize = 0x48; +const ON_COMBO_INIT_SUCCESS: usize = 0x1ACA72F0; +const STATICS: usize = 0x5552100; +const STATIC_ID: usize = 34512; +const FIELD_OFFSET: usize = 64; pub struct HoyopassPatch; diff --git a/vivian/src/modules/network.rs b/vivian/src/modules/network.rs index ea56e98..b39299d 100644 --- a/vivian/src/modules/network.rs +++ b/vivian/src/modules/network.rs @@ -2,11 +2,12 @@ use std::ffi::CString; use ilhook::x64::Registers; -use crate::util::{self, import}; +use crate::util::{self, import, read_csharp_string}; use super::{ModuleInitError, NapModule, NapModuleContext}; -const MAKE_INITIAL_URL: usize = 0x1ACB6C70; +const MAKE_INITIAL_URL: usize = 0x1D1458E0; +const WEB_REQUEST_CREATE: usize = 0x1CC2D2A0; pub struct Network; @@ -17,11 +18,26 @@ impl NapModule for NapModuleContext { Network::on_make_initial_url, )?; + self.interceptor.attach( + self.base.wrapping_add(WEB_REQUEST_CREATE), + on_web_request_create, + )?; + Ok(()) } } -import!(il2cpp_string_new(cstr: *const u8) -> usize = 0x1242D60); +unsafe extern "win64" fn on_web_request_create(reg: *mut Registers, _: usize) { + let s = read_csharp_string((*reg).rcx as usize); + if s.contains("StandaloneWindows64/cn/") { + let s = s.replace("StandaloneWindows64/cn/", "StandaloneWindows64/oversea/"); + println!("replaced: {s}"); + (*reg).rcx = + il2cpp_string_new(CString::new(s).unwrap().to_bytes_with_nul().as_ptr()) as u64; + } +} + +import!(il2cpp_string_new(cstr: *const u8) -> usize = 0x115F1B0); impl Network { const SDK_URL: &str = "http://127.0.0.1:20100"; -- 2.34.1 From 116f38a2c7fc39b9fe92440fb58f55313e426b32 Mon Sep 17 00:00:00 2001 From: traffic95 Date: Sat, 24 May 2025 02:06:32 +0200 Subject: [PATCH 2/6] CNBeta2.0.4 RSA SDK missing offset --- vivian/src/modules/crypto.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vivian/src/modules/crypto.rs b/vivian/src/modules/crypto.rs index a141a50..3a8b714 100644 --- a/vivian/src/modules/crypto.rs +++ b/vivian/src/modules/crypto.rs @@ -33,7 +33,7 @@ pub unsafe fn initialize_rsa_public_key() { pub unsafe fn replace_sdk_public_key_string_literal() { const SDK_PUBLIC_KEY: &str = include_str!("../../sdk_public_key.xml"); - *(GAME_ASSEMBLY_BASE.wrapping_add(0x53D49C0) as *mut usize) = il2cpp_string_new( + *(GAME_ASSEMBLY_BASE.wrapping_add(0x5954398) as *mut usize) = il2cpp_string_new( CString::new(SDK_PUBLIC_KEY) .unwrap() .to_bytes_with_nul() -- 2.34.1 From 747091ba61a3f4e8a944997fc73407eee0a5fdd0 Mon Sep 17 00:00:00 2001 From: xeon Date: Sun, 25 May 2025 04:42:55 +0300 Subject: [PATCH 3/6] Implement Censorship Patch --- vivian/src/lib.rs | 7 +++- vivian/src/modules/censorship_patch.rs | 57 ++++++++++++++++++++++++++ vivian/src/modules/mod.rs | 1 + 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 vivian/src/modules/censorship_patch.rs diff --git a/vivian/src/lib.rs b/vivian/src/lib.rs index 1999791..e008517 100644 --- a/vivian/src/lib.rs +++ b/vivian/src/lib.rs @@ -2,6 +2,7 @@ use std::{thread, time::Duration}; use interceptor::Interceptor; use modules::{ + censorship_patch::CensorshipPatch, crypto::{ initialize_rsa_public_key, monitor_network_state, replace_sdk_public_key_string_literal, }, @@ -32,11 +33,15 @@ unsafe fn thread_fn() { util::disable_memory_protection(); println!("vivian-patch (2.0.4 BETA) is initializing"); - println!("to work with vivian-rs: https://git.xeondev.com/traffic95/vivian-rs/src/branch/CNBeta2.0.4"); + + println!( + "to work with vivian-rs: https://git.xeondev.com/vivian-rs/vivian-rs/src/branch/2.0_beta" + ); let mut module_manager = NapModuleManager::default(); module_manager.add::(); module_manager.add::(); + module_manager.add::(); module_manager.init().expect("failed to initialize modules"); initialize_rsa_public_key(); diff --git a/vivian/src/modules/censorship_patch.rs b/vivian/src/modules/censorship_patch.rs new file mode 100644 index 0000000..4b98f4b --- /dev/null +++ b/vivian/src/modules/censorship_patch.rs @@ -0,0 +1,57 @@ +use ilhook::x64::Registers; +use std::sync::atomic::{AtomicU32, Ordering}; + +use super::{ModuleInitError, NapModule, NapModuleContext}; + +const SET_DITHER_CONFIG: usize = 0x8DF8980; +const DITHER_CONFIG_AVATAR_USING_DITHER_ALPHA: usize = 0x41; + +const ON_ENTER_SCENE_SC_NOTIFY: usize = 0x83862A0; +const ENTER_SCENE_SC_NOTIFY_SCENE_DATA: usize = 0x18; +const SCENE_DATA_SCENE_TYPE: usize = 0x6C; +const SCENE_TYPE_HALL: u32 = 1; + +static LAST_ENTER_SCENE_TYPE: AtomicU32 = AtomicU32::new(0); + +pub struct CensorshipPatch; + +impl NapModule for NapModuleContext { + unsafe fn init(&mut self) -> Result<(), ModuleInitError> { + self.interceptor.attach( + self.base.wrapping_add(SET_DITHER_CONFIG), + CensorshipPatch::on_set_dither_config, + )?; + + self.interceptor.attach( + self.base.wrapping_add(ON_ENTER_SCENE_SC_NOTIFY), + CensorshipPatch::on_enter_scene_sc_notify, + )?; + + Ok(()) + } +} + +impl CensorshipPatch { + pub unsafe extern "win64" fn on_set_dither_config(reg: *mut Registers, _: usize) { + if LAST_ENTER_SCENE_TYPE.load(Ordering::SeqCst) == SCENE_TYPE_HALL { + println!("SetDitherConfig: disabling dither alpha"); + *(((*reg).rdx as *mut u8).wrapping_add(DITHER_CONFIG_AVATAR_USING_DITHER_ALPHA)) = 0; + } else { + println!("SetDitherConfig: not in hall, ignoring"); + } + } + + pub unsafe extern "win64" fn on_enter_scene_sc_notify(reg: *mut Registers, _: usize) { + let scene_data = *((*reg).rdx as *const u8) + .wrapping_add(ENTER_SCENE_SC_NOTIFY_SCENE_DATA) + .cast::(); + + let scene_type = *(scene_data as *const u8) + .wrapping_add(SCENE_DATA_SCENE_TYPE) + .cast::(); + + println!("EnterSceneScNotify scene_type: {scene_type}"); + + LAST_ENTER_SCENE_TYPE.store(scene_type, Ordering::SeqCst); + } +} diff --git a/vivian/src/modules/mod.rs b/vivian/src/modules/mod.rs index 90e08b9..1359c0f 100644 --- a/vivian/src/modules/mod.rs +++ b/vivian/src/modules/mod.rs @@ -2,6 +2,7 @@ use std::marker::PhantomData; use crate::{interceptor::Interceptor, util}; +pub mod censorship_patch; pub mod crypto; pub mod hoyopass_patch; pub mod network; -- 2.34.1 From 25a6caf0a338b61eb313ba2f81d03799ff063e23 Mon Sep 17 00:00:00 2001 From: xeon Date: Sun, 25 May 2025 19:18:07 +0300 Subject: [PATCH 4/6] fix: add null check for DitherConfig argument --- vivian/src/modules/censorship_patch.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/vivian/src/modules/censorship_patch.rs b/vivian/src/modules/censorship_patch.rs index 4b98f4b..aed303e 100644 --- a/vivian/src/modules/censorship_patch.rs +++ b/vivian/src/modules/censorship_patch.rs @@ -34,8 +34,10 @@ impl NapModule for NapModuleContext { impl CensorshipPatch { pub unsafe extern "win64" fn on_set_dither_config(reg: *mut Registers, _: usize) { if LAST_ENTER_SCENE_TYPE.load(Ordering::SeqCst) == SCENE_TYPE_HALL { - println!("SetDitherConfig: disabling dither alpha"); - *(((*reg).rdx as *mut u8).wrapping_add(DITHER_CONFIG_AVATAR_USING_DITHER_ALPHA)) = 0; + if (*reg).rdx != 0 { + println!("SetDitherConfig: disabling dither alpha"); + *(((*reg).rdx as *mut u8).wrapping_add(DITHER_CONFIG_AVATAR_USING_DITHER_ALPHA)) = 0; + } } else { println!("SetDitherConfig: not in hall, ignoring"); } -- 2.34.1 From 0ca6e1ebda8184029ad2e952b7e4bcc82caa61d4 Mon Sep 17 00:00:00 2001 From: traffic95 Date: Mon, 26 May 2025 17:06:28 +0200 Subject: [PATCH 5/6] CNBetaWin2.0.5 support --- vivian/src/lib.rs | 4 +++- vivian/src/modules/censorship_patch.rs | 6 +++--- vivian/src/modules/crypto.rs | 30 ++++++++++++++++++++------ vivian/src/modules/hoyopass_patch.rs | 8 +++---- vivian/src/modules/network.rs | 6 +++--- 5 files changed, 37 insertions(+), 17 deletions(-) diff --git a/vivian/src/lib.rs b/vivian/src/lib.rs index e008517..f5c5dd3 100644 --- a/vivian/src/lib.rs +++ b/vivian/src/lib.rs @@ -32,12 +32,14 @@ unsafe fn thread_fn() { thread::sleep(Duration::from_secs(5)); util::disable_memory_protection(); - println!("vivian-patch (2.0.4 BETA) is initializing"); + println!("vivian-patch (2.0.5 BETA) is initializing"); println!( "to work with vivian-rs: https://git.xeondev.com/vivian-rs/vivian-rs/src/branch/2.0_beta" ); + println!("\nJoin us on Discord at https://discord.gg/reversedrooms\n\n\n"); + let mut module_manager = NapModuleManager::default(); module_manager.add::(); module_manager.add::(); diff --git a/vivian/src/modules/censorship_patch.rs b/vivian/src/modules/censorship_patch.rs index aed303e..ff10d27 100644 --- a/vivian/src/modules/censorship_patch.rs +++ b/vivian/src/modules/censorship_patch.rs @@ -3,11 +3,11 @@ use std::sync::atomic::{AtomicU32, Ordering}; use super::{ModuleInitError, NapModule, NapModuleContext}; -const SET_DITHER_CONFIG: usize = 0x8DF8980; +const SET_DITHER_CONFIG: usize = 0x86FE960; const DITHER_CONFIG_AVATAR_USING_DITHER_ALPHA: usize = 0x41; -const ON_ENTER_SCENE_SC_NOTIFY: usize = 0x83862A0; -const ENTER_SCENE_SC_NOTIFY_SCENE_DATA: usize = 0x18; +const ON_ENTER_SCENE_SC_NOTIFY: usize = 0x85088C0; +const ENTER_SCENE_SC_NOTIFY_SCENE_DATA: usize = 0x20; const SCENE_DATA_SCENE_TYPE: usize = 0x6C; const SCENE_TYPE_HALL: u32 = 1; diff --git a/vivian/src/modules/crypto.rs b/vivian/src/modules/crypto.rs index 3a8b714..93b77ef 100644 --- a/vivian/src/modules/crypto.rs +++ b/vivian/src/modules/crypto.rs @@ -7,14 +7,14 @@ use crate::{ util::{import, GAME_ASSEMBLY_BASE}, }; -import!(rsa_create() -> usize = 0x1B56B2E0); -import!(rsa_from_xml_string(instance: usize, xml_string: usize) -> usize = 0x1B56B520); -import!(il2cpp_string_new(cstr: *const u8) -> usize = 0x115F1B0); +import!(rsa_create() -> usize = 0x1B582F20); +import!(rsa_from_xml_string(instance: usize, xml_string: usize) -> usize = 0x1B583160); +import!(il2cpp_string_new(cstr: *const u8) -> usize = 0x1158AA0); pub unsafe fn initialize_rsa_public_key() { const SERVER_PUBLIC_KEY: &str = include_str!("../../server_public_key.xml"); let rsa_public_key_backdoor_field = - ((*(GAME_ASSEMBLY_BASE.wrapping_add(0x5552100) as *const usize)) + 252792) as *mut usize; + ((*(GAME_ASSEMBLY_BASE.wrapping_add(0x554E500) as *const usize)) + 252856) as *mut usize; let rsa = rsa_create(); rsa_from_xml_string( @@ -33,18 +33,36 @@ pub unsafe fn initialize_rsa_public_key() { pub unsafe fn replace_sdk_public_key_string_literal() { const SDK_PUBLIC_KEY: &str = include_str!("../../sdk_public_key.xml"); - *(GAME_ASSEMBLY_BASE.wrapping_add(0x5954398) as *mut usize) = il2cpp_string_new( + *(GAME_ASSEMBLY_BASE.wrapping_add(0x5950C50) as *mut usize) = il2cpp_string_new( CString::new(SDK_PUBLIC_KEY) .unwrap() .to_bytes_with_nul() .as_ptr(), ) as usize; + + *(GAME_ASSEMBLY_BASE.wrapping_add(0x5974060) as *mut usize) = il2cpp_string_new( + [27818, 40348, 47410, 27936, 51394, 33172, 51987, 8709, 44748, + 23705, 45753, 21092, 57054, 52661, 369, 62630, 11725, 7496, 36921, 28271, + 34880, 52645, 31515, 18214, 3108, 2077, 13490, 25459, 58590, 47504, 15163, + 8951, 44748, 23705, 45753, 29284, 57054, 52661] + .into_iter() + .enumerate() + .flat_map(|(i, v)| { + let b = (((i + ((i >> 31) >> 29)) & 0xF8).wrapping_sub(i)) as i16; + (((v << ((b + 11) & 0xF)) | (v >> ((-11 - b) & 0xF))) & 0xFFFF_u16) + .to_be_bytes() + .into_iter() + }) + .chain([0]) + .collect::>() + .as_ptr(), + ) as usize; } pub unsafe fn monitor_network_state(interceptor: &mut Interceptor) { interceptor .attach( - GAME_ASSEMBLY_BASE.wrapping_add(0xD8AAEC0), + GAME_ASSEMBLY_BASE.wrapping_add(0xDE96720), on_network_state_change, ) .unwrap(); diff --git a/vivian/src/modules/hoyopass_patch.rs b/vivian/src/modules/hoyopass_patch.rs index 27f5abf..a6b4b5a 100644 --- a/vivian/src/modules/hoyopass_patch.rs +++ b/vivian/src/modules/hoyopass_patch.rs @@ -4,10 +4,10 @@ use crate::util::GAME_ASSEMBLY_BASE; use super::{ModuleInitError, NapModule, NapModuleContext}; -const ON_COMBO_INIT_SUCCESS: usize = 0x1ACA72F0; -const STATICS: usize = 0x5552100; -const STATIC_ID: usize = 34512; -const FIELD_OFFSET: usize = 64; +const ON_COMBO_INIT_SUCCESS: usize = 0x1ACCE700; +const STATICS: usize = 0x554E500; +const STATIC_ID: usize = 34496; +const FIELD_OFFSET: usize = 0x44; pub struct HoyopassPatch; diff --git a/vivian/src/modules/network.rs b/vivian/src/modules/network.rs index b39299d..2137bf6 100644 --- a/vivian/src/modules/network.rs +++ b/vivian/src/modules/network.rs @@ -6,8 +6,8 @@ use crate::util::{self, import, read_csharp_string}; use super::{ModuleInitError, NapModule, NapModuleContext}; -const MAKE_INITIAL_URL: usize = 0x1D1458E0; -const WEB_REQUEST_CREATE: usize = 0x1CC2D2A0; +const MAKE_INITIAL_URL: usize = 0x1D172280; +const WEB_REQUEST_CREATE: usize = 0x1CC5EC00; pub struct Network; @@ -37,7 +37,7 @@ unsafe extern "win64" fn on_web_request_create(reg: *mut Registers, _: usize) { } } -import!(il2cpp_string_new(cstr: *const u8) -> usize = 0x115F1B0); +import!(il2cpp_string_new(cstr: *const u8) -> usize = 0x1158AA0); impl Network { const SDK_URL: &str = "http://127.0.0.1:20100"; -- 2.34.1 From ac9d18fda254e67b81bb77278c0f0e30bc83165a Mon Sep 17 00:00:00 2001 From: xeon Date: Tue, 3 Jun 2025 19:32:56 +0300 Subject: [PATCH 6/6] OSPRODWin2.0.0 support --- Cargo.lock | 20 ++++++++-------- Cargo.toml | 2 +- launcher/src/main.rs | 4 ++-- {vivian => yixuan}/Cargo.toml | 4 ++-- {vivian => yixuan}/sdk_public_key.xml | 0 {vivian => yixuan}/server_public_key.xml | 0 {vivian => yixuan}/src/interceptor.rs | 0 {vivian => yixuan}/src/lib.rs | 4 ++-- .../src/modules/censorship_patch.rs | 10 ++++---- {vivian => yixuan}/src/modules/crypto.rs | 24 ++++++++++--------- .../src/modules/hoyopass_patch.rs | 8 +++---- {vivian => yixuan}/src/modules/mod.rs | 0 {vivian => yixuan}/src/modules/network.rs | 6 ++--- {vivian => yixuan}/src/util.rs | 0 14 files changed, 42 insertions(+), 40 deletions(-) rename {vivian => yixuan}/Cargo.toml (92%) rename {vivian => yixuan}/sdk_public_key.xml (100%) rename {vivian => yixuan}/server_public_key.xml (100%) rename {vivian => yixuan}/src/interceptor.rs (100%) rename {vivian => yixuan}/src/lib.rs (91%) rename {vivian => yixuan}/src/modules/censorship_patch.rs (87%) rename {vivian => yixuan}/src/modules/crypto.rs (77%) rename {vivian => yixuan}/src/modules/hoyopass_patch.rs (85%) rename {vivian => yixuan}/src/modules/mod.rs (100%) rename {vivian => yixuan}/src/modules/network.rs (93%) rename {vivian => yixuan}/src/util.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index f2fcc01..76da875 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -239,16 +239,6 @@ version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" -[[package]] -name = "vivian" -version = "0.0.1" -dependencies = [ - "ilhook", - "num_enum", - "thiserror 2.0.11", - "windows", -] - [[package]] name = "windows" version = "0.59.0" @@ -441,3 +431,13 @@ checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] + +[[package]] +name = "yixuan" +version = "0.0.1" +dependencies = [ + "ilhook", + "num_enum", + "thiserror 2.0.11", + "windows", +] diff --git a/Cargo.toml b/Cargo.toml index 5d54228..4fcf09b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["launcher", "vivian"] +members = ["launcher", "yixuan"] resolver = "2" [workspace.package] diff --git a/launcher/src/main.rs b/launcher/src/main.rs index b611481..115c797 100644 --- a/launcher/src/main.rs +++ b/launcher/src/main.rs @@ -12,8 +12,8 @@ use windows::Win32::System::Threading::{ PROCESS_INFORMATION, STARTUPINFOA, }; -const GAME_EXECUTABLE: PCSTR = s!("ZenlessZoneZeroBeta.exe"); -const INJECT_DLL: &str = "vivian.dll"; +const GAME_EXECUTABLE: PCSTR = s!("ZenlessZoneZero.exe"); +const INJECT_DLL: &str = "yixuan.dll"; fn inject_standard(h_target: HANDLE, dll_path: &str) -> bool { unsafe { diff --git a/vivian/Cargo.toml b/yixuan/Cargo.toml similarity index 92% rename from vivian/Cargo.toml rename to yixuan/Cargo.toml index 0c1333e..5069389 100644 --- a/vivian/Cargo.toml +++ b/yixuan/Cargo.toml @@ -1,10 +1,10 @@ [package] -name = "vivian" +name = "yixuan" edition = "2021" version.workspace = true [lib] -name = "vivian" +name = "yixuan" crate-type = ["cdylib"] [dependencies] diff --git a/vivian/sdk_public_key.xml b/yixuan/sdk_public_key.xml similarity index 100% rename from vivian/sdk_public_key.xml rename to yixuan/sdk_public_key.xml diff --git a/vivian/server_public_key.xml b/yixuan/server_public_key.xml similarity index 100% rename from vivian/server_public_key.xml rename to yixuan/server_public_key.xml diff --git a/vivian/src/interceptor.rs b/yixuan/src/interceptor.rs similarity index 100% rename from vivian/src/interceptor.rs rename to yixuan/src/interceptor.rs diff --git a/vivian/src/lib.rs b/yixuan/src/lib.rs similarity index 91% rename from vivian/src/lib.rs rename to yixuan/src/lib.rs index f5c5dd3..a405898 100644 --- a/vivian/src/lib.rs +++ b/yixuan/src/lib.rs @@ -32,10 +32,10 @@ unsafe fn thread_fn() { thread::sleep(Duration::from_secs(5)); util::disable_memory_protection(); - println!("vivian-patch (2.0.5 BETA) is initializing"); + println!("yixuan-patch (2.0.0 PROD) is initializing"); println!( - "to work with vivian-rs: https://git.xeondev.com/vivian-rs/vivian-rs/src/branch/2.0_beta" + "to work with yixuan-rs: https://git.xeondev.com/yixuan-rs/yixuan-rs" ); println!("\nJoin us on Discord at https://discord.gg/reversedrooms\n\n\n"); diff --git a/vivian/src/modules/censorship_patch.rs b/yixuan/src/modules/censorship_patch.rs similarity index 87% rename from vivian/src/modules/censorship_patch.rs rename to yixuan/src/modules/censorship_patch.rs index ff10d27..33ef0f8 100644 --- a/vivian/src/modules/censorship_patch.rs +++ b/yixuan/src/modules/censorship_patch.rs @@ -3,12 +3,12 @@ use std::sync::atomic::{AtomicU32, Ordering}; use super::{ModuleInitError, NapModule, NapModuleContext}; -const SET_DITHER_CONFIG: usize = 0x86FE960; -const DITHER_CONFIG_AVATAR_USING_DITHER_ALPHA: usize = 0x41; +const SET_DITHER_CONFIG: usize = 0x8CA93D0; +const DITHER_CONFIG_AVATAR_USING_DITHER_ALPHA: usize = 0x49; -const ON_ENTER_SCENE_SC_NOTIFY: usize = 0x85088C0; -const ENTER_SCENE_SC_NOTIFY_SCENE_DATA: usize = 0x20; -const SCENE_DATA_SCENE_TYPE: usize = 0x6C; +const ON_ENTER_SCENE_SC_NOTIFY: usize = 0x86E6F80; +const ENTER_SCENE_SC_NOTIFY_SCENE_DATA: usize = 0x10; +const SCENE_DATA_SCENE_TYPE: usize = 0x74; const SCENE_TYPE_HALL: u32 = 1; static LAST_ENTER_SCENE_TYPE: AtomicU32 = AtomicU32::new(0); diff --git a/vivian/src/modules/crypto.rs b/yixuan/src/modules/crypto.rs similarity index 77% rename from vivian/src/modules/crypto.rs rename to yixuan/src/modules/crypto.rs index 93b77ef..6a88840 100644 --- a/vivian/src/modules/crypto.rs +++ b/yixuan/src/modules/crypto.rs @@ -7,14 +7,14 @@ use crate::{ util::{import, GAME_ASSEMBLY_BASE}, }; -import!(rsa_create() -> usize = 0x1B582F20); -import!(rsa_from_xml_string(instance: usize, xml_string: usize) -> usize = 0x1B583160); -import!(il2cpp_string_new(cstr: *const u8) -> usize = 0x1158AA0); +import!(rsa_create() -> usize = 0x1B56F0F0); +import!(rsa_from_xml_string(instance: usize, xml_string: usize) -> usize = 0x1B56F330); +import!(il2cpp_string_new(cstr: *const u8) -> usize = 0x115CCC0); pub unsafe fn initialize_rsa_public_key() { const SERVER_PUBLIC_KEY: &str = include_str!("../../server_public_key.xml"); let rsa_public_key_backdoor_field = - ((*(GAME_ASSEMBLY_BASE.wrapping_add(0x554E500) as *const usize)) + 252856) as *mut usize; + ((*(GAME_ASSEMBLY_BASE.wrapping_add(0x5550778) as *const usize)) + 252784) as *mut usize; let rsa = rsa_create(); rsa_from_xml_string( @@ -33,18 +33,20 @@ pub unsafe fn initialize_rsa_public_key() { pub unsafe fn replace_sdk_public_key_string_literal() { const SDK_PUBLIC_KEY: &str = include_str!("../../sdk_public_key.xml"); - *(GAME_ASSEMBLY_BASE.wrapping_add(0x5950C50) as *mut usize) = il2cpp_string_new( + *(GAME_ASSEMBLY_BASE.wrapping_add(0x5952CA8) as *mut usize) = il2cpp_string_new( CString::new(SDK_PUBLIC_KEY) .unwrap() .to_bytes_with_nul() .as_ptr(), ) as usize; - *(GAME_ASSEMBLY_BASE.wrapping_add(0x5974060) as *mut usize) = il2cpp_string_new( - [27818, 40348, 47410, 27936, 51394, 33172, 51987, 8709, 44748, - 23705, 45753, 21092, 57054, 52661, 369, 62630, 11725, 7496, 36921, 28271, - 34880, 52645, 31515, 18214, 3108, 2077, 13490, 25459, 58590, 47504, 15163, - 8951, 44748, 23705, 45753, 29284, 57054, 52661] + *(GAME_ASSEMBLY_BASE.wrapping_add(0x59760D0) as *mut usize) = il2cpp_string_new( + [ + 27818, 40348, 47410, 27936, 51394, 33172, 51987, 8709, 44748, 23705, 45753, 21092, + 57054, 52661, 369, 62630, 11725, 7496, 36921, 28271, 34880, 52645, 31515, 18214, 3108, + 2077, 13490, 25459, 58590, 47504, 15163, 8951, 44748, 23705, 45753, 29284, 57054, + 52661, 43266, 17556, 17415, 52254, 32830, + ] .into_iter() .enumerate() .flat_map(|(i, v)| { @@ -62,7 +64,7 @@ pub unsafe fn replace_sdk_public_key_string_literal() { pub unsafe fn monitor_network_state(interceptor: &mut Interceptor) { interceptor .attach( - GAME_ASSEMBLY_BASE.wrapping_add(0xDE96720), + GAME_ASSEMBLY_BASE.wrapping_add(0xDE28090), on_network_state_change, ) .unwrap(); diff --git a/vivian/src/modules/hoyopass_patch.rs b/yixuan/src/modules/hoyopass_patch.rs similarity index 85% rename from vivian/src/modules/hoyopass_patch.rs rename to yixuan/src/modules/hoyopass_patch.rs index a6b4b5a..99491d1 100644 --- a/vivian/src/modules/hoyopass_patch.rs +++ b/yixuan/src/modules/hoyopass_patch.rs @@ -4,10 +4,10 @@ use crate::util::GAME_ASSEMBLY_BASE; use super::{ModuleInitError, NapModule, NapModuleContext}; -const ON_COMBO_INIT_SUCCESS: usize = 0x1ACCE700; -const STATICS: usize = 0x554E500; -const STATIC_ID: usize = 34496; -const FIELD_OFFSET: usize = 0x44; +const ON_COMBO_INIT_SUCCESS: usize = 0x1ACAB470; +const STATICS: usize = 0x5550778; +const STATIC_ID: usize = 34512; +const FIELD_OFFSET: usize = 0x40; pub struct HoyopassPatch; diff --git a/vivian/src/modules/mod.rs b/yixuan/src/modules/mod.rs similarity index 100% rename from vivian/src/modules/mod.rs rename to yixuan/src/modules/mod.rs diff --git a/vivian/src/modules/network.rs b/yixuan/src/modules/network.rs similarity index 93% rename from vivian/src/modules/network.rs rename to yixuan/src/modules/network.rs index 2137bf6..096a004 100644 --- a/vivian/src/modules/network.rs +++ b/yixuan/src/modules/network.rs @@ -6,8 +6,8 @@ use crate::util::{self, import, read_csharp_string}; use super::{ModuleInitError, NapModule, NapModuleContext}; -const MAKE_INITIAL_URL: usize = 0x1D172280; -const WEB_REQUEST_CREATE: usize = 0x1CC5EC00; +const MAKE_INITIAL_URL: usize = 0x1D14BCE0; +const WEB_REQUEST_CREATE: usize = 0x1CC33EF0; pub struct Network; @@ -37,7 +37,7 @@ unsafe extern "win64" fn on_web_request_create(reg: *mut Registers, _: usize) { } } -import!(il2cpp_string_new(cstr: *const u8) -> usize = 0x1158AA0); +import!(il2cpp_string_new(cstr: *const u8) -> usize = 0x115CCC0); impl Network { const SDK_URL: &str = "http://127.0.0.1:20100"; diff --git a/vivian/src/util.rs b/yixuan/src/util.rs similarity index 100% rename from vivian/src/util.rs rename to yixuan/src/util.rs -- 2.34.1