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

Активация чита "нарисованной" клавишей игрового интерфейса.


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

Всех приветствую и прошу посодействовать в реализации вот такой штуки:

 

Есть старая игрушка, которая цепко перехватывает любые нажатия клавиш, в том числе и не относящиеся к игре (доп. клавиши отвечающие за громкость звука например и т.д.), работает только alt+ctrl+del. Поэтому стало необходимо прикрутить активацию чита к "нарисованной" в игровом интерфейсе кнопке.

 

1. В игровом интерфейсе имеется клавиша, нажимая на которую происходит переключение стойки персонажа. Методом поиска неизвестного значения я нашел адрес, значение в котором отвечает за текущую стойку. 

2. Я ставлю бряк на запись в этот адрес и нажимаю клавишу смены стойки, выскакивает инструкция. Вот за эту инструкцию и будем цепляться.

3. Есть код, который заменяет оригинальную инструкцию, отвечающую за уменьшение значения очков хода при перемещении персонажа. Данная инструкция является общей для всех персонажей в отряде, что очень удобно. Вот этот код и хочется прикрутить грубо говоря "после" той инструкции, о который написано в п.2

А это уже код, обеспечивающий отключение уменьшение очков хода для персонажей

Так вот, надеюсь, что я не слишком раскатал губу и это реально сделать. К сожалению, в геймхакинге и программировании я Алёшка, так что мне остается только надеяться на чью-то помощь.

NullAlex: Большой код принято оборачивать в тег спойлера. Читай FAQ по тегу.

[ENABLE]aobscanmodule(INJECT,game.exe,83 79 68 01 0F 94 C0)alloc(newmem,$1000)label(code)label(return)newmem://Тут должен быть код, отключающий уменьшение очков хода у персонажейjmp returncode:// Тут без изменений оригинальная инструкция, которая всплывает при нажатии той самой "нарисованной" клавиши.  cmp dword ptr [ecx+68],01  sete al  jmp newmemINJECT:  jmp code  nop  nopreturn:registersymbol(INJECT)[DISABLE]INJECT:  db 83 79 68 01 0F 94 C0unregistersymbol(INJECT)dealloc(newmem)
[ENABLE]aobscanmodule(INJECT,game.exe,89 42 08 E8 66 AB 00 00)alloc(code,$1000)label(return)registersymbol(INJECT)code:  mov eax,[edx+08]// Инструкция срабатывает при перемещении персонажа  // В оригинале было [edx+08],eax  //Таким образом мы пишем не новое значение в текущее, а текущее в новое  // и очки хода у нас стоят на месте  call game.exe+F26B0  jmp returnINJECT:  jmp code  nop  nop  nopreturn:[DISABLE]dealloc(code)INJECT:db 89 42 08 E8 66 AB 00 00unregistersymbol(INJECT)
Ссылка на комментарий
Поделиться на другие сайты

Поэтому стало необходимо прикрутить активацию чита к "нарисованной" в игровом интерфейсе кнопке

 

Могу посоветовать поискать туторы по рисования для Cheat Engine, а еще лучше на C++

 

и программировании я Алёшка

 

Начни с простого. С того, что понятно "Алешке"

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

В данном случае ТС нужна помощь в том, чтобы из первого скрипта активировать второй. Думаю, на луа в СЕ это можно сделать, но нет времени ковыряться. Может, кто из участников сможет помочь.

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

ТС нужно, чтобы один из скриптов срабатывал только тогда, когда работает другой скрипт. Я ему в личку отписал пример с помощью флагов, думаю, этого будет вполне достаточно )

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

А я вот что-то не совсем понял, что нужно сделать. :(

Keng привет! Твои уроки на ютубе хороши, мои заморочки в геймхакинге начались совсем недавно именно с них. Потом уже на канал Xipho наткнулся. Учусь у Вас обоих потихоньку.

Что касается задачи, я уже не знаю как объяснить понятнее: в игровом интерфейсе есть кнопка, нарисованная, при нажатии на нее совершается определенное действие. Как известно любое действие это инструкция. Я хочу грубо говоря сделать хук инструкции, чтобы как только она (инструкция) всплывает активировался мой, уже написанный скрипт на другое действие, в данном случае отмена трат очков хода.

Иначе говоря мы свои "читы" привыкли активировать или в CE поставив крестик напротив скрипта, либо хоткеем, заданным в том же СЕ, а тут стоит задача, привязаться к игровому событию, которое происходит после взаимодействия с игровым интерфейсом.

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

А, ну, тогда это делается тупо инъекцией в нужном месте. Можно поискать функцию, а потом трейсить вверх, пока не найдется проверка на нажатие кнопки, а можно поискать функцию, отвечающую за кнопки вообще, и смотреть как она работает. Там наверняка будет двусвязный список вида "кнопка:действие" с кодами кнопок и указателями на функции, ну и большой какой-нибудь switch, который этим делом управляет. Не совсем понимаю, зачем тут нужно рисование.

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

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

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

А если чекбокс на активацию поставить ??? ну раз игра сворачивается и можешь что то отсеивать,значит можно и активировать чекбоксом не чего не нажимая не каких кнопок.

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

А если чекбокс на активацию поставить ??? ну раз игра сворачивается и можешь что то отсеивать,значит можно и активировать чекбоксом не чего не нажимая не каких кнопок.

Можно, это да, но тут вся задумка строилась исходя из сложных обстоятельств: игрушка Код доступа: РАЙ. Штука очень атмосферная, пошаговая стратежка в стиле киберпанк. Но есть одно существенное НО: разрабы упоролись и сделали ее ПОЛНОСТЬЮ пошаговой. Игровой мир представлен несколькими локациями, довольно обширными и ходить по ним приходится тоже пошагово, даже вне боя. А вот бои проводить хочется по-честному, т.е. пошагово. Вот и получается, что мне нужно будет часто включать и отключать чит на ходы, чтобы так сказать соблюдать честность прохождения. Альтабом я это делать замучаюсь.

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

В данном случае ТС нужна помощь в том, чтобы из первого скрипта активировать второй. Думаю, на луа в СЕ это можно сделать, но нет времени ковыряться. Может, кто из участников сможет помочь.

 

Чтобы помочь надо понимать, а я ни чё не понял."Многа букав, цель нечеткая... мозг уехал в отпуск"

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

Я так понимаю автор хочет, уже нарисованной разработчиками кнопкой в игре вкл/выкл чит? Если это так, то необходимо искать код, который выполняется при ее нажатии. Опишите что за кнопка, за что отвечает? Меняется ли какой-то параметр при её нажатии?

. Выделить байт на индикацию вкл/выкл чита, и менять его, когда нажимается кнопка.

Ну или создать поток и там вызывать GetAsyncKeyState www.cheatengine.org/keypresstut.php

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

Я так понимаю автор хочет, уже нарисованной разработчиками кнопкой в игре вкл/выкл чит? Если это так, то необходимо искать код, который выполняется при ее нажатии. Опишите что за кнопка, за что отвечает? Меняется ли какой-то параметр при её нажатии?

. Выделить байт на индикацию вкл/выкл чита, и менять его, когда нажимается кнопка.

Ну или создать поток и там вызывать GetAsyncKeyState www.cheatengine.org/keypresstut.php

Вы все верно поняли. Кнопка отвечает за изменение стойки персонажа бег/шаг. При нажатии кнопки меняется "дальность хода" персонажа при одинаковых очках хода. Поиском неизвестного значения, переключая кнопкой стойки я отсеивал пока не нашел нужный адрес, далее на этот адрес ставлю бряк на запись и снова нажимаю кнопку - выскакивает инструкция. Вот появление этой инструкции в моем плане и должно служить активацией написанному коду.

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

Я, честно говоря, тоже не понял, что автору конкретно нужно, но если то, о чем сказал Xipho, то не проще выделить и зарегистрировать в одном скрипте байт, а в другом - проверять его значение, и выполнять нужные действия?

Ну, допустим, у нас есть два скрипта ("А" - где мы выделяем один байт под флаг, и "Б" - в котором должен проверяться флаг). Добавляем в таблицу адрес с нашим флагом, создаем на него две горячие клавиши:

NumPad 1 - Установить значение на "1" (единицу)

NumPad 2 - Установить значение на "0" (ноль)

И в скрипте "Б" проверять, если флаг равен единице - условие истинно - выполняем нужные действия, если нет - считаем, что скрипт выключен, и ничего не делаем.

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

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

Вот и получается, что мне нужно будет часто включать и отключать чит на ходы, чтобы так сказать соблюдать честность прохождения. Альтабом я это делать замучаюсь

В любом случаи - хорошо что ещо задумал действие внутри игровых функций,а не командой по микрофону (включись) и всё заработало... Может какой не будь Кулибин и реализует тобою задуманное. Но так то вроде понятна мысль то - это привязать как бы к игровому интерфейсу (какому либо) скрипт. Я бы до такого не додумался, в плане того, что бы подумать даже об подобном действии с реализацией через игровой интерфейс. Мне кажется глупость всё это...

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

Почему глупость-то? Автор нашел инструкцию, которая выполняется при нажатии, туда заинжектить код активации скрипта, в чем проблема?

Вот только я не могу подсказать автору как через label управлять читом, я через CE мало чего делал.

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

Почему глупость-то? Автор нашел инструкцию, которая выполняется при нажатии, туда заинжектить код активации скрипта, в чем проблема? Вот только я не могу подсказать автору как через label управлять читом, я через CE мало чего делал.

Аналогично, у меня в голове полное и четкое представление идеи, а вот знаний языка не хватает, чтобы довести до ума как надо. Мучаю Xipho в личке, он помогает, может что-то и получится.

Идея уже реализована на половину: после нажатия клавиши и "отлова" той инструкции, я уже прицепил к ней свой код, который просто пишет в адрес очков хода нужное мне значение ходов. Т.е. для одного персонажа я уже получил, что хотел. Но мне нужно прицепить туда не запись в адрес, а замену инструкции, которая вычитает очки хода. Чтобы это сделать, надо на нее как-то сослаться...указателем или сигнатуркой, я не знаю как с ними работать в ассемблере.

Более чем уверен, что в Lua СЕ Эту задачу можно решить за 5 минут, т.к. там можно писать полноценные функции, обрабатывать указатели и смещения, а вот как провернуть на уровне ассемблера... 

Я, честно говоря, тоже не понял, что автору конкретно нужно, но если то, о чем сказал Xipho, то не проще выделить и зарегистрировать в одном скрипте байт, а в другом - проверять его значение, и выполнять нужные действия?

Ну, допустим, у нас есть два скрипта ("А" - где мы выделяем один байт под флаг, и "Б" - в котором должен проверяться флаг). Добавляем в таблицу адрес с нашим флагом, создаем на него две горячие клавиши:

NumPad 1 - Установить значение на "1" (единицу)

NumPad 2 - Установить значение на "0" (ноль)

И в скрипте "Б" проверять, если флаг равен единице - условие истинно - выполняем нужные действия, если нет - считаем, что скрипт выключен, и ничего не делаем.

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

Я уже писал, что игра жестко хукает все клавиши, работают только альтаб и альтконтдел. Если бы можно было назначить хоткеи в СЕ, не родилось бы всей этой заморочки и я уже готовый код, активировал хоткеями))

UPD. Всем спасибо кто участвовал, благодаря приложенному усердию поставленную задачу решил. ОГРОМНОЕ спасибо Xipho  за помощь, без него ни за что бы не вышло.

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

Итоговые скрипты вышли такими, задача полностью решена:

 

[ENABLE]aobscanmodule(INJECT,game.exe,83 79 68 01 0F 94 C0)alloc(newmem,$1000)label(code)label(return)newmem: //Меняем лежащие во флаге ноль и единицу местами при каждом нажатии кнопки.xor [flag],1jmp returncode: //Оригинальные инструкции, вылезающие при нажатии графической кнопки. Весь код нужен только чтобы "привязаться" к этим инструкциям. В данном случае будем привязывать флаг.  cmp dword ptr [ecx+68],01  sete al  jmp newmemINJECT:  jmp code  nop  nopreturn:registersymbol(INJECT)[DISABLE]dealloc(newmem)INJECT: db 83 79 68 01 0F 94 C0unregistersymbol(flag)unregistersymbol(INJECT)

[ENABLE]aobscanmodule(INJECT_1,game.exe,89 42 08 E8 66 AB 00 00)alloc(code,$1000)label(return)label(flag)registersymbol(INJECT_1)registersymbol(flag)code:  cmp dword ptr [flag],#1  jne @F  mov [edx+08],eax // Оригинальная инструкция. Копирует новое кол-во ходов в адрес текущего кол-ва ходов@@:mov eax,[edx+08] // Моя инструкция, обратная оригинальной. Тем самым мы отключаем трату очков хода, т.к. пишется текущее значение в новое.  call game.exe+F26B0  jmp returnflag: dd 0INJECT_1:  jmp code  nop  nop  nopreturn:[DISABLE]dealloc(code)INJECT_1:db 89 42 08 E8 66 AB 00 00unregistersymbol(INJECT_1)
Изменено пользователем Adouken
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

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

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

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