fix: fixed client damaged error
This commit is contained in:
@@ -2,13 +2,16 @@ use ilhook::x64::{
|
|||||||
CallbackOption, HookFlags, HookPoint, HookType, Hooker, JmpBackRoutine, RetnRoutine,
|
CallbackOption, HookFlags, HookPoint, HookType, Hooker, JmpBackRoutine, RetnRoutine,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Default)]
|
|
||||||
pub struct Interceptor {
|
pub struct Interceptor {
|
||||||
hooks: Vec<HookPoint>,
|
hooks: Vec<HookPoint>,
|
||||||
}
|
}
|
||||||
|
|
||||||
type Result<T> = std::result::Result<T, ilhook::HookError>;
|
type Result<T> = std::result::Result<T, ilhook::HookError>;
|
||||||
impl Interceptor {
|
impl Interceptor {
|
||||||
|
pub const fn new() -> Self {
|
||||||
|
Interceptor { hooks: Vec::new() }
|
||||||
|
}
|
||||||
|
|
||||||
pub fn attach(&mut self, addr: usize, routine: JmpBackRoutine) -> Result<()> {
|
pub fn attach(&mut self, addr: usize, routine: JmpBackRoutine) -> Result<()> {
|
||||||
let hooker = Hooker::new(
|
let hooker = Hooker::new(
|
||||||
addr,
|
addr,
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ use std::{thread, time::Duration};
|
|||||||
|
|
||||||
use modules::{
|
use modules::{
|
||||||
HkrpgModuleManager, censorship_patch::CensorshipPatch, crypto::Crypto, hk_check::HkCheck,
|
HkrpgModuleManager, censorship_patch::CensorshipPatch, crypto::Crypto, hk_check::HkCheck,
|
||||||
network::Network,
|
misc::Misc, network::Network,
|
||||||
};
|
};
|
||||||
use windows::{
|
use windows::{
|
||||||
Win32::System::{Console, LibraryLoader::GetModuleHandleA},
|
Win32::System::{Console, LibraryLoader::GetModuleHandleA},
|
||||||
@@ -27,6 +27,11 @@ pub fn main() {
|
|||||||
thread::sleep(Duration::from_millis(200));
|
thread::sleep(Duration::from_millis(200));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut mm1 = HkrpgModuleManager::default();
|
||||||
|
mm1.add::<Misc>();
|
||||||
|
mm1.init()
|
||||||
|
.expect("[hkrpg::main] failed to initialize module (Misc)");
|
||||||
|
|
||||||
addr::init_rvas();
|
addr::init_rvas();
|
||||||
|
|
||||||
let mut module_manager = HkrpgModuleManager::default();
|
let mut module_manager = HkrpgModuleManager::default();
|
||||||
|
|||||||
@@ -10,14 +10,10 @@ impl HkrpgModule for HkrpgModuleContext<HkCheck> {
|
|||||||
unsafe fn init(&mut self) -> Result<(), ilhook::HookError> {
|
unsafe fn init(&mut self) -> Result<(), ilhook::HookError> {
|
||||||
let config = rva_config();
|
let config = rva_config();
|
||||||
if config.hk_check1 != 0 && config.hk_check2 != 0 {
|
if config.hk_check1 != 0 && config.hk_check2 != 0 {
|
||||||
self.interceptor.replace(
|
self.interceptor
|
||||||
self.base.wrapping_add(config.hk_check1),
|
.replace(config.hk_check1, HkCheck::replacement)?;
|
||||||
HkCheck::replacement,
|
self.interceptor
|
||||||
)?;
|
.replace(config.hk_check2, HkCheck::replacement)?;
|
||||||
self.interceptor.replace(
|
|
||||||
self.base.wrapping_add(config.hk_check2),
|
|
||||||
HkCheck::replacement,
|
|
||||||
)?;
|
|
||||||
println!("[hk_check::init] hk_check bypassed")
|
println!("[hk_check::init] hk_check bypassed")
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
39
hkrpg/src/modules/misc.rs
Normal file
39
hkrpg/src/modules/misc.rs
Normal file
@@ -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<Misc> {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,9 +6,10 @@ pub mod censorship_patch;
|
|||||||
pub mod crypto;
|
pub mod crypto;
|
||||||
pub mod hk_check;
|
pub mod hk_check;
|
||||||
pub mod network;
|
pub mod network;
|
||||||
|
pub mod misc;
|
||||||
|
|
||||||
pub struct HkrpgModuleContext<T> {
|
pub struct HkrpgModuleContext<T> {
|
||||||
base: usize,
|
_base: usize,
|
||||||
interceptor: Interceptor,
|
interceptor: Interceptor,
|
||||||
_module_type: PhantomData<T>,
|
_module_type: PhantomData<T>,
|
||||||
}
|
}
|
||||||
@@ -16,8 +17,8 @@ pub struct HkrpgModuleContext<T> {
|
|||||||
impl<T> HkrpgModuleContext<T> {
|
impl<T> HkrpgModuleContext<T> {
|
||||||
fn new(base: usize) -> Self {
|
fn new(base: usize) -> Self {
|
||||||
Self {
|
Self {
|
||||||
base,
|
_base: base,
|
||||||
interceptor: Interceptor::default(),
|
interceptor: Interceptor::new(),
|
||||||
_module_type: PhantomData,
|
_module_type: PhantomData,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user