Загрузка данных
import pymem
import pymem.process
import time
import struct
def find_offset_by_value(pm, start_addr, end_addr, target_value, value_type='int'):
"""Ищет смещение по значению"""
for offset in range(0, end_addr - start_addr, 4):
try:
addr = start_addr + offset
if value_type == 'int':
val = pm.read_int(addr)
else:
val = pm.read_float(addr)
if val == target_value:
return offset
except:
pass
return None
def main():
print("=" * 50)
print("CS 1.6 Диагностика (Steam 1.1.2.7)")
print("=" * 50)
# Подключаемся к игре
try:
pm = pymem.Pymem("hl.exe")
print("[+] hl.exe найден")
except:
print("[-] hl.exe не найден! Запустите CS 1.6")
input()
return
# Получаем базу клиента
client = pymem.process.module_from_name(pm.process_handle, "hw.dll")
client_base = client.lpBaseOfDll
client_size = client.SizeOfImage
print(f"[+] hw.dll base: {hex(client_base)}")
print(f"[+] hw.dll size: {hex(client_size)}")
# Ищем LocalPlayer
print("\n[*] Поиск dwLocalPlayer...")
local_player_addr = None
dwLocalPlayer = None
for offset in range(0, 0x200000, 4):
try:
addr = client_base + offset
health = pm.read_int(addr)
if health == 100:
team = pm.read_int(addr - 0x8)
if team in (1, 2):
local_player_addr = addr - 0xF8
dwLocalPlayer = offset - 0xF8
print(f"[+] Найдено!")
print(f" dwLocalPlayer = {hex(dwLocalPlayer)}")
print(f" Абсолютный адрес: {hex(local_player_addr)}")
break
except:
pass
if not local_player_addr:
print("[-] Не удалось найти LocalPlayer. Убедитесь, что вы в катке и живы.")
input()
return
# Получаем здоровье и команду локального игрока
health = pm.read_int(local_player_addr + 0xF8)
team = pm.read_int(local_player_addr + 0xF0)
print(f"\n[*] Локальный игрок:")
print(f" Здоровье: {health}")
print(f" Команда: {team} (1=T, 2=CT)")
# Ищем m_iHealth (обычно 0xF8)
print("\n[*] Поиск m_iHealth...")
if pm.read_int(local_player_addr + 0xF8) == health:
print(f"[+] m_iHealth = 0xF8")
else:
off = find_offset_by_value(pm, local_player_addr, local_player_addr + 0x200, health)
if off:
print(f"[+] m_iHealth = {hex(off)}")
else:
print("[-] m_iHealth не найден")
# Ищем m_iTeamNum (обычно 0xF0)
print("\n[*] Поиск m_iTeamNum...")
if pm.read_int(local_player_addr + 0xF0) == team:
print(f"[+] m_iTeamNum = 0xF0")
else:
off = find_offset_by_value(pm, local_player_addr, local_player_addr + 0x200, team)
if off:
print(f"[+] m_iTeamNum = {hex(off)}")
else:
print("[-] m_iTeamNum не найден")
# Ищем m_vecOrigin (координаты)
print("\n[*] Поиск m_vecOrigin...")
origin_found = False
for offset in range(0, 0x200, 4):
try:
x = pm.read_float(local_player_addr + offset)
y = pm.read_float(local_player_addr + offset + 4)
z = pm.read_float(local_player_addr + offset + 8)
if -5000 < x < 5000 and -5000 < y < 5000 and -5000 < z < 5000:
if x != 0 or y != 0:
print(f"[+] m_vecOrigin = {hex(offset)}")
print(f" Координаты: ({x:.1f}, {y:.1f}, {z:.1f})")
origin_found = True
break
except:
pass
if not origin_found:
print("[-] m_vecOrigin не найден")
# Ищем m_angRotation (углы)
print("\n[*] Поиск m_angRotation...")
angles_found = False
for offset in range(0x100, 0x200, 4):
try:
pitch = pm.read_float(local_player_addr + offset)
yaw = pm.read_float(local_player_addr + offset + 4)
if -180 <= pitch <= 180 and -180 <= yaw <= 180:
print(f"[+] m_angRotation = {hex(offset)}")
print(f" Углы: ({pitch:.1f}, {yaw:.1f})")
angles_found = True
break
except:
pass
if not angles_found:
print("[-] m_angRotation не найден")
# Ищем dwEntityList
print("\n[*] Поиск dwEntityList...")
dwEntityList = dwLocalPlayer + 0xC0
print(f"[+] Предположительно dwEntityList = {hex(dwEntityList)}")
# Проверяем entity list
entity_addr = pm.read_int(client_base + dwEntityList)
if entity_addr:
print(f"[+] Первый энтити по адресу {hex(entity_addr)}")
else:
print("[-] Проверьте dwEntityList, возможно смещение другое")
# Ищем m_iCrosshairId
print("\n[*] Поиск m_iCrosshairId...")
crosshair_found = False
for offset in range(0x220, 0x240, 4):
try:
val = pm.read_int(local_player_addr + offset)
if 0 < val <= 32:
print(f"[+] m_iCrosshairId = {hex(offset)} (текущее значение: {val})")
crosshair_found = True
break
except:
pass
if not crosshair_found:
print("[-] m_iCrosshairId не найден (наведите прицел на врага и перезапустите)")
# Ищем dwForceAttack
print("\n[*] Поиск dwForceAttack...")
for offset in range(0x1B8000, 0x1B9000, 4):
try:
addr = client_base + offset
val = pm.read_int(addr)
if val == 0 or val == 4 or val == 5:
print(f"[+] Возможный dwForceAttack = {hex(offset)} (значение: {val})")
except:
pass
# Итоговый отчёт
print("\n" + "=" * 50)
print("ИТОГОВЫЕ СМЕЩЕНИЯ ДЛЯ ВАШЕЙ ВЕРСИИ:")
print("=" * 50)
print(f"dwLocalPlayer = {hex(dwLocalPlayer)}")
print(f"dwEntityList = {hex(dwEntityList)}")
print(f"m_iHealth = 0xF8")
print(f"m_iTeamNum = 0xF0")
print(f"m_vecOrigin = 0x130")
print("=" * 50)
input("\nНажмите Enter для выхода...")
if __name__ == "__main__":
main()