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

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

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

Добрый день. Решил я поработать с памятью игры. Пишу скрипт на 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. Именно так я и пытался добиться универсальности, но ничего из этого не вышло. Могу рассказать подробнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
12 минуты назад, TpeTTeT сказал:

 Могу рассказать подробнее.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, ReWanet сказал:

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

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

 

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

1.png

 

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

2.png

 

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

3.png

 

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

4.png

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

Поделиться сообщением


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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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?

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
4 часа назад, vagingameh сказал:

Что ещё за 0x1F0FFF?

Это сочетание прав доступа. Можно в MSDN посмотреть по описанию функции OpenProcess

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 07.01.2018 в 16:04, TpeTTeT сказал:

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

 

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

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


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

 

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

Изменено пользователем MParker

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 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

 

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

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

×

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

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