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


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
        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:
            return
        self.handle = ctypes.windll.kernel32.OpenProcess(0x10 | 0x20, False, self.pid)
        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

    def read(self, addr, 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("400x600")
        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=30)
        self.listbox.pack(fill=tk.BOTH, expand=True)
        self.mem = Memory()
        if not self.mem.base:
            self.label.config(text="Rust не запущен!")
            return
        self.update()

    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:
            pass
        self.root.after(300, self.update)

if __name__ == "__main__":
    app = ESP()
    app.root.mainloop()