From 10da0883a10be097ad3fdf1819ee64ecd64c0259 Mon Sep 17 00:00:00 2001 From: Janek <development@superyu.xyz> Date: Wed, 17 Apr 2024 18:55:46 +0200 Subject: [PATCH 1/5] feat: faster bomb holder search Fully batched bomb holder search --- src/dma/context/mod.rs | 94 ++++++++++++++++++++++++++++++++++++++- src/dma/mod.rs | 48 ++++++-------------- src/dma/threaddata/mod.rs | 2 +- 3 files changed, 108 insertions(+), 36 deletions(-) diff --git a/src/dma/context/mod.rs b/src/dma/context/mod.rs index 8ee5e75..755bc4b 100755 --- a/src/dma/context/mod.rs +++ b/src/dma/context/mod.rs @@ -144,6 +144,97 @@ impl DmaCtx { Ok(is_controller) } + pub fn get_c4_holder(&mut self, pawns: Vec<Address>, entity_list: Address) -> Option<Address> { + // (pawn, wep_services, wep_count, wep_base) + let mut data_vec: Vec<(Address, u64, i32, u64)> = pawns + .into_iter() + .map(|pawn| (pawn, 0u64, 0i32, 0u64)) + .collect(); + + // Get wep_services + let mut batcher = self.process.batcher(); + data_vec.iter_mut().for_each(|(pawn, wep_services, _, _)| { + batcher.read_into(*pawn + cs2dumper::client::C_BasePlayerPawn::m_pWeaponServices, wep_services); + }); + drop(batcher); + + // Get wep_count and wep_base + let mut batcher = self.process.batcher(); + data_vec.iter_mut().for_each(|(_, wep_services, wep_count, wep_base)| { + batcher.read_into((*wep_services + cs2dumper::client::CPlayer_WeaponServices::m_hMyWeapons as u64).into(), wep_count); + batcher.read_into((*wep_services + cs2dumper::client::CPlayer_WeaponServices::m_hMyWeapons as u64 + 0x8).into() , wep_base); + }); + drop(batcher); + + // Rebuild data vec + // Vec<(pawn, wep_base, Vec<(buff, buff2)>)> + let mut data_vec: Vec<(Address, u64, Vec<(u64, i32)>)> = data_vec + .into_iter() + .map(|(pawn, _, wep_count, wep_base)| { + let weps = (0..wep_count).into_iter().map(|idx| (0u64, idx)).collect(); + (pawn, wep_base, weps) + }) + .collect(); + + // Get handle + let mut batcher = self.process.batcher(); + data_vec.iter_mut().for_each(|(_, wep_base, wep_data_vec)| { + wep_data_vec.iter_mut().for_each(|(_, idx)| { + let b: Address = (*wep_base).into(); + batcher.read_into(b + * idx * 0x4, idx); + }); + }); + drop(batcher); + + // Get list entry + let mut batcher = self.process.batcher(); + data_vec.iter_mut().for_each(|(_, _, wep_data_vec)| { + wep_data_vec.iter_mut().for_each(|(list_entry, handle)| { + batcher.read_into(entity_list + 0x8 * ((*handle & 0x7FFF) >> 9) + 16, list_entry); + }); + }); + drop(batcher); + + // Get wep ptr + let mut batcher = self.process.batcher(); + data_vec.iter_mut().for_each(|(_, _, wep_data_vec)| { + wep_data_vec.iter_mut().for_each(|(list_entry, handle)| { + let le: Address = (*list_entry).into(); + batcher.read_into(le + 120 * (*handle & 0x1FF), list_entry); + }); + }); + drop(batcher); + + // Get wep data + let mut batcher = self.process.batcher(); + data_vec.iter_mut().for_each(|(_, _, wep_data_vec)| { + wep_data_vec.iter_mut().for_each(|(wep_ptr, _)| { + let b: Address = (*wep_ptr).into(); + batcher.read_into(b + cs2dumper::client::C_BaseEntity::m_nSubclassID + 0x8, wep_ptr); + }); + }); + drop(batcher); + + // Get wep id + let mut batcher = self.process.batcher(); + data_vec.iter_mut().for_each(|(_, _, wep_data_vec)| { + wep_data_vec.iter_mut().for_each(|(wep_data, id)| { + let b: Address = (*wep_data).into(); + batcher.read_into(b + cs2dumper::client::CCSWeaponBaseVData::m_WeaponType, id); + }); + }); + drop(batcher); + + let holder = data_vec.into_iter().find(|(_, _, wep_data_vec)| { + wep_data_vec.iter().find(|(_, id)| { *id == 7 }).is_some() + }); + + match holder { + Some((addr, _, _)) => Some(addr), + None => None, + } + } + // Todo: Optimize this function: find another way to do this pub fn has_c4(&mut self, pawn: Address, entity_list: Address) -> anyhow::Result<bool> { let mut has_c4 = false; @@ -165,7 +256,8 @@ impl DmaCtx { let ptr = self.process.read_addr64(list_entry + 120 * (handle & 0x1FF))?; Some(ptr) } - } { + } + { let wep_data = self.process.read_addr64(wep_ptr + cs2dumper::client::C_BaseEntity::m_nSubclassID + 0x8)?; let id: i32 = self.process.read(wep_data + cs2dumper::client::CCSWeaponBaseVData::m_WeaponType)?; diff --git a/src/dma/mod.rs b/src/dma/mod.rs index 5b4da83..5e926e7 100755 --- a/src/dma/mod.rs +++ b/src/dma/mod.rs @@ -1,8 +1,8 @@ use std::{thread, time::{Duration, Instant}}; -use memflow::{os::Process, types::Address, mem::MemoryView}; +use memflow::{os::Process, mem::MemoryView}; -use crate::{enums::{TeamID, PlayerType}, comms::{EntityData, PlayerData, RadarData, ArcRwlockRadarData, BombData}}; +use crate::{enums::PlayerType, comms::{EntityData, PlayerData, RadarData, ArcRwlockRadarData, BombData}}; use self::{context::DmaCtx, threaddata::CsData}; @@ -54,6 +54,12 @@ pub async fn run(radar_data: ArcRwlockRadarData, connector: Connector, pcileech_ data.recheck_bomb_holder = true; } + if data.recheck_bomb_holder { + let pawns = data.players.clone().into_iter().map(|(_, pawn)| pawn).collect(); + data.bomb_holder = ctx.get_c4_holder(pawns, data.entity_list.into()); + data.recheck_bomb_holder = false; + } + let bomb_defuse_timeleft: f32 = { if data.bomb_planted && !data.bomb_exploded && !data.bomb_defused { if let Some(bomb_stamp) = data.bomb_planted_stamp { @@ -123,23 +129,9 @@ pub async fn run(radar_data: ArcRwlockRadarData, connector: Connector, pcileech_ ).unwrap(); if local_data.health > 0 { - let has_bomb = { - if data.bomb_planted || data.bomb_dropped { - false - } else if data.recheck_bomb_holder { - if local_data.team == Some(TeamID::T) && !data.bomb_dropped && !data.bomb_planted { - let is_holder = ctx.has_c4( - data.local_pawn.into(), data.entity_list.into() - ).unwrap_or(false); - - if is_holder { - data.bomb_holder = data.local.into(); - data.recheck_bomb_holder = false; - } - - is_holder - } else { false } - } else { Address::from(data.local) == data.bomb_holder } + let has_bomb = match data.bomb_holder { + Some(bh) => data.local_pawn == bh.to_umem(), + None => false, }; entity_data.push( @@ -164,21 +156,9 @@ pub async fn run(radar_data: ArcRwlockRadarData, connector: Connector, pcileech_ continue; } - let has_bomb = { - if data.bomb_planted { - false - } else if data.recheck_bomb_holder { - if player_data.team == Some(TeamID::T) && !data.bomb_dropped && !data.bomb_planted { - let is_holder = ctx.has_c4(*pawn, data.entity_list.into()).unwrap_or(false); - - if is_holder { - data.bomb_holder = *controller; - data.recheck_bomb_holder = false; - } - - is_holder - } else { false } - } else { *controller == data.bomb_holder } + let has_bomb = match data.bomb_holder { + Some(bh) => *pawn == bh, + None => false, }; let player_type = { diff --git a/src/dma/threaddata/mod.rs b/src/dma/threaddata/mod.rs index efdf66f..40df3c0 100755 --- a/src/dma/threaddata/mod.rs +++ b/src/dma/threaddata/mod.rs @@ -9,7 +9,7 @@ pub struct CsData { // Entities pub players: Vec<(Address, Address)>, pub bomb: Address, - pub bomb_holder: Address, + pub bomb_holder: Option<Address>, pub recheck_bomb_holder: bool, // Pointers From 00d883a41c7605be881a4e57b21bfa01c2c2c9a2 Mon Sep 17 00:00:00 2001 From: Janek <development@superyu.xyz> Date: Wed, 17 Apr 2024 18:43:21 +0200 Subject: [PATCH 2/5] feat: add native mode - Add native mode - Fix bomb holder search and wrong bomb holder on round starts --- Cargo.lock | 470 ++++++++++++++++++++++++++++++++++- Cargo.toml | 1 + src/cli.rs | 4 +- src/dma/context/connector.rs | 4 +- src/dma/context/mod.rs | 47 +--- src/dma/mod.rs | 29 ++- src/dma/threaddata/mod.rs | 15 +- 7 files changed, 515 insertions(+), 55 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5e4c4e1..cdaf892 100755 --- a/Cargo.lock +++ b/Cargo.lock @@ -91,6 +91,21 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anstream" version = "0.6.13" @@ -168,6 +183,17 @@ dependencies = [ "syn 2.0.58", ] +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + [[package]] name = "autocfg" version = "1.2.0" @@ -253,6 +279,26 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "bindgen" +version = "0.69.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +dependencies = [ + "bitflags 2.5.0", + "cexpr", + "clang-sys", + "itertools 0.10.5", + "lazy_static", + "lazycell", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.58", +] + [[package]] name = "bit_field" version = "0.10.2" @@ -336,6 +382,15 @@ version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -382,6 +437,29 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "windows-targets 0.52.4", +] + +[[package]] +name = "clang-sys" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" +dependencies = [ + "glob", + "libc", + "libloading 0.8.3", +] + [[package]] name = "clap" version = "4.5.4" @@ -449,6 +527,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + [[package]] name = "core-foundation" version = "0.9.4" @@ -489,6 +573,15 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +dependencies = [ + "cfg-if", +] + [[package]] name = "crossbeam-channel" version = "0.5.12" @@ -579,6 +672,19 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version 0.4.0", + "syn 1.0.109", +] + [[package]] name = "derive_pod" version = "0.1.2" @@ -642,12 +748,36 @@ dependencies = [ "syn 2.0.58", ] +[[package]] +name = "env_logger" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + [[package]] name = "equivalent" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "errno" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + [[package]] name = "errno" version = "0.3.8" @@ -658,6 +788,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "fastrand" version = "2.0.2" @@ -670,6 +810,16 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bb23c599a9ff5b981529099902fe5de8d55ecc8c1f451542da17b8d2d65326e" +[[package]] +name = "flate2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "fnv" version = "1.0.7" @@ -786,6 +936,12 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + [[package]] name = "goblin" version = "0.8.0" @@ -832,12 +988,27 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + [[package]] name = "hermit-abi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "http" version = "1.1.0" @@ -890,6 +1061,12 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + [[package]] name = "hyper" version = "1.2.0" @@ -947,6 +1124,29 @@ dependencies = [ "tracing", ] +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core 0.52.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -982,6 +1182,17 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "ipnet" version = "2.9.0" @@ -1027,6 +1238,12 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "libc" version = "0.2.153" @@ -1053,6 +1270,17 @@ dependencies = [ "windows-targets 0.52.4", ] +[[package]] +name = "libproc" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb6497078a4c9c2aca63df56d8dce6eb4381d53a960f781a3a748f7ea97436d" +dependencies = [ + "bindgen", + "errno 0.3.8", + "libc", +] + [[package]] name = "libredox" version = "0.1.3" @@ -1063,6 +1291,12 @@ dependencies = [ "libc", ] +[[package]] +name = "linux-raw-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" + [[package]] name = "linux-raw-sys" version = "0.4.13" @@ -1097,6 +1331,29 @@ version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +[[package]] +name = "mac-sys-info" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5459fd50cfe85d72b92af2cd5105876aba1d533c14bfbb7383f86e4efa5325af" +dependencies = [ + "derive_more", + "env_logger", + "libc", + "log", + "serde", + "unix-exec-output-catcher", +] + +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + [[package]] name = "matchit" version = "0.7.3" @@ -1153,6 +1410,23 @@ dependencies = [ "syn 2.0.58", ] +[[package]] +name = "memflow-native" +version = "0.2.4" +source = "git+https://github.com/memflow/memflow-native#ebc9a25335885adf057d77bc7a2882211609a8f8" +dependencies = [ + "goblin", + "itertools 0.12.1", + "libc", + "libproc", + "log", + "mac-sys-info", + "mach2", + "memflow", + "procfs", + "windows 0.54.0", +] + [[package]] name = "memmap" version = "0.7.0" @@ -1179,6 +1453,12 @@ dependencies = [ "unicase", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.7.2" @@ -1248,6 +1528,16 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "ntapi" version = "0.4.1" @@ -1278,7 +1568,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", ] @@ -1508,6 +1798,22 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "procfs" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "943ca7f9f29bab5844ecd8fdb3992c5969b6622bb9609b9502fef9b4310e3f1f" +dependencies = [ + "backtrace", + "bitflags 1.3.2", + "byteorder", + "chrono", + "flate2", + "hex", + "lazy_static", + "rustix 0.36.17", +] + [[package]] name = "quote" version = "1.0.35" @@ -1530,6 +1836,7 @@ dependencies = [ "local-ip-address", "log", "memflow", + "memflow-native", "num-traits", "reqwest", "serde", @@ -1693,6 +2000,12 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc_version" version = "0.2.3" @@ -1711,6 +2024,20 @@ dependencies = [ "semver 1.0.22", ] +[[package]] +name = "rustix" +version = "0.36.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "305efbd14fde4139eb501df5f136994bb520b033fa9fbdce287507dc23b8c7ed" +dependencies = [ + "bitflags 1.3.2", + "errno 0.3.8", + "io-lifetimes", + "libc", + "linux-raw-sys 0.1.4", + "windows-sys 0.45.0", +] + [[package]] name = "rustix" version = "0.38.32" @@ -1718,9 +2045,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" dependencies = [ "bitflags 2.5.0", - "errno", + "errno 0.3.8", "libc", - "linux-raw-sys", + "linux-raw-sys 0.4.13", "windows-sys 0.52.0", ] @@ -1900,6 +2227,12 @@ dependencies = [ "digest", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -2003,7 +2336,7 @@ dependencies = [ "libc", "ntapi", "once_cell", - "windows", + "windows 0.52.0", ] [[package]] @@ -2041,10 +2374,19 @@ checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", "fastrand", - "rustix", + "rustix 0.38.32", "windows-sys 0.52.0", ] +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + [[package]] name = "thiserror" version = "1.0.58" @@ -2368,6 +2710,18 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unix-exec-output-catcher" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3c26d0ac22fbe8f782d88c493c74a35b1f062c65b03df15ccd4fc6c293c5198" +dependencies = [ + "derive_more", + "errno 0.2.8", + "libc", + "log", +] + [[package]] name = "url" version = "2.5.0" @@ -2541,6 +2895,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -2553,7 +2916,17 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "windows-core", + "windows-core 0.52.0", + "windows-targets 0.52.4", +] + +[[package]] +name = "windows" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +dependencies = [ + "windows-core 0.54.0", "windows-targets 0.52.4", ] @@ -2566,6 +2939,34 @@ dependencies = [ "windows-targets 0.52.4", ] +[[package]] +name = "windows-core" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +dependencies = [ + "windows-result", + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-result" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd19df78e5168dfb0aedc343d1d1b8d422ab2db6756d2dc3fef75035402a3f64" +dependencies = [ + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -2584,6 +2985,21 @@ dependencies = [ "windows-targets 0.52.4", ] +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -2614,6 +3030,12 @@ dependencies = [ "windows_x86_64_msvc 0.52.4", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -2626,6 +3048,12 @@ version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -2638,6 +3066,12 @@ version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -2650,6 +3084,12 @@ version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -2662,6 +3102,12 @@ version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -2674,6 +3120,12 @@ version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -2686,6 +3138,12 @@ version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" diff --git a/Cargo.toml b/Cargo.toml index a18e119..5eeda4a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,7 @@ edition = "2021" [dependencies] # memory memflow = "0.2.1" +memflow-native = { git = "https://github.com/memflow/memflow-native" } dataview = "1.0.1" # logging diff --git a/src/cli.rs b/src/cli.rs index 500c96b..2ac22ce 100755 --- a/src/cli.rs +++ b/src/cli.rs @@ -40,7 +40,9 @@ fn version() -> String { let commit_date = option_env!("VERGEN_GIT_COMMIT_DATE").unwrap_or("unknown"); let avail_cons = { let inventory = Inventory::scan(); - inventory.available_connectors().join(", ") + let mut avail = inventory.available_connectors(); + avail.push("native".into()); + avail.join(", ") }; format!(" {pkg_ver} (rev {git_hash})\nCommit Date: {commit_date}\nAvailable Connectors: {avail_cons}") diff --git a/src/dma/context/connector.rs b/src/dma/context/connector.rs index e9dbcd1..f314a9c 100755 --- a/src/dma/context/connector.rs +++ b/src/dma/context/connector.rs @@ -3,7 +3,8 @@ pub enum Connector { #[default] Qemu, Kvm, - Pcileech + Pcileech, + Native } impl ToString for Connector { @@ -12,6 +13,7 @@ impl ToString for Connector { Connector::Qemu => String::from("qemu"), Connector::Kvm => String::from("kvm"), Connector::Pcileech => String::from("pcileech"), + Connector::Native => String::from("native"), } } } diff --git a/src/dma/context/mod.rs b/src/dma/context/mod.rs index 755bc4b..7e9623a 100755 --- a/src/dma/context/mod.rs +++ b/src/dma/context/mod.rs @@ -46,11 +46,13 @@ impl DmaCtx { .args(connector_args) .os("win32") .build()? - } else { + } else if connector != Connector::Native { inventory.builder() - .connector(&connector.to_string()) - .os("win32") - .build()? + .connector(&connector.to_string()) + .os("win32") + .build()? + } else { + memflow_native::create_os(&Default::default(), Default::default())? } }; @@ -234,43 +236,6 @@ impl DmaCtx { None => None, } } - - // Todo: Optimize this function: find another way to do this - pub fn has_c4(&mut self, pawn: Address, entity_list: Address) -> anyhow::Result<bool> { - let mut has_c4 = false; - let wep_services = self.process.read_addr64(pawn + cs2dumper::client::C_BasePlayerPawn::m_pWeaponServices)?; - let wep_count: i32 = self.process.read(wep_services + cs2dumper::client::CPlayer_WeaponServices::m_hMyWeapons)?; - let wep_base = self.process.read_addr64(wep_services + cs2dumper::client::CPlayer_WeaponServices::m_hMyWeapons + 0x8)?; - - for wep_idx in 0..wep_count { - let handle: i32 = self.process.read(wep_base + wep_idx * 0x4)?; - if handle == -1 { - continue; - } - - let list_entry = self.process.read_addr64(entity_list + 0x8 * ((handle & 0x7FFF) >> 9) + 16)?; - if let Some(wep_ptr) = { - if list_entry.is_null() || !list_entry.is_valid() { - None - } else { - let ptr = self.process.read_addr64(list_entry + 120 * (handle & 0x1FF))?; - Some(ptr) - } - } - { - let wep_data = self.process.read_addr64(wep_ptr + cs2dumper::client::C_BaseEntity::m_nSubclassID + 0x8)?; - let id: i32 = self.process.read(wep_data + cs2dumper::client::CCSWeaponBaseVData::m_WeaponType)?; - - if id == 7 { - has_c4 = true; - break; - } - } - } - - Ok(has_c4) - } - } diff --git a/src/dma/mod.rs b/src/dma/mod.rs index 5e926e7..72d8746 100755 --- a/src/dma/mod.rs +++ b/src/dma/mod.rs @@ -1,6 +1,6 @@ use std::{thread, time::{Duration, Instant}}; -use memflow::{os::Process, mem::MemoryView}; +use memflow::{mem::MemoryView, os::Process, types::Address}; use crate::{enums::PlayerType, comms::{EntityData, PlayerData, RadarData, ArcRwlockRadarData, BombData}}; @@ -19,6 +19,8 @@ pub async fn run(radar_data: ArcRwlockRadarData, connector: Connector, pcileech_ // For read timing let mut last_bomb_dropped = false; let mut last_bomb_planted = false; + let mut last_freeze_period = false; + let mut last_round_start_count = 0u8; let mut last_tick_count = 0; let mut last_big_read = Instant::now(); @@ -50,12 +52,33 @@ pub async fn run(radar_data: ArcRwlockRadarData, connector: Connector, pcileech_ data.update_bomb(&mut ctx); } - if !data.bomb_dropped && last_bomb_dropped && !data.bomb_planted { + if data.bomb_dropped != last_bomb_dropped && !data.bomb_planted { + log::debug!("Bomb holder recheck due to bomb drop status"); data.recheck_bomb_holder = true; } + if last_freeze_period != data.freeze_period { + log::debug!("Bomb holder recheck due to freeze time"); + data.recheck_bomb_holder = true; + } + + if last_round_start_count != data.round_start_count { + log::debug!("Bomb holder recheck due to round start"); + data.recheck_bomb_holder = true; + } + + last_freeze_period = data.freeze_period; + last_round_start_count = data.round_start_count; + if data.recheck_bomb_holder { - let pawns = data.players.clone().into_iter().map(|(_, pawn)| pawn).collect(); + let mut pawns: Vec<Address> = data.players + .clone() + .into_iter() + .map(|(_, pawn)| pawn) + .collect(); + + pawns.push(data.local_pawn.into()); + data.bomb_holder = ctx.get_c4_holder(pawns, data.entity_list.into()); data.recheck_bomb_holder = false; } diff --git a/src/dma/threaddata/mod.rs b/src/dma/threaddata/mod.rs index 40df3c0..d486175 100755 --- a/src/dma/threaddata/mod.rs +++ b/src/dma/threaddata/mod.rs @@ -23,6 +23,12 @@ pub struct CsData { pub local_pawn: u64, pub is_dead: bool, pub tick_count: i32, + pub freeze_period: bool, + pub round_start_count: u8, + pub highest_index: i32, + pub map: String, + + // Bomb pub bomb_dropped: bool, pub bomb_planted: bool, pub bomb_planted_stamp: Option<Instant>, @@ -32,8 +38,6 @@ pub struct CsData { pub bomb_defuse_length: f32, pub bomb_exploded: bool, pub bomb_defused: bool, - pub highest_index: i32, - pub map: String } @@ -161,7 +165,7 @@ impl CsData { let mut bomb_being_defused = 0u8; let mut bomb_exploded = 0u8; let mut bomb_defused = 0u8; - + let mut freeze_period = 0u8; { // Globals let tick_count_addr = (self.globals + 0x40).into(); @@ -170,6 +174,8 @@ impl CsData { // Gamerules let bomb_dropped_addr = (self.gamerules + cs2dumper::client::C_CSGameRules::m_bBombDropped as u64).into(); let bomb_planted_addr = (self.gamerules + cs2dumper::client::C_CSGameRules::m_bBombPlanted as u64).into(); + let total_rounds_addr = (self.gamerules + cs2dumper::client::C_CSGameRules::m_bFreezePeriod as u64).into(); + let round_start_count_addr = (self.gamerules + cs2dumper::client::C_CSGameRules::m_nRoundStartCount as u64).into(); // Game Entity System let highest_index_addr = (self.game_ent_sys + cs2dumper::offsets::client_dll::dwGameEntitySystem_getHighestEntityIndex as u64).into(); @@ -187,6 +193,8 @@ impl CsData { batcher.read_into(tick_count_addr, &mut self.tick_count); batcher.read_into(bomb_dropped_addr, &mut bomb_dropped); batcher.read_into(bomb_planted_addr, &mut bomb_planted); + batcher.read_into(total_rounds_addr, &mut freeze_period); + batcher.read_into(round_start_count_addr, &mut self.round_start_count); batcher.read_into(highest_index_addr, &mut self.highest_index); batcher.read_into(map_addr, &mut map_ptr); } @@ -237,6 +245,7 @@ impl CsData { self.bomb_exploded = bomb_exploded != 0; self.bomb_being_defused = bomb_being_defused != 0; self.bomb_defused = bomb_defused != 0; + self.freeze_period = freeze_period != 0; } pub fn update_pointers(&mut self, ctx: &mut DmaCtx) { From 16e2d361dcb81b9f7577a3d16f173f638b34daf9 Mon Sep 17 00:00:00 2001 From: Janek <development@superyu.xyz> Date: Sun, 21 Apr 2024 19:20:55 +0200 Subject: [PATCH 3/5] fix: bomb holder when planted or dropped --- src/dma/context/mod.rs | 9 +++++++-- src/dma/mod.rs | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/dma/context/mod.rs b/src/dma/context/mod.rs index 7e9623a..4514925 100755 --- a/src/dma/context/mod.rs +++ b/src/dma/context/mod.rs @@ -7,7 +7,7 @@ use num_traits::FromPrimitive; use crate::{structs::Vec3, enums::TeamID}; -use super::cs2dumper; +use super::{cs2dumper, threaddata::CsData}; pub struct DmaCtx { pub process: IntoProcessInstanceArcBox<'static>, @@ -146,7 +146,12 @@ impl DmaCtx { Ok(is_controller) } - pub fn get_c4_holder(&mut self, pawns: Vec<Address>, entity_list: Address) -> Option<Address> { + pub fn get_c4_holder(&mut self, pawns: Vec<Address>, entity_list: Address, csdata: &CsData) -> Option<Address> { + + if csdata.bomb_dropped || csdata.bomb_planted { + return None; + } + // (pawn, wep_services, wep_count, wep_base) let mut data_vec: Vec<(Address, u64, i32, u64)> = pawns .into_iter() diff --git a/src/dma/mod.rs b/src/dma/mod.rs index 72d8746..c735538 100755 --- a/src/dma/mod.rs +++ b/src/dma/mod.rs @@ -79,7 +79,7 @@ pub async fn run(radar_data: ArcRwlockRadarData, connector: Connector, pcileech_ pawns.push(data.local_pawn.into()); - data.bomb_holder = ctx.get_c4_holder(pawns, data.entity_list.into()); + data.bomb_holder = ctx.get_c4_holder(pawns, data.entity_list.into(), &data); data.recheck_bomb_holder = false; } From e89a0b867169b148cad9e79de834cd735e40b1ee Mon Sep 17 00:00:00 2001 From: Janek <development@superyu.xyz> Date: Tue, 23 Apr 2024 21:35:59 +0200 Subject: [PATCH 4/5] Update mod.rs --- src/dma/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dma/mod.rs b/src/dma/mod.rs index c735538..c57f8d1 100755 --- a/src/dma/mod.rs +++ b/src/dma/mod.rs @@ -52,7 +52,7 @@ pub async fn run(radar_data: ArcRwlockRadarData, connector: Connector, pcileech_ data.update_bomb(&mut ctx); } - if data.bomb_dropped != last_bomb_dropped && !data.bomb_planted { + if data.bomb_dropped != last_bomb_dropped && data.bomb_planted != last_bomb_planted { log::debug!("Bomb holder recheck due to bomb drop status"); data.recheck_bomb_holder = true; } From 3e31733f069a001d13b4fd353ce83240ede8fab6 Mon Sep 17 00:00:00 2001 From: Janek <development@superyu.xyz> Date: Tue, 23 Apr 2024 21:40:51 +0200 Subject: [PATCH 5/5] Update mod.rs --- src/dma/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dma/mod.rs b/src/dma/mod.rs index c57f8d1..b63495e 100755 --- a/src/dma/mod.rs +++ b/src/dma/mod.rs @@ -52,8 +52,8 @@ pub async fn run(radar_data: ArcRwlockRadarData, connector: Connector, pcileech_ data.update_bomb(&mut ctx); } - if data.bomb_dropped != last_bomb_dropped && data.bomb_planted != last_bomb_planted { - log::debug!("Bomb holder recheck due to bomb drop status"); + if data.bomb_dropped != last_bomb_dropped || data.bomb_planted != last_bomb_planted { + log::debug!("Bomb holder recheck due to bomb status"); data.recheck_bomb_holder = true; }