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

MasterGH

Ветераны
  • Постов

    2 999
  • Зарегистрирован

  • Победитель дней

    129

Весь контент MasterGH

  1. 1. Персонаж падает с большой высоты и разбивается Ищем адрес скорости прыжка прыгая под speedhack. Находим эту скорость. Ставим бряк на доступ. Прыгаем. Инструкции на чтение добавляем в список адресов и там начинаем нопить - Либо по одной - Либо рискнем по половине от половины - Либо рискнем и все сразу занопим Если повезет, а должно повезти, то инструкция не прочитает то значение скорости, которое уложило бы персонажа на землю и можно будет прыгать на огромную высоту. 2. Как делать супер прыжок Ищем под speedhack скорость float (назовем её velocityZ, Z - вертикальная ось) по вертикальной оси прыгая персонажем. Когда прыгаем. то скорость в один момент увеличивается. Затем, скорость постоянно уменьшается от положительного до отрицательного значения. Когда на земле, то скорость быстро записывается и равна нулю. Дальше смотрим что это рабочий адрес. Прыгаем и замораживаем значение. Если адрес рабочий, то персонаж зависает в воздухе или движется. Дальше ставим бряк на запись на этот адрес и снимаем speedhack Прыгнули и увидели инструкции. Например одна из них будет movss [rdi+0000010C],xmm0 и работает каждый раз при прыжке по одному разу за прыжок (прыгнули — сработала, прыгнули — сработала). Вот в неё и легко сделать инъекцию с рядом стоящими адресами с умножением на scale величину. Все и персонаж будет с суперпрыжком. Чтобы он не разбивался при прыжке смотрим пункт1 Еще один вариант — не писать инъекцию кода, а искать адрес силы прыжка в структуре. Это можно сделать меняя значения в структуре где-то рядом с [rdi+0000010C] и смотреть что происходит в игре. Можно найти, а можно и не найти, и возможно этот процесс будет долгий. Еще можно в пошаговой отладке пройтись, посмотреть стек, протресить и попробовать найти адрес в структуре (при чем структура не обязательно будет с адресом в rdi) без рандомного поиска в структуре. Но у последнего есть свои плюсы, можно найти разные параметры движения игрока и увидеть изменения в игре. 3. Менять данные в структурах или менять код? В примере выше пришлось создать два новых поля scaleXY: dd (float)4 scaleZ: dd (float)4 И умножать их на скорости X,Y,Z персонажа. С одной стороны больше кода писать и добавлять новые поля, а с другой стороны выделить время и найти подход к поиску значения стартовой скорости в структуре. Можно в структуре ничего не искать, а написать скрипт выше и это может быть быстрее чем искать в структуре. С другой стороны если в структуре рандомно ставить параметры в течении времени X на 4К байт, то можно найти: адрес скорости, адрес гравитации, адрес чувствительности и много чего еще. И еще одно ограничение. Расструктуризация не всегда правильная. Упорно вместо float может видеть 4 байта. Это в лучшем случае, в худшем разные смешения смержены и выводятся разные типы данных. В общем исследование игровой структуры эта тема интересная. Можно сказать это поиск свойств, по которым будет меняется поведения персонажа в игре. Структуру желательно обследовать какой оффест, что делает и какого он типа (через брейкпоинт). Это всего 4К байт проанализировать. Каждое смещение подписать и сохранить. Сделав это вы скажите себе я исследовал всю структуру и знаю, что делает смещение. Lua может помочь автоматизировать анализ структур и пока я думаю об этом. Данные структур могут сильно повлиять на поведение персонажа, на прохождение потоком отладочных инструкций игры по разным условиям — выполнять и не выполнять ответвления кода с разными условиям. В общем есть над чем подумать. Всегда было приоритетным менять код, но теперь стал задумываться о том чтобы больше смотреть в сторону правки данных структур. Фактически код мы не правим, а меняем данные и код работает уже с другими данными.
  2. Как в предыдущей теме. Скорость может быть в структуре рядом с координатами или рядом с velocity. Либо в другой структуре. Ставим бряк на координаты и трейсим вверх и смотрим смещения, которые обращаются к структуре и пытаемся узнать в них скорость. Или же меняем в структуре все подряд и смотрим что это дает в игре.
  3. MasterGH

    Cheat Engine 6.7 и Lua. Часть 3

    Наконец-то дошли руки до третий части. Речь пойдет о создании структур программно. Пример, что будет в конце записи Сразу к делу. Нужен поинтер и процесс. Запустим туториал из Cheat Engine из меню Health->Cheat Engine Tutorial. Прохождение туториала подробно описано здесь Подключаемся к процессу идем на 8-мой шаг. В руководстве есть поинтер [[[["Tutorial-i386.exe"+XXXXXX]+C]+14]+0]+18 Вместо XXXXXX может быть любое смещение. Поэтому надо бы поискать Нашил адрес. Поставили бряк. Нашли esi Поставили бряк Вышли сюда Поинтер получили, дальше пойдет Lua. Открываем Lua консоль и проверяем поинтер Выведем адрес и его значение Окей. Поинтер верный. Другой вариант читать значение поинтера примерно такой local address = getAddress("game.exe") address = readPointer(address + 0x123) address = readPointer(address + 0x456) local value = readFloat(address + 0x789) Есть и такие варианты value = readInteger("[[[[[[[[[witcher3.exe + 028F3F60] +0] +18] +20] +40] +40] + 1c0] +10] +28]") value = readFloat("[[[[[[[[[witcher3.exe + 028F3F60] +0] +18] +20] +40] +40] + 1c0] +10] +28]") value = readDouble("[[[[[[[[[witcher3.exe + 028F3F60] +0] +18] +20] +40] +40] + 1c0] +10] +28]") Теперь самое интересное — создание структур с помощью Lua Построим структуру [[[[005FD660]+C]+14]+0]+18. На +18 будет наш адрес. Сначала построим один уровень —"005FD660" Если выполнить скрипт выше, то мы построим структуру одного уровня. Построим теперь структуру двух уровней "[005FD660]+C". Второй уровень нужно развернуть Для этого после создания структуры создам дочернюю myStructure2 = createStructure('MyStructure2') myStructure2.autoGuess('[005FD660]', 0, 50) -- И поместим её по индексу local offset = 0 myStructure.getElementByOffset(offset).setChildStruct(myStructure2) -- Чтобы развернуть список поитеров. К сожалению разворачивается только два уровня structureFrm.Menu.Items[1][6].doClick() Итого получается такой скрипт до второго уровня Создадим и развернем весь указатель [[[[005FD660]+C]+14]+0]+18 Не будем делать через цикл, чтобы не усложнять. Полный скрипт Результат Ну и на закуску. Допустим мы знаем что по адресу X будет всегда тип float (как X,Y,Z координаты). Но расструктуризация будет показывать другой тип, дизассемблер будет показывать другой тип — 4 байта. Что делать? И сразу еще допустим double тип всегда хотим как float тип (в виде комментов в дизассемблере или в расструктуризации) Воспользоваться следующей функцией -- Может менять тип адреса x в окне дизассемблере в комментариях, когда в инструкции существует адрес -- Может менять тип адреса в окне расструктуризации -- Изменив тип, будет ображаться значение другого типа onAutoGuess(function) : Registers an function to be called whenever autoguess is used to predict a variable type function override (address, ceguess): Return the variable type you want it to be. If no change, just return ceguess Ну и вот два примера upd: спрятал код под спойлеры
  4. Для эмулятора достаточен обычно встроенный сканер памяти. Иногда надо редактировать код через свой отладчик/дизассемблер. Предполагаю можно поискать подходящий эмуль или же каким-то образом сделать на Cheat Engine, возможно будет сложнее
  5. Не знал про эту инструкцию. Запрятали
  6. Привлекло то, что игра на движке UE4. Посмотрел я популярные читы к этой игре в разных видео. Хотя бы визуально понял о чем речь flymode и ghostmode с моим видео про высокий прыжок в Сталкере немножко не связано. Суперпрыжок это отдельный чит — прыгает высоко и далеко на мелкой карте, ударяется о стены. Этот чит я сделал, посмотрел как работает. Но это не flymode. Сделал через поиск скорости как в Сталкере, но с одним нюансом. Инъекцию делал в инструкцию, которая один раз пишет в момент прыжка Убрать урон от падения. Почти занопил первую и тем самым одну из инструкций чтения адреса скорости. Чисто экспериментально. По flymode в теории можно искать скорость по вертикальной оси и морозить её на нужной высоте горячими клавишами уменьшая или увеличивая её. "Морозить" или писать в адрес лучше АА кодом. Скрипт я не стал делать. ghostmod - либо через перемещение по координатам через АА скрипт, либо отключением галки физики на персонаже. Как её отключить не знаю. Случайно нашел видео на испанском (или иной язык), как был сделан ghost. Я посмотрел, как подходит и отходит от коллизий, таким способом не искал. Времени нет На канале много другого видео по взлому с CE... Автор, что делать? По fly mode и ghost mode я предлагаю искать координаты и менять их через АА код по горячим клавишам, чем-то похоже на скрипт АА телепорта, только новую позицию увеличиваем по клавишам движения. Скорости как на видео о Сталкере искать не нужно. Задавая скорость нельзя пройти сквозь стену, если конечно не сделать на неё чит как у испанца.
  7. Я думаю, можно найти эмулятор snes с хорошим дизассемблером, отладчиком и сканером памяти и в нем сделать чит. ИМХО Cheat Engine можно не использовать/ Предположительно это сложнее как в поиске адреса, так и в редактировании кода эмулятора snes
  8. debugger_onBreakpoint=nil скорее всего не позволит использовать эту функцию до перезапуска. Способ 1. Переключая isActiveonBreakpoinFunction = false или isActiveOnBreakpoinFunction = true Способ 2. Назначить свою функцию
  9. Он ищет не три значения, а все по protectionflags = "+W*X-C" и пишет в адрес ноль findValueAndReplace('BA:8 BS:128 OOO:U f:250000 f:1000000 f:36000000', 0) Попробуй разобраться в Lua коде и в документации Можешь попробовать не групповой поиск, а другой. Например, поиск float (как с форума Cheat Engine). Проверить, отладить. Потом отладить групповой поиск. В Lua console есть пошаговая отладка, можно отладить любую строчку. Больше ни чем помочь не могу
  10. Что портировать? Мод к Drive Ahead или игру Drive Ahead ? С какой на какую платформу? У ПК и у мобильных игр может быть множество платформ в виде разных ОС.
  11. Например, автоматизировать по кнопке на форме. Не могу точно утверждать, что этот скрипт работает. Скрипт модифицировал с форума. Автор mgr.inz.Player
  12. С данных документации по UI4 движку, на котором написана игра, скорее всего, нужно три адреса с целым числом или один адрес, а два других будут рядом
  13. Узнаем кол-во срабатываний call-ов на участке кода (CE Lua)
  14. Насколько я помню Ultimap это и показывает. Порядок инструкций показывает список при обновлении. Частоту вызовов? Ну примерно, конечно. Если кнопу обновить нажать несколько раз, и примерно увидеть. У кого счетчик как быстро меняется на глаз. Ultimap 2 не смотрел, он вроде побыстрее работает по описанию.
  15. MasterGH

    Cheat Engine 6.7 и Lua. Часть 2

    Как контролировать включение и выключение скриптов в таблице AA или "Autoassembler code" код похожий на язык программирования ассемблера. Обычный АА-скрипт состоит из двух директив и добавляется в таблицу CE как запись // Код срабатывающий как при активации, так и при деактивации [ENABLE] // Код активации [DISABLE] // Код деактивации Чтобы код активировался, нужно включить галку напротив записи в таблице и наоборот выключить. Есть такие директивы как {$lua} и {$asm}. Под {$lua} пишут Lua скрипт, под {$asm} пишут АА-скрипт. Мы можем проверить Lua скриптом любое условие и разрешить включать галку или выключать галку. Например, через "syntaxcheck" — проверку синтаксиса или другое условие . Если проверка не прошла, то не получится галку включить и не получится выключить, если что-то пойдет не так. В Lua строка из двух минусов "--", обозначает комментарий. Попробовав разные варианты вы увидите, что нельзя включать или выключать галку в разных ситуациях. Например в этой получится включить галку, а выключить нет из-за ошибки. Следующий вариант проверяет открыт ли процесс. Если нет, то покажет сообщение. Как узнать, что процесс был закрыт после открытия process - зарезервированное переменная, показывает что процесс открыт В комментариях можно увидеть при каких условиях блокируются включение галки
  16. MasterGH

    Cheat Engine 6.7 и Lua. Часть 1

    Где писать Lua код? Lua Engine окно, которое вызывается из главного окна CE. Lua Console окно, которое вызывается из окна отладки CE. Окно Autoassembler скрипта с вставки {$lua}, {$asm} Lua Engine окно и Autoassembler-ные скрипты могут сохраняться в файлах Cheat Engine *.CT. *.CETRAINER, *.EXE Lua Console для пошаговой отладки Lua кода и просмотров результатов ошибок и функции print() Моя первая программа Сначала узнаем версию для CE 6.7 и это будет первая программа Запускаем CE и жмем ctrl+alt+L и Lua Engine, вводим print(_VERSION) -->> Lua 5.3 Вторая программа showMessage('Hello World!') Следующий шаг — собрать справочные материалы и практические руководства. Неважно какими они будут по сложности и объему. Всегда можно будет обратиться к ним позже, когда потребуется что-то найти. Справочные материалы Если CE использует версию Lua 5.3, то нужен официальный справочник по этой версии. Ищем Я обращаюсь к celua.txt и defines.lua. Находятся в директории Cheat Engine. В этих файлах краткое справочное руководство. Стоит также отметить, что Cheat Engine 6.7 написана на Lazarus. Написав, например программу по рисованию фигур, линий на форме на Lazarus или Delphi можно будет понять, как сделать также классами и функциями на CE Lua. А что нельзя сделать CE Lua, то решается внедрением и исполнения кода в саму Cheat Engine. Продолжение следует... upd: добавил ссылку Category:Assembler
  17. Хороший тутор по работе с таблицами в том числе показаны варианты заполнения таблиц
  18. Я могу тебе предложить узнать это. Я не знаю ) Проверять надо, в том числе на синтаксис, на скорость выполнения и на мусор в памяти. Тогда можно найти лучший вариант или выбрать любой
  19. Сначала предварительно создается и заполняется таблица edit-ами. А потом с ними уже работаем Забыл, еще форму создать либо кодом, либо через инспектор
  20. Необходимо корректно выполнить вставку внешнего Lua кода. Это нужно для другой задачи с тестированием Lua кода из полей ввода. Потом я опубликую эту утилиту на форум Написал небольшой пример Ошибка Error:[string "text = [[ ..."]:9: invalid use of '%' in replacement string Script Error Что я знаю про эту ошибку. Что есть магические символы и перед ними нужно ставить другие символы. Я даже не буду приводить абракадабру, которую я написал. Скорее всего, я напишу просто свой "подставлятор" Ну вдруг кто знает ответ. Может быть он простой
  21. Есть инструкции, которые добавляют мусора больше чем другие. Показываем объем памяти мусора print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) Ниже код того как попробовать узнать сколько мусора добавил код при парсинге ассемблерной строки двумя способами Пример результатов могут отличаться. Фиг его знает почему. Возможно работает сборщик мусора в разные моменты времени Lua memory usage 1.8 MiB Lua memory usage 1.8 MiB Lua memory usage 1.8 MiB 1.49 Lua memory usage 1.8 MiB Lua memory usage 2.3 MiB Lua memory usage 2.3 MiB 1.47 Lua memory usage 2.3 MiB Lua memory usage 2.8 MiB Lua memory usage 2.8 MiB 1.49
  22. Тема CE Lua скриптов очень интересная. Жаль у меня мало свободного времени на эксперименты с таблицами на формах на CE Lua. Есть еще вариант написать модуль dll на Лазаре с таблицей. Работать с модулем через Cheat Engine На Лазаре можно делать вот такие красивые таблички. Форму в модуль сохранить и работать с функциями модуля. Но проблема с оптимизацией таким способом может не решаться. 1. Чистить кеш памяти. Я писал об этом в блоге. 2. Избегать постоянной записи в edit, если этого не требуется. Например кешировать значение в edit-е в переменной Lua, если это значение отличается, то только тогда обращаться к edit. Т.е. не так local addr = addr + 0x84*6 UDF1["CEEdit"..x].Text = readBytes(addr+(x-15*6)) А например так local value = readBytes(addr+(x-15*6)) if table_Cash[i].cash == value then table_Cash[i].cash = value table_Cash[i].edit.Text = value end И тут не используем конструкцию вида UDF1["CEEdit"..x], т.к. скорее всего это как раз увеличивает объемы мусора и нагрузку на его чистку. Т.е. сделать table_Cash = {} и запись разовую сделать по циклу для всех Edit-ов. Как оптимизировать Lua код? Сравнивать его выполнение по скорости и объему мусора. Сравнение по скорости я писал в блоге, а сравнить кеш мусора до и после можно добавить. print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) Вообще, это конечно CE Lua — это такие заморочки. Даже мне неловко предлагать эти решения. Проще на том же Лазаре таблицу сделать, да чтение памяти и запись. И exe скорее всего будет меньше по размеру и таблички красивее
×
×
  • Создать...

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

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