Skip to content
Victor edited this page Apr 12, 2026 · 3 revisions

📦 Memory API

local memory = _G.Engine.Memory

write_nop(address, size)

Забивает участок памяти NOP-инструкциями (0x90).

Параметры:

  • address (number) — адрес в памяти (uintptr_t)
  • size (number) — количество байт

Возвращает:

  • boolean — успешно ли применен патч
memory.write_nop(0x401000, 5)

patch(address, bytes)

Записывает произвольные байты.

Параметры:

  • address (number) — адрес
  • bytes (table<number>) — массив байтов (0–255)

Возвращает:

  • boolean
memory.patch(0x401000, {0xEB, 0x01})

read_int(address)

Читает int32.

Параметры:

  • address (number)

Возвращает:

  • number — int32 значение
local hp = memory.read_int(0x500000)
print(hp)

read_float(address)

Читает float.

Параметры:

  • address (number)

Возвращает:

  • number — float значение
local speed = memory.read_float(0x500100)
print(speed)

write_int(address, value)

Записывает int32.

Параметры:

  • address (number)
  • value (number) — int32

Возвращает:

  • nil
memory.write_int(0x500000, 999)

write_float(address, value)

Записывает float.

Параметры:

  • address (number)
  • value (number) — float

Возвращает:

  • nil
memory.write_float(0x500100, 3.14)

⌨️ Input API

local input = _G.Engine.Input

bind(key, callback)

Вызывает функцию при нажатии клавиши (один раз при нажатии, не при удержании).

Параметры:

  • key (number) — virtual-key code (WinAPI), например:

    • 0x41 — A
    • 0x46 — F
    • 0x20 — Space
  • callback (function) — функция без аргументов

Возвращает:

  • nil
input.bind(0x41, function()
    print("Pressed A")
end)

unbind(key)

Удаляет биндинг.

Параметры:

  • key (number)

Возвращает:

  • nil
input.unbind(0x41)

🪝 Hooks API

local hooks = _G.Engine.Hooks

create(address, signature, callback)

Создает detour-хук функции.

Параметры:

  • address (number) — адрес функции
  • signature (string) — C-сигнатура с NAME
  • callback (function) — Lua функция (должна соответствовать сигнатуре)

Возвращает:

  • function | nil — оригинальная функция (если успешно)

Важно:

  • обязательно вызывать original(...) чтобы не ломать логику
  • сигнатура должна совпадать
local original

original = hooks.create(0x401000, "int (__cdecl *NAME)(int a)", function(a)
    print("Called:", a)
    return original(a)
end)

create_usercall(address, callback)

Хук для нестандартных (usercall) функций.

Параметры:

  • address (number)
  • callback (function) — сигнатура фиксирована:
int func(int, int, void*, void*, int, int)

Возвращает:

  • cdata | nil — оригинальный указатель
hooks.create_usercall(0x402000, function(a, b, c, d, e, f)
    print("Usercall intercepted")
    return 0
end)

🛡️ VahCrash API

local crash = _G.Engine.VahCrash

catch(crash_addr, safe_addr)

Регистрирует точку восстановления при краше.

Параметры:

  • crash_addr (number) — адрес, где происходит краш
  • safe_addr (number) — адрес для перехода

Возвращает:

  • nil
crash.catch(0x403000, 0x404000)

💡 Полный пример

local memory = _G.Engine.Memory
local input  = _G.Engine.Input
local hooks  = _G.Engine.Hooks
local crash  = _G.Engine.VahCrash

-- биндим клавишу F
input.bind(0x46, function()
    print("Applying NOP")
    memory.write_nop(0x401000, 5)
end)

-- хук
local original
original = hooks.create(0x401000, "int (__cdecl *NAME)(int)", function(a)
    print("Hooked:", a)
    return original(a)
end)

-- защита от краша
crash.catch(0x403000, 0x404000)