115 lines
3.4 KiB
Python
115 lines
3.4 KiB
Python
from json import loads, load
|
|
from time import sleep
|
|
|
|
from pymem import Pymem
|
|
from requests import get
|
|
|
|
|
|
class Hack():
|
|
"""Base class for playing with CSGO memory"""
|
|
|
|
def __init__(self, offline: bool = False) -> None:
|
|
# Loading offsets
|
|
self.offsets = self._find_offsets(offline)
|
|
|
|
# Load virtual mapping of keys
|
|
self.vmap = self._find_keys()
|
|
|
|
# Load process
|
|
self.pm = self._find_process(True)
|
|
|
|
self.wait_time = 0.01
|
|
self.timeout = self.wait_time * 50
|
|
|
|
def _find_offsets(self, offline: bool) -> dict[str, int]:
|
|
"""Load CSGO offset from online repository or local file"""
|
|
if offline:
|
|
with open("hazedumper/csgo.min.json", "r") as f:
|
|
serial_data = load(f)
|
|
else:
|
|
hazedumper_data = get(
|
|
"https://raw.githubusercontent.com/frk1/hazedumper/master/csgo.min.json")
|
|
serial_data = loads(hazedumper_data.text)
|
|
|
|
return serial_data["signatures"] | serial_data["netvars"] | {
|
|
"entity_size": 0x10,
|
|
"glow_obj_size": 0x38,
|
|
"glow_R": 0x8,
|
|
"glow_G": 0xC,
|
|
"glow_B": 0x10,
|
|
"glow_A": 0x14,
|
|
"GOM_wall": 0x27,
|
|
"GOM_visible": 0x28,
|
|
"render_R": 0x0,
|
|
"render_G": 0x1,
|
|
"render_B": 0x2,
|
|
"float": 0x4,
|
|
"head_idx": 0x30 * 8,
|
|
"head_x": 0x0C,
|
|
"head_y": 0x1C,
|
|
"head_z": 0x2C,
|
|
}
|
|
|
|
def _find_keys(self) -> dict[str, int]:
|
|
"""https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes"""
|
|
return {
|
|
"SPACE": 0x20,
|
|
"+": 0xBB,
|
|
"LBUTTON": 0x01,
|
|
"END": 0x23,
|
|
"PAGE_UP": 0x21,
|
|
"PAGE_DOWN": 0x22,
|
|
}
|
|
|
|
def _find_process(self, verbose: bool = False) -> Pymem:
|
|
"""Find game process"""
|
|
process_found = False
|
|
print("Looking for process...") if verbose else None
|
|
|
|
pm = None
|
|
while not process_found:
|
|
try:
|
|
pm = Pymem("csgo.exe")
|
|
except:
|
|
sleep(self.timeout)
|
|
else:
|
|
print("Process found!") if verbose else None
|
|
process_found = True
|
|
|
|
if pm:
|
|
return pm
|
|
exit(1)
|
|
|
|
def find_module(self, module: str):
|
|
"""Find module address"""
|
|
found = None
|
|
for internal_module in list(self.pm.list_modules()):
|
|
if internal_module.name == module + ".dll":
|
|
found = internal_module.lpBaseOfDll
|
|
|
|
if found:
|
|
return found
|
|
else:
|
|
raise MemoryError("Maybe then game isn't fully loaded yet?")
|
|
|
|
def find_uint(self, base, offset: int) -> int:
|
|
"""Find unsigned integer in memory for sure"""
|
|
local_element = None
|
|
while not local_element:
|
|
local_element = self.pm.read_uint(base + offset)
|
|
|
|
sleep(self.timeout)
|
|
|
|
return local_element
|
|
|
|
def hack_loop(self, method, time: float | None = None):
|
|
"""Run the hack loop"""
|
|
if time == None:
|
|
time = self.wait_time
|
|
|
|
while True:
|
|
# Reduce CPU usage
|
|
sleep(time)
|
|
|
|
# Cheat
|
|
method()
|