Загрузка данных
import ctypes
import struct
import psutil
import math
import tkinter as tk
import sys
class Memory:
def __init__(self):
self.pid = None
self.handle = None
self.base = None
print("[*] Поиск Rust...")
# Ищем Rust (любой процесс с "rust" в названии)
for proc in psutil.process_iter(['pid', 'name']):
name = proc.info['name'].lower()
if 'rust' in name:
self.pid = proc.info['pid']
print(f"[+] Найден процесс: {proc.info['name']} (PID: {self.pid})")
break
# Если не нашли - выводим все процессы для диагностики
if not self.pid:
print("[-] Rust не найден! Вот все запущенные процессы:")
for proc in psutil.process_iter(['pid', 'name']):
print(f" {proc.info['name']} (PID: {proc.info['pid']})")
return
# Открываем процесс
self.handle = ctypes.windll.kernel32.OpenProcess(0x10 | 0x20, False, self.pid)
if not self.handle:
print("[-] Не удалось открыть процесс! Запусти от администратора.")
return
# Ищем GameAssembly.dll
try:
for m in psutil.Process(self.pid).memory_maps():
if 'gameassembly.dll' in m.path.lower():
if hasattr(m, 'addr'):
self.base = m.addr
elif hasattr(m, 'start'):
self.base = m.start
print(f"[+] GameAssembly.dll найден! База: {hex(self.base)}")
break
except:
pass
if not self.base:
print("[-] GameAssembly.dll не найден!")
def read(self, addr, size):
if not self.handle:
return b'\x00' * size
buf = ctypes.create_string_buffer(size)
read = ctypes.c_ulong(0)
ctypes.windll.kernel32.ReadProcessMemory(self.handle, addr, buf, size, ctypes.byref(read))
return buf.raw
def read_int(self, addr):
return struct.unpack('i', self.read(addr, 4))[0]
def read_float(self, addr):
return struct.unpack('f', self.read(addr, 4))[0]
def read_vec3(self, addr):
return (self.read_float(addr), self.read_float(addr+4), self.read_float(addr+8))
class ESP:
def __init__(self):
self.root = tk.Tk()
self.root.title("ESP")
self.root.geometry("500x700")
self.root.attributes("-topmost", True)
self.root.configure(bg='black')
self.label = tk.Label(self.root, text="Загрузка...", fg="white", bg="black", font=("Arial", 12))
self.label.pack(pady=10)
self.listbox = tk.Listbox(self.root, bg="black", fg="#00ff00", font=("Consolas", 10), height=35)
self.listbox.pack(fill=tk.BOTH, expand=True)
self.mem = Memory()
if not self.mem.base:
self.label.config(text="Rust не найден!\nЗапусти от администратора")
return
self.update()
self.root.mainloop()
def update(self):
try:
local = self.mem.read_int(self.mem.base + 0xDEA964)
if not local:
self.root.after(300, self.update)
return
local_team = self.mem.read_int(local + 0xF4)
local_pos = self.mem.read_vec3(local + 0x138)
entities = self.mem.read_int(self.mem.base + 0x4DFFFC4)
if not entities:
self.root.after(300, self.update)
return
enemies = []
for i in range(1, 65):
entity = self.mem.read_int(entities + i * 0x10)
if not entity:
continue
health = self.mem.read_int(entity + 0x100)
if health <= 0 or health > 100:
continue
team = self.mem.read_int(entity + 0xF4)
if team == local_team or team == 0:
continue
pos = self.mem.read_vec3(entity + 0x138)
dist = math.sqrt(
(pos[0] - local_pos[0])**2 +
(pos[1] - local_pos[1])**2 +
(pos[2] - local_pos[2])**2
)
if dist < 500 and dist > 0:
enemies.append(f"• {dist:.0f}м | X:{pos[0]:.1f} Y:{pos[1]:.1f}")
self.listbox.delete(0, tk.END)
for e in sorted(enemies):
self.listbox.insert(tk.END, e)
self.label.config(text=f"Врагов: {len(enemies)}")
except Exception as e:
self.label.config(text=f"Ошибка: {str(e)[:30]}")
self.root.after(300, self.update)
if __name__ == "__main__":
app = ESP()
app.root.mainloop()