AHK: Автообновление оффсетов для ahk читов

Решил сделать автообновление оффсетов для ahk читов через сканирование памяти. Работает на любой windows.
Что для этого нужно:

  1. Basic memory class by RHCP. Скачать можно отсюда. Т.к. не вижу особого смысла использовать ReadProcessMemory напрямую. То значит, будем использовать данный класс.
  2. Собственно, пишем чит:
_classmemory.setSeDebugPrivilege()

setbatchlines -1
csgo := new _ClassMemory("ahk_exe csgo.exe", "", hProcess)
if !IsObject(csgo)
{
    if (hProcess = "")
        msgbox OpenProcess failed. If the target process has admin rights, then the script also needs to be ran as admin. Consult A_LastError for more information.
    else msgbox The program isn't running (not found) or you passed an incorrect program identifier parameter.
    msgbox A_LastError %A_LastError%
    ExitApp
}

base := csgo.getModuleBaseAddress("client.dll")
Pattern := [0x8D, 0x34, 0x85, "??", "??", "??", "??", 0x89, 0x15, "??", "??", "??", "??", 0x8B, 0x41, 0x8, 0x8B, 0x48, "??"]

address := csgo.modulePatternScan("client.dll", Pattern*)

loc := csgo.read(address + 3, "UInt")
var := csgo.read(address + 18, "UChar")
dwLocalPlayer := (loc + var) - base

msgbox % dwLocalPlayer ; в десятичной системе

Класс памяти можно добавить в ahk скрипт или подключить через #Include classMemory.ahk.

Необходимые шаблоны можно найти здесь.
Пример:

"name": "dwLocalPlayer",
      "extra": 4,
      "relative": true,
      "module": "client.dll",
      "offsets": [
        3
      ],

Пояснения:

  1. “extra”: 4 (дополнительно 4) - дополнительный байт, который находится по смещению 18, его нужно добавить к полученному адресу. Вычислить можно так:
var := csgo.read(address + 18, "UChar")

P.S. Его нужно вычислять, а не писать напрямую, например, 4, т.к. это значение может поменяться.
Добавлять его нужно, т.к. так прописано в инструкциях ассемблера (скорее всего, это размер инструкции).

  1. “offsets”: [
    3
    ],
    Понять, что это за оффсет, поможет функция patternMask - ее результат в данном случае такой:
xxx????xx????xxxxx?

т.е. мы видим первые три x - это коды операции (их нужно пропустить), и в общем - это и есть наше смещение.

var := csgo.read(address + 3, "UInt")

Если в hazedumper указан оффсет как:

"offsets": []

, то это NULL (не знаю почему null, должно быть 7).

gameEngine := csgo.getModuleBaseAddress("engine.dll")
Pattern := [0xB3, 0x1, 0x8B, 0x1, 0x8B, 0x40, 0x10, "??", 0xD0, 0x84, 0xC0, 0x74, 0xF, 0x80, 0xBF, "??", "??", "??", "??", "??", 0xF, 0x84]

address := csgo.modulePatternScan("engine.dll", Pattern*)
dwbSendPackets := (address - gameEngine) + 1 ; + 1 значение extra в dwbSendPackets

msgbox % dwbSendPackets

Есть что не получается, можете писать в комменты, постараюсь помочь.

4 лайка

Огромное спасибо

2 лайка

А что насчёт netvars? Там нет таких паттернов

netvars нужно читать из памяти. Когда-нибудь покажу как.

2 лайка

С нетерпением ждём новую статью!

1 лайк