mirror of
https://github.com/a2x/cs2-dumper.git
synced 2026-04-18 02:09:58 +08:00
0.1.2
* Updated for memflow 0.2.2 * Replaced periods with underscores in generated file names for easier inclusion * Program execution now continues if analysis fails at any point * Removed custom error type in favor of anyhow * Added logging to cs2-dumper.log * Now compilable on Linux
This commit is contained in:
@@ -1,3 +1,7 @@
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
use anyhow::{bail, Result};
|
||||
|
||||
use log::debug;
|
||||
|
||||
use memflow::prelude::v1::*;
|
||||
@@ -5,20 +9,16 @@ use memflow::prelude::v1::*;
|
||||
use pelite::pattern;
|
||||
use pelite::pe64::{Pe, PeView};
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::error::{Error, Result};
|
||||
use crate::source2::KeyButton;
|
||||
|
||||
#[derive(Debug, Deserialize, Serialize)]
|
||||
pub struct Button {
|
||||
pub name: String,
|
||||
pub value: u32,
|
||||
}
|
||||
pub type ButtonMap = BTreeMap<String, imem>;
|
||||
|
||||
pub fn buttons(process: &mut IntoProcessInstanceArcBox<'_>) -> Result<Vec<Button>> {
|
||||
pub fn buttons(process: &mut IntoProcessInstanceArcBox<'_>) -> Result<ButtonMap> {
|
||||
let module = process.module_by_name("client.dll")?;
|
||||
let buf = process.read_raw(module.base, module.size as _)?;
|
||||
|
||||
let buf = process
|
||||
.read_raw(module.base, module.size as _)
|
||||
.data_part()?;
|
||||
|
||||
let view = PeView::from_bytes(&buf)?;
|
||||
|
||||
@@ -28,7 +28,7 @@ pub fn buttons(process: &mut IntoProcessInstanceArcBox<'_>) -> Result<Vec<Button
|
||||
.scanner()
|
||||
.finds_code(pattern!("488b15${'} 4885d2 74? 0f1f40"), &mut save)
|
||||
{
|
||||
return Err(Error::Other("unable to find button list pattern"));
|
||||
bail!("outdated button list pattern");
|
||||
}
|
||||
|
||||
read_buttons(process, &module, module.base + save[1])
|
||||
@@ -38,32 +38,28 @@ fn read_buttons(
|
||||
process: &mut IntoProcessInstanceArcBox<'_>,
|
||||
module: &ModuleInfo,
|
||||
list_addr: Address,
|
||||
) -> Result<Vec<Button>> {
|
||||
let mut buttons = Vec::new();
|
||||
) -> Result<ButtonMap> {
|
||||
let mut map = ButtonMap::new();
|
||||
|
||||
let mut cur_button = Pointer64::<KeyButton>::from(process.read_addr64(list_addr)?);
|
||||
let mut cur_button = Pointer64::<KeyButton>::from(process.read_addr64(list_addr).data_part()?);
|
||||
|
||||
while !cur_button.is_null() {
|
||||
let button = cur_button.read(process)?;
|
||||
let name = button.name.read_string(process)?.to_string();
|
||||
|
||||
let value =
|
||||
((cur_button.address() - module.base) + offset_of!(KeyButton.state) as i64) as u32;
|
||||
let button = process.read_ptr(cur_button).data_part()?;
|
||||
let name = process.read_utf8(button.name.address(), 32).data_part()?;
|
||||
let rva = (cur_button.address() - module.base) + offset_of!(KeyButton.state) as imem;
|
||||
|
||||
debug!(
|
||||
"found button: {} @ {:#X} ({} + {:#X})",
|
||||
"found button: {} at {:#X} ({} + {:#X})",
|
||||
name,
|
||||
value as u64 + module.base.to_umem(),
|
||||
cur_button.to_umem() + offset_of!(KeyButton.state) as umem,
|
||||
module.name,
|
||||
value
|
||||
rva
|
||||
);
|
||||
|
||||
buttons.push(Button { name, value });
|
||||
map.insert(name, rva);
|
||||
|
||||
cur_button = button.next;
|
||||
}
|
||||
|
||||
buttons.sort_unstable_by(|a, b| a.name.cmp(&b.name));
|
||||
|
||||
Ok(buttons)
|
||||
Ok(map)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user