TpeTTeT Опубликовано 7 января, 2018 Поделиться Опубликовано 7 января, 2018 Добрый день. Решил я поработать с памятью игры. Пишу скрипт на 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
ReWanet Опубликовано 7 января, 2018 Поделиться Опубликовано 7 января, 2018 Указатель? Ссылка на комментарий Поделиться на другие сайты Поделиться
TpeTTeT Опубликовано 7 января, 2018 Автор Поделиться Опубликовано 7 января, 2018 20 минут назад, ReWanet сказал: Указатель? Указатель постоянно меняется. Т.е на другом ПК это перестаёт работать, не смотря на то, что я пытался плясать от GameAdress. Так же задачу затрудняет то, что при установки БрейкПоинта игра либо крашится, либо зависает. По этому приходится использовать автоматический поиск указателей, а от него уже двигаться в сторону GameAdress. Именно так я и пытался добиться универсальности, но ничего из этого не вышло. Могу рассказать подробнее. Ссылка на комментарий Поделиться на другие сайты Поделиться
ReWanet Опубликовано 7 января, 2018 Поделиться Опубликовано 7 января, 2018 12 минуты назад, TpeTTeT сказал: Могу рассказать подробнее. А изначально в топике что мешало сделать это? Ссылка на комментарий Поделиться на другие сайты Поделиться
TpeTTeT Опубликовано 7 января, 2018 Автор Поделиться Опубликовано 7 января, 2018 1 час назад, ReWanet сказал: А изначально в топике что мешало сделать это? Хорошо. Вот нужное мне значение: Скрытый текст Т.к я не могу отследить инструкции, обращающиеся по этому адресу из-за вылета игры, мне приходится использовать автоматический поиск указателя. Нашел указатель 1 уровня со смещением 0x3EC. Теперь ищу адрес, содержащий в значении ранее найденный указатель. Нашел зелёный(статичный?) адресс, содержащий в себе указатель: Далее я обращаюсь к зелёному адресу, считываю его значение, прибавляю к нему 3EC и получаю нужный мне адрес, который хранит нужное мне значение. И это работает, но работает только на моем ПК, и то как-то не стабильно. Видимо я что-то делаю не правильно, вот и прошу помочь. Ссылка на комментарий Поделиться на другие сайты Поделиться
ReWanet Опубликовано 7 января, 2018 Поделиться Опубликовано 7 января, 2018 А почему ты уверен что указатель 1 уровневый? Ссылка на комментарий Поделиться на другие сайты Поделиться
TpeTTeT Опубликовано 7 января, 2018 Автор Поделиться Опубликовано 7 января, 2018 9 минут назад, ReWanet сказал: А почему ты уверен что указатель 1 уровневый? Исходя из того, что выдает мне CE. Разве это плохо, когда указатель имеет всего 1 смещение? Ссылка на комментарий Поделиться на другие сайты Поделиться
vagingameh Опубликовано 9 января, 2018 Поделиться Опубликовано 9 января, 2018 В 07.01.2018 в 16:04, TpeTTeT сказал: указатель имеет всего 1 смещение Это не точно. По опыту можем сказать, что большинство указателей 4-х уровневые. Указатели гиблое дело. Выйдут из строя по 10000 причин. Я попытался воспроизвести ваш скрипт у себя. Autoit у меня есть. Придумал значение в игре. Нашел в CE адресс на это значение. Ступор на 12 строчке: Скрытый текст $hProcess = _WinAPI_OpenProcess(0x1F0FFF, False, $iPid, 1) Что ещё за 0x1F0FFF? Скрытый текст Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 9 января, 2018 Поделиться Опубликовано 9 января, 2018 4 часа назад, vagingameh сказал: Что ещё за 0x1F0FFF? Это сочетание прав доступа. Можно в MSDN посмотреть по описанию функции OpenProcess Ссылка на комментарий Поделиться на другие сайты Поделиться
MParker Опубликовано 15 января, 2018 Поделиться Опубликовано 15 января, 2018 (изменено) В 07.01.2018 в 16:04, TpeTTeT сказал: Разве это плохо, когда указатель имеет всего 1 смещение? Нет, при условии что это значение не может быть во вложенной структуре. Обычно, адреса к примеру здоровья, количества патрон и прочего рассчитываются от структуры мира т.е Мир -Список игроков (1 смещение) --Главный герой (2 смещение) ---Характеристики игрока (3 смещение) ----Здоровье (4 смещение) game.exe + worldoffset] + playerlist] +player] + characteristics_of_player] + health Изменено 15 января, 2018 пользователем MParker Ссылка на комментарий Поделиться на другие сайты Поделиться
amhad321 Опубликовано 3 февраля, 2018 Поделиться Опубликовано 3 февраля, 2018 В 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 А что добавить в пред последнюю строку если я например хочу чтобы в окне нажимался ЛКМ ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения