Перейти к содержанию

Создание универсального чита, работающего с памятью игры


Рекомендуемые сообщения

Добрый день. Решил я поработать с памятью игры. Пишу скрипт на AutoIt, который считывает значение с памяти, и если оно равно желаемому, то происходит нужное мне действие. Разумеется для этого мне нужен адрес этого значения, который я успешно нашел. Так же мне удалось найти GameAdress, содержащий в себе указатель на нужное мне значение. Проблема заключается в том, что работает это только на моем ПК(внезапно). Я по своей наивности полагал, что GameAdress является статическим и его адрес не меняется ни при каких условиях. Помогите заставить скрипт работать и на других ПК, пожалуйста. Ниже привожу пример кода:

 

Spoiler

While ProcessExists("game.exe") = 0
   Sleep(1000)
WEnd
$hWnd = WinGetHandle('Game')
If @error Then
   MsgBox(0,"","Error 1")
EndIf
$iPid = WinGetProcess($hWnd)
If @error Then
   MsgBox(0,"","Error 2")
EndIf
$hProcess = _WinAPI_OpenProcess(0x1F0FFF, False, $iPid, 1)
If @error Then
   MsgBox(0,"","Error 3")
EndIf
$s1 = DllStructCreate("HANDLE")
_WinAPI_ReadProcessMemory($hProcess, 0x126766D4, DllStructGetPtr($s1), 8, $iRead) ;0x126766D4 - статический адресс(зелёный). Считываем его значение
$Adress = DllStructGetData($s1,1)+0x3EC ;и прибавляем к нему смещение 0x3EC и получаем адреес в памяти, содержащий нужное мне значение. С ним дальше и работаем.
$s = DllStructCreate("int")

_WinAPI_ReadProcessMemory($hProcess, $Adress, DllStructGetPtr($s), 8, $iRead)
If DllStructGetData($s,1) = 43 Then
	;Тут нужное мне действие
EndIf

 

Ссылка на комментарий
Поделиться на другие сайты

20 минут назад, ReWanet сказал:

Указатель?

Указатель постоянно меняется. Т.е на другом ПК это перестаёт работать, не смотря на то, что я пытался плясать от GameAdress. Так же задачу затрудняет то, что при установки БрейкПоинта игра либо крашится, либо зависает. По этому приходится использовать автоматический поиск указателей,  а от него уже двигаться в сторону GameAdress. Именно так я и пытался добиться универсальности, но ничего из этого не вышло. Могу рассказать подробнее.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, ReWanet сказал:

А изначально в топике что мешало сделать это?

Хорошо. Вот нужное мне значение: 

 

Скрытый текст

1.png

 

Т.к я не могу отследить инструкции, обращающиеся по этому адресу из-за вылета игры, мне приходится использовать автоматический поиск указателя.

2.png

 

Нашел указатель 1 уровня со смещением 0x3EC. Теперь ищу адрес, содержащий в значении ранее найденный указатель.

3.png

 

Нашел зелёный(статичный?) адресс, содержащий в себе указатель:

4.png

Далее я обращаюсь к зелёному адресу, считываю его значение, прибавляю к нему 3EC и получаю нужный мне адрес, который хранит нужное мне значение. И это работает, но работает только на моем ПК, и то как-то не стабильно. Видимо я что-то делаю не правильно, вот и прошу помочь.

Ссылка на комментарий
Поделиться на другие сайты

9 минут назад, ReWanet сказал:

А почему ты уверен что указатель 1 уровневый?

Исходя из того, что выдает мне CE. Разве это плохо, когда указатель имеет всего 1 смещение?

Ссылка на комментарий
Поделиться на другие сайты

В 07.01.2018 в 16:04, TpeTTeT сказал:

указатель имеет всего 1 смещение

Это не точно. По опыту можем сказать, что большинство указателей 4-х уровневые.

Указатели гиблое дело. Выйдут из строя по 10000 причин.

 

 

Я попытался воспроизвести ваш скрипт у себя. Autoit у меня есть. Придумал значение в игре. Нашел в CE адресс на это значение.

Ступор на 12 строчке:

Скрытый текст

$hProcess = _WinAPI_OpenProcess(0x1F0FFF, False, $iPid, 1)

Что ещё за 0x1F0FFF?

Скрытый текст

 

Ссылка на комментарий
Поделиться на другие сайты

В 07.01.2018 в 16:04, TpeTTeT сказал:

Разве это плохо, когда указатель имеет всего 1 смещение?

 

Нет, при условии что это значение не может быть во вложенной структуре.

Обычно, адреса к примеру здоровья, количества патрон и прочего рассчитываются от структуры мира т.е


Мир
-Список игроков (1 смещение)
--Главный герой (2 смещение)
---Характеристики игрока (3 смещение)
----Здоровье (4 смещение)

 

game.exe + worldoffset] + playerlist] +player] + characteristics_of_player] + health 

Изменено пользователем MParker
Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...
В 07.01.2018 в 12:51, TpeTTeT сказал:

Добрый день. Решил я поработать с памятью игры. Пишу скрипт на AutoIt, который считывает значение с памяти, и если оно равно желаемому, то происходит нужное мне действие. Разумеется для этого мне нужен адрес этого значения, который я успешно нашел. Так же мне удалось найти GameAdress, содержащий в себе указатель на нужное мне значение. Проблема заключается в том, что работает это только на моем ПК(внезапно). Я по своей наивности полагал, что GameAdress является статическим и его адрес не меняется ни при каких условиях. Помогите заставить скрипт работать и на других ПК, пожалуйста. Ниже привожу пример кода:

 

  Скрыть содержимое


While ProcessExists("game.exe") = 0
   Sleep(1000)
WEnd
$hWnd = WinGetHandle('Game')
If @error Then
   MsgBox(0,"","Error 1")
EndIf
$iPid = WinGetProcess($hWnd)
If @error Then
   MsgBox(0,"","Error 2")
EndIf
$hProcess = _WinAPI_OpenProcess(0x1F0FFF, False, $iPid, 1)
If @error Then
   MsgBox(0,"","Error 3")
EndIf
$s1 = DllStructCreate("HANDLE")
_WinAPI_ReadProcessMemory($hProcess, 0x126766D4, DllStructGetPtr($s1), 8, $iRead) ;0x126766D4 - статический адресс(зелёный). Считываем его значение
$Adress = DllStructGetData($s1,1)+0x3EC ;и прибавляем к нему смещение 0x3EC и получаем адреес в памяти, содержащий нужное мне значение. С ним дальше и работаем.
$s = DllStructCreate("int")

_WinAPI_ReadProcessMemory($hProcess, $Adress, DllStructGetPtr($s), 8, $iRead)
If DllStructGetData($s,1) = 43 Then
	;Тут нужное мне действие
EndIf

 

А что добавить в пред последнюю строку если я например хочу чтобы в окне нажимался ЛКМ ?

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.