Загрузка данных
import pymem
import pymem.process
import ctypes
import time
import math
user32 = ctypes.windll.user32
gdi32 = ctypes.windll.gdi32
# === ВАШИ ОФФСЕТЫ ===
OFFSET_VIEW_MATRIX = 0x12EB10 # client.dll + 0x12EB10
OFFSET_ENTITY_ORIGIN = 0x12047A0 # hw.dll + 0x12047A0
OFFSET_LOCAL_ORIGIN = 0x13E7F0 # client.dll + 0x13E7F0
OFFSET_GET_TEAM = 0x100DF4 # client.dll + 0x100DF4
OFFSET_HEALTH = 0xF8 # стандартное смещение (если есть)
ESP_ENABLED = True
ESP_COLOR = 0x0000FF # Красный
SCREEN_W = 800
SCREEN_H = 600
def get_window_size():
hwnd = user32.FindWindowW(None, "Counter-Strike")
rect = ctypes.wintypes.RECT()
user32.GetWindowRect(hwnd, ctypes.byref(rect))
return rect.right - rect.left, rect.bottom - rect.top
def world_to_screen(x, y, z, view_matrix, sw, sh):
w = view_matrix[12]*x + view_matrix[13]*y + view_matrix[14]*z + view_matrix[15]
if w < 0.01:
return None
sx = view_matrix[0]*x + view_matrix[1]*y + view_matrix[2]*z + view_matrix[3]
sy = view_matrix[4]*x + view_matrix[5]*y + view_matrix[6]*z + view_matrix[7]
sx = (sw / 2) * (1 + sx / w)
sy = (sh / 2) * (1 - sy / w)
return (sx, sy)
def draw_rect(dc, x, y, w, h, color):
brush = gdi32.CreateSolidBrush(color)
gdi32.SelectObject(dc, brush)
gdi32.Rectangle(dc, int(x - w/2), int(y - h/2), int(x + w/2), int(y + h/2))
gdi32.DeleteObject(brush)
def main():
global SCREEN_W, SCREEN_H
SCREEN_W, SCREEN_H = get_window_size()
print("=== CS 1.6 ESP (без EntityList) ===")
print("Rutube: https://rutube.ru/channel/43805541")
print("Telegram: hackeriks")
print()
try:
pm = pymem.Pymem("hl.exe")
print("[+] hl.exe найден")
except:
print("[-] CS 1.6 не запущена")
return
# Получаем базы модулей
hw_dll = pymem.process.module_from_name(pm.process_handle, "hw.dll")
client_dll = pymem.process.module_from_name(pm.process_handle, "client.dll")
hw_base = hw_dll.lpBaseOfDll
client_base = client_dll.lpBaseOfDll
print(f"[+] hw.dll base: {hex(hw_base)}")
print(f"[+] client.dll base: {hex(client_base)}")
# Получаем дескриптор окна для рисования
hwnd = user32.FindWindowW(None, "Counter-Strike")
dc = user32.GetDC(hwnd)
print("[*] ESP активен. F1 - вкл/выкл, F2 - выход")
global ESP_ENABLED
running = True
while running:
# Управление
if user32.GetAsyncKeyState(0x70) & 1: # F1
ESP_ENABLED = not ESP_ENABLED
print(f"ESP: {'ON' if ESP_ENABLED else 'OFF'}")
time.sleep(0.2)
if user32.GetAsyncKeyState(0x71) & 1: # F2
running = False
break
if not ESP_ENABLED:
time.sleep(0.05)
continue
# Очищаем экран
brush = gdi32.CreateSolidBrush(0x000000)
gdi32.SelectObject(dc, brush)
gdi32.Rectangle(dc, 0, 0, SCREEN_W, SCREEN_H)
gdi32.DeleteObject(brush)
try:
# Читаем матрицу вида
view_matrix = []
for i in range(16):
view_matrix.append(pm.read_float(client_base + OFFSET_VIEW_MATRIX + i*4))
# Свои координаты
local_x = pm.read_float(client_base + OFFSET_LOCAL_ORIGIN)
local_y = pm.read_float(client_base + OFFSET_LOCAL_ORIGIN + 4)
local_z = pm.read_float(client_base + OFFSET_LOCAL_ORIGIN + 8)
# Своя команда
local_team = pm.read_int(client_base + OFFSET_GET_TEAM)
# Перебираем возможные адреса игроков (hw.dll + 0x1200000 + смещение)
for offset in range(0, 0x10000, 0x100): # грубый перебор
try:
entity = hw_base + OFFSET_ENTITY_ORIGIN + offset
# Координаты возможного игрока
x = pm.read_float(entity)
y = pm.read_float(entity + 4)
z = pm.read_float(entity + 8)
# Фильтр: координаты не должны быть нулевыми и не своими
if x == 0 and y == 0 and z == 0:
continue
if abs(x - local_x) < 10 and abs(y - local_y) < 10:
continue
# Команда (есть ли по этому адресу?)
try:
team = pm.read_int(entity + 0x20) # примерное смещение команды
except:
team = -1
# Если команда совпадает с локальной — пропускаем
if team == local_team:
continue
# Рисуем рамку
screen = world_to_screen(x, y, z + 60, view_matrix, SCREEN_W, SCREEN_H)
if screen:
draw_rect(dc, screen[0], screen[1], 20, 30, ESP_COLOR)
except:
pass
except Exception as e:
pass
time.sleep(0.03)
user32.ReleaseDC(hwnd, dc)
print("ESP остановлен.")
if __name__ == "__main__":
main()