Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

Вопрос Помогите написать WallHack Python

Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.


import threading
import time
import pyMeow as overlay
import keyboard
import struct
from typing import Iterator, Optional, Dict

from pynput.keyboard import Listener as KeyboardListener
from classes.config_manager import ConfigManager, Colors, COLOR_CHOICES
from classes.memory_manager import MemoryManager
from classes.logger import Logger
from classes.utility import Utility

# Initialize the logger for consistent logging
logger = Logger.get_logger(__name__)
# Define the main loop sleep time for reduced CPU usage
MAIN_LOOP_SLEEP = 0.05
# Number of entities to iterate over
ENTITY_COUNT = 32
# Size of each entity entry in memory
ENTITY_ENTRY_SIZE = 112
# Skeleton bone structure {parent_bone_id: [child_bone_ids]}
SKELETON_BONES = {
# Trunk Core Chain
6: [5], # Head -> Neck
5: [4], # Neck -> Chest
4: [3, 13, 8], # Chest -> Stomach, Right Shoulder, Left Shoulder
3: [2], # Stomach -> Center Point
2: [1], # Center Point -> Small Head
1: [0], # Small Head -> Pelvis
# Right Hand Chain (4 points)
13: [14], # Right Shoulder -> Right Elbow
14: [15], # Right Elbow -> Right Wrist
15: [16], # Right Wrist -> Right Hand
# Left Arm Chain (4 points)
8: [9], # Left Shoulder -> Left Elbow
9: [10], # Left Elbow -> Left Wrist
10: [11], # Left Wrist -> Left Hand
# Legs Chain
0: [22, 25], # Pelvis -> Left Hip, Right Hip
22: [23], # Left Hip -> Left Knee
23: [24], # Left Knee -> Left Foot
25: [26], # Right Hip -> Right Knee
26: [27], # Right Knee -> Right Foot
}
ALL_BONE_IDS = set(SKELETON_BONES.keys())
for _bones in SKELETON_BONES.values():
ALL_BONE_IDS.update(_bones)
MAX_BONE_ID = max(ALL_BONE_IDS) if ALL_BONE_IDS else 0

class Entity:
"""Represents a game entity with cached data for efficient access."""
def __init__(self, controller_ptr: int, pawn_ptr: int, memory_manager: MemoryManager) -> None:
self.controller_ptr = controller_ptr
self.pawn_ptr = pawn_ptr
self.memory_manager = memory_manager
self.pos2d: Optional[Dict[str, float]] = None
self.head_pos2d: Optional[Dict[str, float]] = None

# Cached data
self.name: str = ""
self.health: int = 0
self.team: int = -1
self.pos: Dict[str, float] = {"x": 0.0, "y": 0.0, "z": 0.0}
self.dormant: bool = True
self.all_bones_pos_3d: Optional[Dict[int, Dict[str, float]]] = None

def update(self, use_transliteration: bool, skeleton_enabled: bool) -> bool:
"""Update all entity data at once to minimize memory reads."""
try:
self.health = self.memory_manager.read_int(self.pawn_ptr + self.memory_manager.m_iHealth)
if self.health <= 0:
return False

self.dormant = bool(self.memory_manager.read_int(self.pawn_ptr + self.memory_manager.m_bDormant))
if self.dormant:
return False

self.team = self.memory_manager.read_int(self.pawn_ptr + self.memory_manager.m_iTeamNum)
self.pos = self.memory_manager.read_vec3(self.pawn_ptr + self.memory_manager.m_vOldOrigin)

raw_name = self.memory_manager.read_string(self.controller_ptr + self.memory_manager.m_iszPlayerName)
self.name = Utility.transliterate(raw_name) if use_transliteration else raw_name

if skeleton_enabled:
self.all_bones_pos_3d = self.all_bone_pos()
else:
self.all_bones_pos_3d = None

return True
except Exception:
return False

def bone_pos(self, bone: int) -> Dict[str, float]:
"""Get the 3D position of a specific bone, using cached data if available."""
if self.all_bones_pos_3d and bone in self.all_bones_pos_3d:
return self.all_bones_pos_3d[bone]

# Fallback to direct read if not in cache
try:
game_scene = self.memory_manager.read_longlong(self.pawn_ptr + self.memory_manager.m_pGameSceneNode)
bone_array_ptr = self.memory_manager.read_longlong(game_scene + self.memory_manager.m_pBoneArray)
return self.memory_manager.read_vec3(bone_array_ptr + bone * 32)
except Exception as e:
# logger.error(f"Failed to get bone position for bone {bone}: {e}")
return {"x": 0.0, "y": 0.0, "z": 0.0}

def all_bone_pos(self) -> Optional[Dict[int, Dict[str, float]]]:
"""Get all bone positions by reading the bone matrix."""
try:
game_scene = self.memory_manager.read_longlong(self.pawn_ptr + self.memory_manager.m_pGameSceneNode)
bone_array_ptr = self.memory_manager.read_longlong(game_scene + self.memory_manager.m_pBoneArray)
if not bone_array_ptr:
return None

num_bones_to_read = MAX_BONE_ID + 1
data = self.memory_manager.pm.read_bytes(bone_array_ptr, num_bones_to_read * 32)
if not data:
return None

bone_positions = {}
for i in ALL_BONE_IDS:
offset = i * 32
try:
x, y, z = struct.unpack_from('fff', data, offset)
bone_positions = {"x": x, "y": y, "z": z}
except struct.error:
# This can happen if the data is smaller than expected
continue
return bone_positions
except Exception as e:
# logger.error(f"Failed to get all bone positions: {e}")
return None

@staticmethod
def validate_screen_position(pos: Dict[str, float]) -> bool:
"""Validate if a screen position is within bounds."""
screen_width = overlay.get_screen_width()
screen_height = overlay.get_screen_height()
return 0 <= pos["x"] <= screen_width and 0 <= pos["y"] <= screen_height

class CS2Overlay:
"""Manages the ESP overlay for Counter-Strike 2."""
def __init__(self, memory_manager: MemoryManager) -> None:
"""
Initialize the Overlay with a shared MemoryManager instance.
"""
self.config = ConfigManager.load_config()
self.memory_manager = memory_manager
self.is_running = False
self.stop_event = threading.Event()
self.local_team = None
self.screen_width = overlay.get_screen_width()
self.screen_height = overlay.get_screen_height()
self.load_configuration()

def load_configuration(self) -> None:
"""Load and apply configuration settings."""
settings = self.config['Overlay']
self.enable_box = settings['enable_box']
self.enable_skeleton = settings.get('enable_skeleton', True)
self.draw_snaplines = settings['draw_snaplines']
self.snaplines_color_hex = settings['snaplines_color_hex']
self.box_line_thickness = settings['box_line_thickness']
self.box_color_hex = settings['box_color_hex']
self.text_color_hex = settings['text_color_hex']
self.draw_health_numbers = settings['draw_health_numbers']
self.use_transliteration = settings['use_transliteration']
self.draw_nicknames = settings['draw_nicknames']
self.draw_teammates = settings['draw_teammates']
self.teammate_color_hex = settings['teammate_color_hex']
self.target_fps = int(settings['target_fps'])

def update_config(self, config: dict) -> None:
"""Update the configuration settings."""
self.config = config
self.load_configuration()
logger.debug("Overlay configuration updated.")

def iterate_entities(self, local_controller_ptr: int) -> Iterator[Entity]:
"""Iterate over game entities and yield valid Entity objects."""
try:
ent_list_ptr = self.memory_manager.read_longlong(self.memory_manager.client_dll_base + self.memory_manager.dwEntityList)
except Exception as e:
# logger.error(f"Error reading entity list pointer: {e}")
return

for i in range(1, ENTITY_COUNT + 1):
try:
list_index = (i & 0x7FFF) >> 9
entity_index = i & 0x1FF
entry_ptr = self.memory_manager.read_longlong(ent_list_ptr + (8 * list_index) + 16)
if not entry_ptr: continue

controller_ptr = self.memory_manager.read_longlong(entry_ptr + ENTITY_ENTRY_SIZE * entity_index)
if not controller_ptr or controller_ptr == local_controller_ptr: continue

controller_pawn_ptr = self.memory_manager.read_longlong(controller_ptr + self.memory_manager.m_hPlayerPawn)
if not controller_pawn_ptr: continue

list_entry_ptr = self.memory_manager.read_longlong(ent_list_ptr + 8 * ((controller_pawn_ptr & 0x7FFF) >> 9) + 16)
if not list_entry_ptr: continue

pawn_ptr = self.memory_manager.read_longlong(list_entry_ptr + ENTITY_ENTRY_SIZE * (controller_pawn_ptr & 0x1FF))
if not pawn_ptr: continue

entity = Entity(controller_ptr, pawn_ptr, self.memory_manager)
if entity.update(self.use_transliteration, self.enable_skeleton):
yield entity
except Exception:
continue

def draw_skeleton(self, entity: Entity, view_matrix: list, color: tuple, all_bones_pos_3d: Dict[int, Dict[str, float]]) -> None:
"""Draw the skeleton of an entity."""
try:
if not all_bones_pos_3d:
return

bone_positions_2d = {}
for bone_id in ALL_BONE_IDS:
if bone_id in all_bones_pos_3d:
pos_3d = all_bones_pos_3d[bone_id]
try:
pos_2d = overlay.world_to_screen(view_matrix, pos_3d, 1)
except Exception:
pos_2d = None

if pos_2d and entity.validate_screen_position(pos_2d):
bone_positions_2d[bone_id] = pos_2d

for start_bone, end_bones in SKELETON_BONES.items():
if start_bone in bone_positions_2d:
for end_bone in end_bones:
if end_bone in bone_positions_2d:
overlay.draw_line(
bone_positions_2d[start_bone]["x"],
bone_positions_2d[start_bone]["y"],
bone_positions_2d[end_bone]["x"],
bone_positions_2d[end_bone]["y"],
color,
1.5
)
except Exception as e:
logger.error(f"Error drawing skeleton: {e}")

def draw_entity(self, entity: Entity, view_matrix: list, is_teammate: bool = False) -> None:
"""Render the ESP overlay for a given entity."""
try:
head_pos_3d = entity.bone_pos(6)

try:
pos2d = overlay.world_to_screen(view_matrix, entity.pos, 1)
head_pos2d = overlay.world_to_screen(view_matrix, head_pos_3d, 1)
except Exception:
return

if not entity.validate_screen_position(pos2d) or not entity.validate_screen_position(head_pos2d):
return

entity.pos2d = pos2d
entity.head_pos2d = head_pos2d

head_y = entity.head_pos2d["y"]
pos_y = entity.pos2d["y"]
box_height = pos_y - head_y
box_width = box_height / 2
half_width = box_width / 2

outline_color = overlay.get_color(self.teammate_color_hex if is_teammate else self.box_color_hex)
text_color = overlay.get_color(self.text_color_hex)

if self.enable_skeleton and entity.all_bones_pos_3d:
self.draw_skeleton(entity, view_matrix, outline_color, entity.all_bones_pos_3d)

if self.draw_snaplines:
screen_width = overlay.get_screen_width()
screen_height = overlay.get_screen_height()
overlay.draw_line(
screen_width / 2,
screen_height / 2,
entity.head_pos2d["x"],
entity.head_pos2d["y"],
overlay.get_color(self.snaplines_color_hex),
2
)

if self.enable_box:
overlay.draw_rectangle(
entity.head_pos2d["x"] - half_width,
entity.head_pos2d["y"] - half_width / 2,
box_width,
box_height + half_width / 2,
Colors.grey
)
overlay.draw_rectangle_lines(
entity.head_pos2d["x"] - half_width,
entity.head_pos2d["y"] - half_width / 2,
box_width,
box_height + half_width / 2,
outline_color,
self.box_line_thickness
)

if self.draw_nicknames:
nickname = entity.name
nickname_font_size = 11
nickname_width = overlay.measure_text(nickname, nickname_font_size)
overlay.draw_text(
nickname,
entity.head_pos2d["x"] - nickname_width // 2,
entity.head_pos2d["y"] - half_width / 2 - 15,
nickname_font_size,
text_color
)

bar_width = 4
bar_margin = 2
bar_x = entity.head_pos2d["x"] - half_width - bar_width - bar_margin
bar_y = entity.head_pos2d["y"] - half_width / 2
bar_height = box_height + half_width / 2
overlay.draw_rectangle(
bar_x,
bar_y,
bar_width,
bar_height,
overlay.get_color("black")
)
health_percent = max(0, min(entity.health, 100))
fill_height = (health_percent / 100.0) * bar_height
if health_percent <= 20:
fill_color = overlay.get_color("red")
elif health_percent <= 50:
fill_color = overlay.get_color("yellow")
else:
fill_color = overlay.get_color("green")
fill_y = bar_y + (bar_height - fill_height)
overlay.draw_rectangle(
bar_x,
fill_y,
bar_width,
fill_height,
fill_color
)
if self.draw_health_numbers:
health_text = f"{entity.health}"
overlay.draw_text(
health_text,
int(bar_x - 25),
int(bar_y + bar_height / 2 - 5),
10,
text_color
)
except Exception as e:
logger.error(f"Error drawing entity: {e}")

def start(self) -> None:
"""Start the Overlay."""
self.is_running = True
self.stop_event.clear()

try:
# Initialize with unlimited FPS and let our loop handle the delay
overlay.overlay_init("Counter-Strike 2", fps=0)
except Exception as e:
logger.error(f"Overlay initialization error: {e}")
self.is_running = False
return

frame_time = 1.0 / self.target_fps
is_game_active = Utility.is_game_active
sleep = time.sleep

while not self.stop_event.is_set():
start_time = time.time()

try:
if not is_game_active():
sleep(MAIN_LOOP_SLEEP)
continue

view_matrix = self.memory_manager.read_floats(self.memory_manager.client_dll_base + self.memory_manager.dwViewMatrix, 16)

local_controller_ptr = self.memory_manager.read_longlong(self.memory_manager.client_dll_base + self.memory_manager.dwLocalPlayerController)
if local_controller_ptr:
local_pawn_ptr = self.memory_manager.read_longlong(self.memory_manager.client_dll_base + self.memory_manager.dwLocalPlayerPawn)
if local_pawn_ptr:
self.local_team = self.memory_manager.read_int(local_pawn_ptr + self.memory_manager.m_iTeamNum)
else:
self.local_team = None
else:
self.local_team = None

entities = list(self.iterate_entities(local_controller_ptr))

if overlay.overlay_loop():
overlay.begin_drawing()
overlay.draw_fps(0, 0)

for entity in entities:
is_teammate = self.local_team is not None and entity.team == self.local_team
if is_teammate and not self.draw_teammates:
continue
self.draw_entity(entity, view_matrix, is_teammate)

overlay.end_drawing()

elapsed_time = time.time() - start_time
sleep_time = frame_time - elapsed_time
if sleep_time > 0:
sleep(sleep_time)
except Exception as e:
logger.error(f"Unexpected error in main loop: {e}", exc_info=True)
sleep(MAIN_LOOP_SLEEP)

overlay.overlay_close()
logger.debug("Overlay loop ended.")

def stop(self) -> None:
"""Stop the Overlay and clean up resources."""
self.is_running = False
self.stop_event.set()
time.sleep(0.1)
logger.debug("Overlay stopped.")

Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.

Оффсеты сам ищи
 

Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.


import pymem
import pymem.process
import struct

from classes.logger import Logger
from classes.utility import Utility

# Initialize the logger for consistent logging
logger = Logger.get_logger(__name__)

class MemoryManager:
def __init__(self, offsets: dict, client_data: dict, buttons_data: dict) -> None:
"""Initialize MemoryManager with offsets and client data."""
self.offsets = offsets
self.client_data = client_data
self.buttons_data = buttons_data
self.pm = None
self.client_base = None
self.ent_list = None # Cache for entity list pointer
self.config = None # Configuration cache
# Offset attributes
self.dwEntityList = None
self.dwLocalPlayerPawn = None
self.dwLocalPlayerController = None
self.dwViewMatrix = None
self.m_iHealth = None
self.m_iTeamNum = None
self.m_iIDEntIndex = None
self.m_iszPlayerName = None
self.m_vOldOrigin = None
self.m_pGameSceneNode = None
self.m_bDormant = None
self.m_hPlayerPawn = None
self.m_flFlashDuration = None
self.m_pBoneArray = None
self.dwForceJump = None
self.m_pClippingWeapon = None
self.m_AttributeManager = None
self.m_iItemDefinitionIndex = None
self.m_Item = None
self.m_pWeaponServices = None
self.m_hActiveWeapon = None

def initialize(self) -> bool:
"""
Initialize memory access by attaching to the process and setting up necessary data.
Returns True if successful, False otherwise.
"""
# Check if pymem is initialized and the client module is retrieved
if not self.initialize_pymem() or not self.get_client_module():
return False
# Cache the entity list pointer
self.load_offsets()
if self.dwEntityList is None: # Ensure offsets were loaded successfully
return False
self.ent_list = self.read_longlong(self.client_base + self.dwEntityList)
return True

def initialize_pymem(self) -> bool:
"""Attach pymem to the game process."""
try:
# Attempt to attach to the cs2.exe process
self.pm = pymem.Pymem("cs2.exe")
logger.debug("Successfully attached to cs2.exe process.")
return True
except pymem.exception.ProcessNotFound:
# Log an error if the process is not found
logger.error("cs2.exe process not found. Ensure the game is running.")
return False
except Exception as e:
# Log any other exceptions that may occur
logger.error(f"Unexpected error while attaching to cs2.exe: {e}")
return False

def get_client_module(self) -> bool:
"""Retrieve the client.dll module base address."""
try:
# Attempt to retrieve the client.dll module
client_module = pymem.process.module_from_name(self.pm.process_handle, "client.dll")
self.client_base = client_module.lpBaseOfDll
logger.debug("client.dll module found and base address retrieved.")
return True
except pymem.exception.ModuleNotFoundError:
# Log an error if the module is not found
logger.error("client.dll not found. Ensure it is loaded.")
return False
except Exception as e:
# Log any other exceptions that may occur
logger.error(f"Unexpected error while retrieving client.dll module: {e}")
return False

def load_offsets(self) -> None:
"""Load memory offsets from Utility.extract_offsets."""
extracted = Utility.extract_offsets(self.offsets, self.client_data, self.buttons_data)
if extracted:
self.dwEntityList = extracted["dwEntityList"]
self.dwLocalPlayerPawn = extracted["dwLocalPlayerPawn"]
self.dwLocalPlayerController = extracted["dwLocalPlayerController"]
self.dwViewMatrix = extracted["dwViewMatrix"]
# self.dwForceJump = extracted["dwForceJump"]
self.m_iHealth = extracted["m_iHealth"]
self.m_iTeamNum = extracted["m_iTeamNum"]
self.m_iIDEntIndex = extracted["m_iIDEntIndex"]
self.m_iszPlayerName = extracted["m_iszPlayerName"]
self.m_vOldOrigin = extracted["m_vOldOrigin"]
self.m_pGameSceneNode = extracted["m_pGameSceneNode"]
self.m_bDormant = extracted["m_bDormant"]
self.m_hPlayerPawn = extracted["m_hPlayerPawn"]
self.m_flFlashDuration = extracted["m_flFlashDuration"]
self.m_pBoneArray = extracted["m_pBoneArray"]
self.m_pClippingWeapon = extracted["m_pClippingWeapon"]
self.m_AttributeManager = extracted["m_AttributeManager"]
self.m_iItemDefinitionIndex = extracted["m_iItemDefinitionIndex"]
self.m_Item = extracted["m_Item"]
self.m_pWeaponServices = extracted["m_pWeaponServices"]
self.m_hActiveWeapon = extracted["m_hActiveWeapon"]
else:
logger.error("Failed to initialize offsets from extracted data.")

def get_entity(self, index: int):
"""Retrieve an entity from the entity list."""
try:
# Use cached entity list pointer
list_offset = 0x8 * (index >> 9)
ent_entry = self.read_longlong(self.ent_list + list_offset + 0x10)
entity_offset = 112 * (index & 0x1FF)
return self.read_longlong(ent_entry + entity_offset)
except Exception as e:
logger.error(f"Error reading entity: {e}")
return None

def get_fire_logic_data(self) -> dict | None:
"""Retrieve data necessary for firing logic."""
try:
player = self.read_longlong(self.client_base + self.dwLocalPlayerPawn)
entity_id = self.read_int(player + self.m_iIDEntIndex)

if entity_id > 0:
entity = self.get_entity(entity_id)
if entity:
entity_team = self.read_int(entity + self.m_iTeamNum)
player_team = self.read_int(player + self.m_iTeamNum)
entity_health = self.read_int(entity + self.m_iHealth)
weapon_type = self.get_weapon_type()
return {
"entity_team": entity_team,
"player_team": player_team,
"entity_health": entity_health,
"weapon_type": weapon_type
}
return None
except Exception as e:
if "Could not read memory at" in str(e):
logger.error("Game was updated, new offsets are required. Please wait for the offsets update.")
else:
logger.error(f"Error in fire logic: {e}")
return None

def get_weapon_type(self) -> str:
"""Get the type of the currently equipped weapon."""
try:
player = self.read_longlong(self.client_base + self.dwLocalPlayerPawn)
if not player: return "Rifles"

weapon_services_ptr = self.read_longlong(player + self.m_pWeaponServices)
if not weapon_services_ptr: return "Rifles"

weapon_handle = self.read_longlong(weapon_services_ptr + self.m_hActiveWeapon)
if not weapon_handle: return "Rifles"

weapon_id = weapon_handle & 0xFFFF
list_entry = self.read_longlong(self.ent_list + 8 * ((weapon_id & 0x7FFF) >> 9) + 16)
if not list_entry: return "Rifles"

weapon_entity_ptr = self.read_longlong(list_entry + 112 * (weapon_id & 0x1FF))
if not weapon_entity_ptr: return "Rifles"

attribute_manager_ptr = self.read_longlong(weapon_entity_ptr + self.m_AttributeManager)
if not attribute_manager_ptr: return "Rifles"

item_ptr = self.read_longlong(attribute_manager_ptr + self.m_Item)
if not item_ptr: return "Rifles"

item_id = self.read_int(item_ptr + self.m_iItemDefinitionIndex)

weapon_map = {
1: "Pistols", 2: "Pistols", 3: "Pistols", 4: "Pistols", 30: "Pistols", 32: "Pistols", 36: "Pistols", 61: "Pistols", 63: "Pistols", 64: "Pistols",
7: "Rifles", 8: "Rifles", 10: "Rifles", 13: "Rifles", 16: "Rifles", 39: "Rifles", 60: "Rifles",
9: "Snipers", 11: "Snipers", 38: "Snipers", 40: "Snipers",
17: "SMGs", 19: "SMGs", 23: "SMGs", 24: "SMGs", 26: "SMGs", 33: "SMGs", 34: "SMGs",
14: "Heavy", 25: "Heavy", 27: "Heavy", 28: "Heavy", 35: "Heavy"
}
return weapon_map.get(item_id, "Rifles")
except Exception as e:
# logger.error(f"Error getting weapon type: {e}")
return "Rifles"

def write_float(self, address: int, value: float) -> None:
"""Write a float to memory."""
try:
self.pm.write_float(address, value)
logger.debug(f"Wrote float {value} to address {hex(address)}")
except Exception as e:
logger.error(f"Failed to write float at address {hex(address)}: {e}")
raise

def write_int(self, address: int, value: int) -> None:
"""Write an integer to memory."""
try:
self.pm.write_int(address, value)
logger.debug(f"Wrote int {value} to address {hex(address)}")
except Exception as e:
logger.error(f"Failed to write int at address {hex(address)}: {e}")
raise

def read_vec3(self, address: int) -> dict | None:
"""
Reads a 3D vector (three floats) from memory at the specified address.
"""
try:
return {
"x": self.pm.read_float(address),
"y": self.pm.read_float(address + 4),
"z": self.pm.read_float(address + 8)
}
except Exception as e:
logger.error(f"Failed to read vec3 at address {hex(address)}: {e}")
return {"x": 0.0, "y": 0.0, "z": 0.0}

def read_string(self, address: int, max_length: int = 256) -> str:
"""
Reads a null-terminated string from memory at the specified address.
"""
try:
data = self.pm.read_bytes(address, max_length)
string_data = data.split(b'\x00')[0]
return string_data.decode('utf-8', errors='replace')
except Exception as e:
logger.error(f"Failed to read string at address {hex(address)}: {e}")
return ""

def read_floats(self, address: int, count: int) -> list[float]:
"""
Reads an array of `count` floats from memory.
"""
try:
data = self.pm.read_bytes(address, count * 4)
return list(struct.unpack(f'{count}f', data))
except Exception as e:
logger.error(f"Failed to read {count} floats at address {hex(address)}: {e}")
return []

def read_int(self, address: int) -> int:
"""Read an integer from memory."""
try:
return self.pm.read_int(address)
except Exception as e:
logger.error(f"Failed to read int at address {hex(address)}: {e}")
return 0

def read_longlong(self, address: int) -> int:
"""Read a long long from memory."""
try:
return self.pm.read_longlong(address)
except Exception as e:
logger.error(f"Failed to read longlong at address {hex(address)}: {e}")
return 0

@property
def client_dll_base(self) -> int:
"""Get the base address of client.dll."""
return self.client_base

Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.



{
"a2x": {
"name": "A2X Source",
"author": "a2x",
"repository": "a2x/cs2-dumper",
"offsets_url": "
Пожалуйста, авторизуйтесь для просмотра ссылки.
",
"client_dll_url": "
Пожалуйста, авторизуйтесь для просмотра ссылки.
",
"buttons_url": "
Пожалуйста, авторизуйтесь для просмотра ссылки.
"
},
"jesewe": {
"name": "Jesewe Source",
"author": "Jesewe",
"repository": "Jesewe/cs2-dumper",
"offsets_url": "
Пожалуйста, авторизуйтесь для просмотра ссылки.
",
"client_dll_url": "
Пожалуйста, авторизуйтесь для просмотра ссылки.
",
"buttons_url": "
Пожалуйста, авторизуйтесь для просмотра ссылки.
"
}
}
 
Назад
Сверху Снизу