diff --git a/hkrpg/src/addr.rs b/hkrpg/src/addr.rs index 8c60261..d43255c 100644 --- a/hkrpg/src/addr.rs +++ b/hkrpg/src/addr.rs @@ -4,10 +4,13 @@ use windows::{Win32::System::LibraryLoader::GetModuleHandleA, core::s}; use crate::util::scan_il2cpp_section; -const IL2CPP_STRING_NEW_LEN: &str = "E8 ? ? ? ? EB ? 31 C0 48 89 06 48 8B 47 ? 48 89 46 ? F2 0F 10 47"; -const MAKE_INITIAL_URL: &str = "E8 ? ? ? ? 48 89 D9 48 89 C2 E8 ? ? ? ? 48 89 D9 4C 89 FA E8 ? ? ? ? 49 89 5D"; // TODO +const IL2CPP_STRING_NEW_LEN: &str = + "E8 ? ? ? ? EB ? 31 C0 48 89 06 48 8B 47 ? 48 89 46 ? F2 0F 10 47"; +const MAKE_INITIAL_URL: &str = + "E8 ? ? ? ? 48 89 D9 48 89 C2 E8 ? ? ? ? 48 89 D9 4C 89 FA E8 ? ? ? ? 49 89 5D"; // TODO const SET_DITHER: &str = "E8 ? ? ? ? 84 C0 75 ? C7 43"; -const SDK_PUBLIC_KEY_LITERAL: &str = "48 8B 0D ? ? ? ? 4C 89 E2 E8 ? ? ? ? 48 89 C6 48 8B 0D ? ? ? ? E8 ? ? ? ? 48 89 C7 48 8B 0D"; +const SDK_PUBLIC_KEY_LITERAL: &str = + "48 8B 0D ? ? ? ? 4C 89 E2 E8 ? ? ? ? 48 89 C6 48 8B 0D ? ? ? ? E8 ? ? ? ? 48 89 C7 48 8B 0D"; // const HK_CHECK1: &str = "55 41 56 56 57 53 48 81 EC 00 01 00 00 48 8D AC 24 80 00 00 00 C7 45 7C 00 00 00 00"; // const HK_CHECK2: &str = "55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC B8 02 00 00"; @@ -36,12 +39,12 @@ pub static GAME_ASSEMBLY_BASE: LazyLock = macro_rules! set_rva { ($base:ident, $config:ident, $field:ident, $scan_fn:ident, $rva_pat:expr, $fallback:expr) => { if let Some(addr) = unsafe { $scan_fn($rva_pat) } { - $config.$field = addr - *$base; + $config.$field = addr; println!( "[hkrpg::addr::set_rva] Found relative address for {} [{}] -> 0x{:X}", stringify!($field), stringify!($base), - $config.$field + $config.$field - *$base ); } else { eprintln!( diff --git a/hkrpg/src/il2cpp_string.rs b/hkrpg/src/il2cpp_string.rs index 4ab8479..737db8c 100644 --- a/hkrpg/src/il2cpp_string.rs +++ b/hkrpg/src/il2cpp_string.rs @@ -1,6 +1,6 @@ use std::{ffi::CString, fmt::Display}; -use crate::addr::{GAME_ASSEMBLY_BASE, rva_config}; +use crate::addr::rva_config; #[repr(transparent)] pub struct Il2cppString(usize); @@ -15,7 +15,7 @@ impl Il2cppString { pub fn new(string: &str) -> Self { let func = unsafe { std::mem::transmute:: usize>( - *GAME_ASSEMBLY_BASE + rva_config().il2cpp_string_new_len, + rva_config().il2cpp_string_new_len, ) }; let len = string.len(); diff --git a/hkrpg/src/modules/censorship_patch.rs b/hkrpg/src/modules/censorship_patch.rs index 57219a5..1dcbdfe 100644 --- a/hkrpg/src/modules/censorship_patch.rs +++ b/hkrpg/src/modules/censorship_patch.rs @@ -11,7 +11,7 @@ macro_rules! replace { $( if $config.$field != 0 { $self.interceptor.replace( - $self.base.wrapping_add($config.$field), + $config.$field, CensorshipPatch::on_set_dither, )?; } else { @@ -24,11 +24,7 @@ macro_rules! replace { impl HkrpgModule for HkrpgModuleContext { unsafe fn init(&mut self) -> Result<(), ilhook::HookError> { let config = rva_config(); - replace!( - self, - config, - set_dither - ); + replace!(self, config, set_dither); Ok(()) } } diff --git a/hkrpg/src/modules/crypto.rs b/hkrpg/src/modules/crypto.rs index 66d1d21..03f74db 100644 --- a/hkrpg/src/modules/crypto.rs +++ b/hkrpg/src/modules/crypto.rs @@ -1,7 +1,4 @@ -use crate::{ - addr::{GAME_ASSEMBLY_BASE, rva_config}, - il2cpp_string::Il2cppString, -}; +use crate::{addr::rva_config, il2cpp_string::Il2cppString}; use super::{HkrpgModule, HkrpgModuleContext}; @@ -14,7 +11,7 @@ impl HkrpgModule for HkrpgModuleContext { let config = rva_config(); if config.sdk_public_key != 0 { unsafe { - *(GAME_ASSEMBLY_BASE.wrapping_add(config.sdk_public_key) as *mut Il2cppString) = + *(config.sdk_public_key as *mut Il2cppString) = Il2cppString::new(ACCOUNT_RSA_KEY_REPLACEMENT) } println!("[crypto::init] AccountRSAKey replaced") diff --git a/hkrpg/src/modules/network.rs b/hkrpg/src/modules/network.rs index bdd3903..0ead970 100644 --- a/hkrpg/src/modules/network.rs +++ b/hkrpg/src/modules/network.rs @@ -10,10 +10,8 @@ impl HkrpgModule for HkrpgModuleContext { unsafe fn init(&mut self) -> Result<(), ilhook::HookError> { let config = rva_config(); if config.make_initial_url != 0 && config.il2cpp_string_new_len != 0 { - self.interceptor.attach( - self.base.wrapping_add(config.make_initial_url), - Network::on_make_initial_url, - )?; + self.interceptor + .attach(config.make_initial_url, Network::on_make_initial_url)?; println!("[network::init] network patch enabled") } else { println!("[network::init] pattern is outdated! disabling http redirection") diff --git a/hkrpg/src/util.rs b/hkrpg/src/util.rs index 4ebef1e..3cada20 100644 --- a/hkrpg/src/util.rs +++ b/hkrpg/src/util.rs @@ -45,7 +45,8 @@ pub unsafe fn scan_il2cpp_section(pat: &str) -> Option { match slice.get(address) { // jmp sub_xxxxxxx Some(&0xE8) => { - let offset = i32::from_le_bytes(slice[address + 1..address + 5].try_into().unwrap()); + let offset = + i32::from_le_bytes(slice[address + 1..address + 5].try_into().unwrap()); GAME_ASSEMBLY_BASE.wrapping_add(address + 5 + offset as usize) } // mov rcx, [rip + offset] (0x48 0x8B 0x0D XXXXXXXX) @@ -53,7 +54,8 @@ pub unsafe fn scan_il2cpp_section(pat: &str) -> Option { if slice.get(address + 1) == Some(&0x8B) && slice.get(address + 2) == Some(&0x0D) => { - let offset = i32::from_le_bytes(slice[address + 3..address + 7].try_into().unwrap()); + let offset = + i32::from_le_bytes(slice[address + 3..address + 7].try_into().unwrap()); GAME_ASSEMBLY_BASE.wrapping_add(address + 7 + offset as usize) } _ => GAME_ASSEMBLY_BASE.wrapping_add(address), @@ -89,7 +91,25 @@ pub unsafe fn scan_il2cpp_section(pat: &str) -> Option { // pub unsafe fn scan_unity_player_section(pat: &str) -> Option { // let mut slice = unsafe { unity_player_slice() }; -// scan_first_match(&mut slice, pat) -// .unwrap() -// .map(|loc| UNITY_PLAYER_BASE.wrapping_add(loc)) +// scan_first_match(&mut slice, pat).unwrap().map(|address| { +// let slice = unsafe { unity_player_slice() }; +// match slice.get(address) { +// // jmp sub_xxxxxxx +// Some(&0xE8) => { +// let offset = +// i32::from_le_bytes(slice[address + 1..address + 5].try_into().unwrap()); +// UNITY_PLAYER_BASE.wrapping_add(address + 5 + offset as usize) +// } +// // mov rcx, [rip + offset] (0x48 0x8B 0x0D XXXXXXXX) +// Some(&0x48) +// if slice.get(address + 1) == Some(&0x8B) +// && slice.get(address + 2) == Some(&0x0D) => +// { +// let offset = +// i32::from_le_bytes(slice[address + 3..address + 7].try_into().unwrap()); +// UNITY_PLAYER_BASE.wrapping_add(address + 7 + offset as usize) +// } +// _ => UNITY_PLAYER_BASE.wrapping_add(address), +// } +// }) // }