Загрузка данных


import ctypes
import struct
import psutil
import math
import tkinter as tk

# ============================================
# КЛАСС ПАМЯТИ
# ============================================
class Memory:
    def __init__(self):
        self.pid = None
        self.handle = None
        self.base = None
        
        # Ищем Rust
        for p in psutil.process_iter(['pid', 'name']):
            if 'rust' in p.info['name'].lower():
                self.pid = p.info['pid']
                break
        
        if not self.pid:
            print("Rust не найден!")
            return
        
        # Открываем процесс
        self.handle = ctypes.windll.kernel32.OpenProcess(0x10 | 0x20, False, self.pid)
        if not self.handle:
            print("Не удалось открыть процесс!")
            return
        
        # Ищем GameAssembly.dll
        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
                break
        
        if self.base:
            print("[+] GameAssembly.dll найден!")
        else:
            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))

# ============================================
# ОКНО ESP
# ============================================
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="red", font=("Arial", 10), height=35)
        self.listbox.pack(fill=tk.BOTH, expand=True)
        
        self.mem = Memory()
        if not self.mem.base:
            self.label.config(text="Rust не запущен!")
            return
        
        self.update()
        self.root.mainloop()
    
    def update(self):
        try:
            OFFSET_LOCAL = 0xDEA964
            OFFSET_ENTITIES = 0x4DFFFC4
            
            local = self.mem.read_int(self.mem.base + OFFSET_LOCAL)
            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 + OFFSET_ENTITIES)
            
            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} Z:{pos[2]:.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()