diff --git a/hkrpg/src/interceptor.rs b/hkrpg/src/interceptor.rs index e7124a4..dfd3782 100644 --- a/hkrpg/src/interceptor.rs +++ b/hkrpg/src/interceptor.rs @@ -2,13 +2,16 @@ use ilhook::x64::{ CallbackOption, HookFlags, HookPoint, HookType, Hooker, JmpBackRoutine, RetnRoutine, }; -#[derive(Default)] pub struct Interceptor { hooks: Vec, } type Result = std::result::Result; impl Interceptor { + pub const fn new() -> Self { + Interceptor { hooks: Vec::new() } + } + pub fn attach(&mut self, addr: usize, routine: JmpBackRoutine) -> Result<()> { let hooker = Hooker::new( addr, diff --git a/hkrpg/src/lib.rs b/hkrpg/src/lib.rs index 27c14f7..12bd31e 100644 --- a/hkrpg/src/lib.rs +++ b/hkrpg/src/lib.rs @@ -4,7 +4,7 @@ use std::{thread, time::Duration}; use modules::{ HkrpgModuleManager, censorship_patch::CensorshipPatch, crypto::Crypto, hk_check::HkCheck, - network::Network, + misc::Misc, network::Network, }; use windows::{ Win32::System::{Console, LibraryLoader::GetModuleHandleA}, @@ -27,6 +27,11 @@ pub fn main() { thread::sleep(Duration::from_millis(200)); } + let mut mm1 = HkrpgModuleManager::default(); + mm1.add::(); + mm1.init() + .expect("[hkrpg::main] failed to initialize module (Misc)"); + addr::init_rvas(); let mut module_manager = HkrpgModuleManager::default(); diff --git a/hkrpg/src/modules/hk_check.rs b/hkrpg/src/modules/hk_check.rs index 889e01d..f5ccce2 100644 --- a/hkrpg/src/modules/hk_check.rs +++ b/hkrpg/src/modules/hk_check.rs @@ -10,14 +10,10 @@ impl HkrpgModule for HkrpgModuleContext { unsafe fn init(&mut self) -> Result<(), ilhook::HookError> { let config = rva_config(); if config.hk_check1 != 0 && config.hk_check2 != 0 { - self.interceptor.replace( - self.base.wrapping_add(config.hk_check1), - HkCheck::replacement, - )?; - self.interceptor.replace( - self.base.wrapping_add(config.hk_check2), - HkCheck::replacement, - )?; + self.interceptor + .replace(config.hk_check1, HkCheck::replacement)?; + self.interceptor + .replace(config.hk_check2, HkCheck::replacement)?; println!("[hk_check::init] hk_check bypassed") } Ok(()) diff --git a/hkrpg/src/modules/misc.rs b/hkrpg/src/modules/misc.rs new file mode 100644 index 0000000..5afdb67 --- /dev/null +++ b/hkrpg/src/modules/misc.rs @@ -0,0 +1,39 @@ +use crate::modules::{HkrpgModule, HkrpgModuleContext}; +use ilhook::x64::Registers; +use std::ffi::CStr; +use windows::{ + Win32::System::LibraryLoader::{GetModuleHandleA, GetProcAddress}, + core::s, +}; + +pub struct Misc; + +impl HkrpgModule for HkrpgModuleContext { + unsafe fn init(&mut self) -> Result<(), ilhook::HookError> { + unsafe { + let ws32 = GetModuleHandleA(s!("Ws2_32.dll")).unwrap(); + let get_addr_info = GetProcAddress(ws32, s!("getaddrinfo")).unwrap(); + self.interceptor + .attach(get_addr_info as usize, Misc::on_get_addr_info)?; + + println!("[misc::init] initialized") + } + + Ok(()) + } +} + +impl Misc { + pub unsafe extern "win64" fn on_get_addr_info(reg: *mut Registers, _: usize) { + unsafe { + let host = CStr::from_ptr((*reg).rcx as *const i8).to_string_lossy(); + + if host.contains("globaldp-") + && (host.contains("bhsr.com") || host.contains("starrails.com")) + { + println!("[*] [on_get_addr_info] {host} -> 0.0.0.0"); + std::ptr::copy_nonoverlapping(c"0.0.0.0".as_ptr(), (*reg).rcx as *mut i8, 9); + } + } + } +} diff --git a/hkrpg/src/modules/mod.rs b/hkrpg/src/modules/mod.rs index 5ce56a8..497852a 100644 --- a/hkrpg/src/modules/mod.rs +++ b/hkrpg/src/modules/mod.rs @@ -6,9 +6,10 @@ pub mod censorship_patch; pub mod crypto; pub mod hk_check; pub mod network; +pub mod misc; pub struct HkrpgModuleContext { - base: usize, + _base: usize, interceptor: Interceptor, _module_type: PhantomData, } @@ -16,8 +17,8 @@ pub struct HkrpgModuleContext { impl HkrpgModuleContext { fn new(base: usize) -> Self { Self { - base, - interceptor: Interceptor::default(), + _base: base, + interceptor: Interceptor::new(), _module_type: PhantomData, } }