Решил сделать автообновление оффсетов для ahk читов через сканирование памяти. Работает на любой windows.
Что для этого нужно:
- Basic memory class by RHCP. Скачать можно отсюда. Т.к. не вижу особого смысла использовать ReadProcessMemory напрямую. То значит, будем использовать данный класс.
- Собственно, пишем чит:
_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
],
Пояснения:
- “extra”: 4 (дополнительно 4) - дополнительный байт, который находится по смещению 18, его нужно добавить к полученному адресу. Вычислить можно так:
var := csgo.read(address + 18, "UChar")
P.S. Его нужно вычислять, а не писать напрямую, например, 4, т.к. это значение может поменяться.
Добавлять его нужно, т.к. так прописано в инструкциях ассемблера (скорее всего, это размер инструкции).
- “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
Есть что не получается, можете писать в комменты, постараюсь помочь.