From a1639bea1c114d010f1283ed825b711eee9f501d Mon Sep 17 00:00:00 2001 From: a2x <45197573+a2x@users.noreply.github.com> Date: Thu, 9 Nov 2023 22:50:19 +1000 Subject: [PATCH] Added `is_key_down` example using the games input system The "ResolveJmp" and "ResolveRip" operation enum names were also renamed to "Jmp" and "Rip" for simplicity. --- config.json | 52 +++++++++++++++++++++---------------------- src/config.rs | 4 ++-- src/dumper/offsets.rs | 35 +++++++++++++++++++++++++++-- 3 files changed, 61 insertions(+), 30 deletions(-) diff --git a/config.json b/config.json index cedc0c0..2dfc87e 100644 --- a/config.json +++ b/config.json @@ -6,7 +6,7 @@ "pattern": "8B 05 ? ? ? ? C3 CC CC CC CC CC CC CC CC CC 48 8B 0D ? ? ? ? 48 8D 05", "operations": [ { - "type": "resolveRip", + "type": "rip", "offset": 2, "length": 6 } @@ -18,7 +18,7 @@ "pattern": "48 8B 0D ? ? ? ? 48 89 7C 24 ? 8B FA C1 EB", "operations": [ { - "type": "resolveRip" + "type": "rip" } ] }, @@ -28,7 +28,7 @@ "pattern": "48 8D 0D ? ? ? ? E9 E4 44 B4 FF", "operations": [ { - "type": "resolveRip" + "type": "rip" }, { "type": "add", @@ -42,7 +42,7 @@ "pattern": "48 8D 0D ? ? ? ? E9 F4 44 B4 FF", "operations": [ { - "type": "resolveRip" + "type": "rip" }, { "type": "add", @@ -56,7 +56,7 @@ "pattern": "48 8B 05 ? ? ? ? 4C 8D 1D", "operations": [ { - "type": "resolveRip" + "type": "rip" }, { "type": "add", @@ -70,7 +70,7 @@ "pattern": "48 8B 05 ? ? ? ? 4C 8D 3D ? ? ? ? 48 89 45", "operations": [ { - "type": "resolveRip" + "type": "rip" }, { "type": "add", @@ -84,7 +84,7 @@ "pattern": "48 8B 05 ? ? ? ? 4C 8D 0D ? ? ? ? 48 89 45", "operations": [ { - "type": "resolveRip" + "type": "rip" }, { "type": "add", @@ -98,7 +98,7 @@ "pattern": "48 8B 05 ? ? ? ? 48 8D 1D ? ? ? ? 48 89 45", "operations": [ { - "type": "resolveRip" + "type": "rip" }, { "type": "add", @@ -112,7 +112,7 @@ "pattern": "48 8B 05 ? ? ? ? 48 8D 0D ? ? ? ? 44 8B 15", "operations": [ { - "type": "resolveRip" + "type": "rip" }, { "type": "add", @@ -126,7 +126,7 @@ "pattern": "48 8B 05 ? ? ? ? 48 8D 15 ? ? ? ? 48 89 45", "operations": [ { - "type": "resolveRip" + "type": "rip" }, { "type": "add", @@ -140,7 +140,7 @@ "pattern": "48 8B 1D ? ? ? ? 48 89 1D", "operations": [ { - "type": "resolveRip" + "type": "rip" } ] }, @@ -162,7 +162,7 @@ "pattern": "48 89 0D ? ? ? ? 8B 0D", "operations": [ { - "type": "resolveRip" + "type": "rip" } ] }, @@ -172,7 +172,7 @@ "pattern": "48 89 0D ? ? ? ? 48 89 41", "operations": [ { - "type": "resolveRip" + "type": "rip" } ] }, @@ -182,7 +182,7 @@ "pattern": "48 8B 05 ? ? ? ? C3 CC CC CC CC CC CC CC CC 48 89 5C 24 ? 48 89 6C 24", "operations": [ { - "type": "resolveRip" + "type": "rip" } ] }, @@ -192,7 +192,7 @@ "pattern": "48 89 05 ? ? ? ? 48 8D 05", "operations": [ { - "type": "resolveRip" + "type": "rip" } ] }, @@ -202,7 +202,7 @@ "pattern": "4C 8B 0D ? ? ? ? 4C 8B D2 4C 8B D9", "operations": [ { - "type": "resolveRip" + "type": "rip" } ] }, @@ -212,7 +212,7 @@ "pattern": "48 8B 05 ? ? ? ? 48 85 C0 74 4F", "operations": [ { - "type": "resolveRip" + "type": "rip" } ] }, @@ -222,7 +222,7 @@ "pattern": "48 8D 05 ? ? ? ? C3 CC CC CC CC CC CC CC CC 48 83 EC ? 8B 0D", "operations": [ { - "type": "resolveRip" + "type": "rip" }, { "type": "add", @@ -236,7 +236,7 @@ "pattern": "48 89 3D ? ? ? ? 48 8D 15", "operations": [ { - "type": "resolveRip" + "type": "rip" } ] }, @@ -286,7 +286,7 @@ "pattern": "48 8B 15 ? ? ? ? FF C0 48 8D 4C 24", "operations": [ { - "type": "resolveRip" + "type": "rip" } ] }, @@ -296,7 +296,7 @@ "pattern": "48 8D 05 ? ? ? ? C3 CC CC CC CC CC CC CC CC 48 83 EC ? 8B 0D", "operations": [ { - "type": "resolveRip" + "type": "rip" } ] }, @@ -306,7 +306,7 @@ "pattern": "48 8B 0D ? ? ? ? 48 8B 01 48 FF 60 30", "operations": [ { - "type": "resolveRip" + "type": "rip" }, { "type": "dereference" @@ -323,7 +323,7 @@ "pattern": "48 8D 0D ? ? ? ? 48 C1 E0 06", "operations": [ { - "type": "resolveRip" + "type": "rip" } ] }, @@ -333,7 +333,7 @@ "pattern": "48 89 05 ? ? ? ? 48 8B C8 48 85 C0", "operations": [ { - "type": "resolveRip" + "type": "rip" } ] }, @@ -343,7 +343,7 @@ "pattern": "8B 05 ? ? ? ? 89 03", "operations": [ { - "type": "resolveRip", + "type": "rip", "offset": 2, "length": 6 } @@ -355,7 +355,7 @@ "pattern": "8B 05 ? ? ? ? 89 07", "operations": [ { - "type": "resolveRip", + "type": "rip", "offset": 2, "length": 6 } diff --git a/src/config.rs b/src/config.rs index af44da5..9edd869 100644 --- a/src/config.rs +++ b/src/config.rs @@ -24,7 +24,7 @@ pub enum Operation { /// /// `offset` is the offset of the displacement value. If `None`, the offset will be `0x1`. /// `length` is the length of the instruction. If `None`, the length will be `0x5`. - ResolveJmp { + Jmp { offset: Option, length: Option, }, @@ -34,7 +34,7 @@ pub enum Operation { /// /// `offset` is the offset of the displacement value. If `None`, the offset will be `0x3`. /// `length` is the length of the instruction. If `None`, the length will be `0x7`. - ResolveRip { + Rip { offset: Option, length: Option, }, diff --git a/src/dumper/offsets.rs b/src/dumper/offsets.rs index ad02da6..0bb7b5f 100644 --- a/src/dumper/offsets.rs +++ b/src/dumper/offsets.rs @@ -74,12 +74,12 @@ pub fn dump_offsets( )?; } } - ResolveJmp { offset, length } => { + Jmp { offset, length } => { address = process .resolve_jmp(address, offset.unwrap_or(0x1), length.unwrap_or(0x5))? .into() } - ResolveRip { offset, length } => { + Rip { offset, length } => { address = process .resolve_rip(address, offset.unwrap_or(0x3), length.unwrap_or(0x7))? .into() @@ -141,8 +141,12 @@ pub fn dump_offsets( mod tests { use super::*; + use core::arch::x86_64::_bittest; + use std::ffi::{c_char, c_void}; use std::mem::offset_of; + use std::thread::sleep; + use std::time::Duration; fn setup() -> Result { let mut process = Process::new("cs2.exe")?; @@ -267,6 +271,33 @@ mod tests { Ok(()) } + #[test] + fn is_key_down() -> Result<()> { + let process = setup()?; + + let input_system_base = process + .get_module_by_name("inputsystem.dll") + .expect("Failed to find inputsystem.dll") + .base(); + + let input_system = input_system_base + 0x35770; + + let is_key_down = |key_code: i32| -> bool { + let key_map_element = process + .read_memory::((input_system + 0x4 * (key_code as usize / 32) + 0x12A0).into()) + .unwrap_or(0); + + unsafe { _bittest(&key_map_element, key_code & 0x1F) != 0 } + }; + + sleep(Duration::from_secs(1)); + + // See https://www.unknowncheats.me/forum/3855779-post889.html for button codes. + println!("Insert down: {}", is_key_down(73)); + + Ok(()) + } + #[test] fn local_player_controller() -> Result<()> { let process = setup()?;