refactor: minor changes
- use VA directly on interceptor instead of RVA
This commit is contained in:
@@ -4,10 +4,13 @@ use windows::{Win32::System::LibraryLoader::GetModuleHandleA, core::s};
|
|||||||
|
|
||||||
use crate::util::scan_il2cpp_section;
|
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 IL2CPP_STRING_NEW_LEN: &str =
|
||||||
const MAKE_INITIAL_URL: &str = "E8 ? ? ? ? 48 89 D9 48 89 C2 E8 ? ? ? ? 48 89 D9 4C 89 FA E8 ? ? ? ? 49 89 5D"; // TODO
|
"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 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_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";
|
// 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<usize> =
|
|||||||
macro_rules! set_rva {
|
macro_rules! set_rva {
|
||||||
($base:ident, $config:ident, $field:ident, $scan_fn:ident, $rva_pat:expr, $fallback:expr) => {
|
($base:ident, $config:ident, $field:ident, $scan_fn:ident, $rva_pat:expr, $fallback:expr) => {
|
||||||
if let Some(addr) = unsafe { $scan_fn($rva_pat) } {
|
if let Some(addr) = unsafe { $scan_fn($rva_pat) } {
|
||||||
$config.$field = addr - *$base;
|
$config.$field = addr;
|
||||||
println!(
|
println!(
|
||||||
"[hkrpg::addr::set_rva] Found relative address for {} [{}] -> 0x{:X}",
|
"[hkrpg::addr::set_rva] Found relative address for {} [{}] -> 0x{:X}",
|
||||||
stringify!($field),
|
stringify!($field),
|
||||||
stringify!($base),
|
stringify!($base),
|
||||||
$config.$field
|
$config.$field - *$base
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
eprintln!(
|
eprintln!(
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use std::{ffi::CString, fmt::Display};
|
use std::{ffi::CString, fmt::Display};
|
||||||
|
|
||||||
use crate::addr::{GAME_ASSEMBLY_BASE, rva_config};
|
use crate::addr::rva_config;
|
||||||
|
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
pub struct Il2cppString(usize);
|
pub struct Il2cppString(usize);
|
||||||
@@ -15,7 +15,7 @@ impl Il2cppString {
|
|||||||
pub fn new(string: &str) -> Self {
|
pub fn new(string: &str) -> Self {
|
||||||
let func = unsafe {
|
let func = unsafe {
|
||||||
std::mem::transmute::<usize, fn(*const u8, usize) -> usize>(
|
std::mem::transmute::<usize, fn(*const u8, usize) -> usize>(
|
||||||
*GAME_ASSEMBLY_BASE + rva_config().il2cpp_string_new_len,
|
rva_config().il2cpp_string_new_len,
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
let len = string.len();
|
let len = string.len();
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ macro_rules! replace {
|
|||||||
$(
|
$(
|
||||||
if $config.$field != 0 {
|
if $config.$field != 0 {
|
||||||
$self.interceptor.replace(
|
$self.interceptor.replace(
|
||||||
$self.base.wrapping_add($config.$field),
|
$config.$field,
|
||||||
CensorshipPatch::on_set_dither,
|
CensorshipPatch::on_set_dither,
|
||||||
)?;
|
)?;
|
||||||
} else {
|
} else {
|
||||||
@@ -24,11 +24,7 @@ macro_rules! replace {
|
|||||||
impl HkrpgModule for HkrpgModuleContext<CensorshipPatch> {
|
impl HkrpgModule for HkrpgModuleContext<CensorshipPatch> {
|
||||||
unsafe fn init(&mut self) -> Result<(), ilhook::HookError> {
|
unsafe fn init(&mut self) -> Result<(), ilhook::HookError> {
|
||||||
let config = rva_config();
|
let config = rva_config();
|
||||||
replace!(
|
replace!(self, config, set_dither);
|
||||||
self,
|
|
||||||
config,
|
|
||||||
set_dither
|
|
||||||
);
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
use crate::{
|
use crate::{addr::rva_config, il2cpp_string::Il2cppString};
|
||||||
addr::{GAME_ASSEMBLY_BASE, rva_config},
|
|
||||||
il2cpp_string::Il2cppString,
|
|
||||||
};
|
|
||||||
|
|
||||||
use super::{HkrpgModule, HkrpgModuleContext};
|
use super::{HkrpgModule, HkrpgModuleContext};
|
||||||
|
|
||||||
@@ -14,7 +11,7 @@ impl HkrpgModule for HkrpgModuleContext<Crypto> {
|
|||||||
let config = rva_config();
|
let config = rva_config();
|
||||||
if config.sdk_public_key != 0 {
|
if config.sdk_public_key != 0 {
|
||||||
unsafe {
|
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)
|
Il2cppString::new(ACCOUNT_RSA_KEY_REPLACEMENT)
|
||||||
}
|
}
|
||||||
println!("[crypto::init] AccountRSAKey replaced")
|
println!("[crypto::init] AccountRSAKey replaced")
|
||||||
|
|||||||
@@ -10,10 +10,8 @@ impl HkrpgModule for HkrpgModuleContext<Network> {
|
|||||||
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.make_initial_url != 0 && config.il2cpp_string_new_len != 0 {
|
if config.make_initial_url != 0 && config.il2cpp_string_new_len != 0 {
|
||||||
self.interceptor.attach(
|
self.interceptor
|
||||||
self.base.wrapping_add(config.make_initial_url),
|
.attach(config.make_initial_url, Network::on_make_initial_url)?;
|
||||||
Network::on_make_initial_url,
|
|
||||||
)?;
|
|
||||||
println!("[network::init] network patch enabled")
|
println!("[network::init] network patch enabled")
|
||||||
} else {
|
} else {
|
||||||
println!("[network::init] pattern is outdated! disabling http redirection")
|
println!("[network::init] pattern is outdated! disabling http redirection")
|
||||||
|
|||||||
@@ -45,7 +45,8 @@ pub unsafe fn scan_il2cpp_section(pat: &str) -> Option<usize> {
|
|||||||
match slice.get(address) {
|
match slice.get(address) {
|
||||||
// jmp sub_xxxxxxx
|
// jmp sub_xxxxxxx
|
||||||
Some(&0xE8) => {
|
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)
|
GAME_ASSEMBLY_BASE.wrapping_add(address + 5 + offset as usize)
|
||||||
}
|
}
|
||||||
// mov rcx, [rip + offset] (0x48 0x8B 0x0D XXXXXXXX)
|
// mov rcx, [rip + offset] (0x48 0x8B 0x0D XXXXXXXX)
|
||||||
@@ -53,7 +54,8 @@ pub unsafe fn scan_il2cpp_section(pat: &str) -> Option<usize> {
|
|||||||
if slice.get(address + 1) == Some(&0x8B)
|
if slice.get(address + 1) == Some(&0x8B)
|
||||||
&& slice.get(address + 2) == Some(&0x0D) =>
|
&& 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 + 7 + offset as usize)
|
||||||
}
|
}
|
||||||
_ => GAME_ASSEMBLY_BASE.wrapping_add(address),
|
_ => GAME_ASSEMBLY_BASE.wrapping_add(address),
|
||||||
@@ -89,7 +91,25 @@ pub unsafe fn scan_il2cpp_section(pat: &str) -> Option<usize> {
|
|||||||
|
|
||||||
// pub unsafe fn scan_unity_player_section(pat: &str) -> Option<usize> {
|
// pub unsafe fn scan_unity_player_section(pat: &str) -> Option<usize> {
|
||||||
// let mut slice = unsafe { unity_player_slice() };
|
// let mut slice = unsafe { unity_player_slice() };
|
||||||
// scan_first_match(&mut slice, pat)
|
// scan_first_match(&mut slice, pat).unwrap().map(|address| {
|
||||||
// .unwrap()
|
// let slice = unsafe { unity_player_slice() };
|
||||||
// .map(|loc| UNITY_PLAYER_BASE.wrapping_add(loc))
|
// 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),
|
||||||
|
// }
|
||||||
|
// })
|
||||||
// }
|
// }
|
||||||
|
|||||||
Reference in New Issue
Block a user