-
Постов
2 999 -
Зарегистрирован
-
Победитель дней
129
Тип контента
Профили
Форумы
Загрузки
Блоги
Весь контент MasterGH
-
[Cheat Engine Lua] Тестирование производительности2
MasterGH опубликовал запись в блоге в Блог MasterGH
Уже была запись про тестирование производительности. В этом примере тестируем разное обращение к функции со средним арифметическим значением Результаты при 4-х запусках avg = 0.93333998758048 avg = 1.0322099291325 avg = 0.92657961891689 avg = 1.1883763135947 Вывод. Разница не существенная. -
vtSingle — тип взят из defines.lua. float его синоним. Single-precision floating-point
-
[Cheat Engine] Dissect Data Scaner 1.0.1 beta
MasterGH прокомментировал MasterGH запись блога в Блог MasterGH
В принципе понятно куда копать. Надо алгоритм сканера переделать на такой, чтобы встав в любое место структуры, т.е. на любой байт, правильно получить смещение в структуре. Для этого надо просчитать то, что в квадратных скобках опкхода. Если это не возможно, потому что регистр перезаписываются, значит ставим не аппаратный бряк на инструкцию и он работает постоянно в холостую записывая нужные регистры перед тем как сработает аппаратный бряк на адресе структуры. Когда случилось, то снимем все бряки, определяем правильно смещение. Ну, а там дальше смотреть... -
[Cheat Engine] Dissect Data Scaner 1.0.1 beta
MasterGH прокомментировал MasterGH запись блога в Блог MasterGH
Тестирую я радостный на gta3 плагин. Нашел кучу интересных адресов настроек. И силу прыжка, и скоростей Velocity, и id земли на которой стоим и id глобального события (если его переключить, то ты либо в полете, либо арестован либо еще что-то). И тут я увидел что капитально на многих адресах поехали смещения в структуре. В пределах 1-4 байт. И как я понял дело в скорости срабатывания адресов и таймера ожидания перехода аппаратного бряка на следующий байт в структуре до её размера. Представим себе 4-х байтовое значение Начало структуры: +00: xx xx xx xx +04: xx xx xx xx 1. На первом байте не успели сработать инструкции. 2. На втором байте не успели сработать инструкции. 3. На третьем байте наконец сработали и увидели опкод.Опкод распарсили. Получили размер в 4 байта 4. На третьем байте на два байта смещение +00 убежало вперед в смещение +02. Примерно такая картина Начало структуры: +02: [xx xx] xx xx .... и там много что поехало, а некоторые смещения не поехали Окей. Я могу быстро вычислить адрес в скобках [eax+смещение] и даже всякие repe повторы обработать, но как только вот такая штука попадается mov eax, [eax+смещение] или вот такая mov eax, [eax*4+смещение], то eax уже успеет перезаписаться, ведь на данных стоит аппаратный бряк, а он работает после выполнения инструкции. 1) На смещении нужно постоять и подождать других инструкций и если N времени таких нет, то надо мне подумать, как быть дальше. 2) В принципе я могу и не ждать снять аппартный бряк с адреса в структуре и поставить не аппаратный бряк уже на инструкцию и получить eax до инструкции., а не после как при аппаратном. И тут еще один нюанс, на [eax+смещение], не тот адрес, а какой-то соседний или вообще дальний. Похоже надо оставлять оба бряка и аппаратный на смещении структуры и не аппаратный на инструкции. Сохранять данные не аппаратного постоянно, как только сработает аппаратный посмотреть последний данные не аппаратного и с ними работать. В общем буду думать как это все упростить и чтобы стабильно работало. Еще есть такая штука jumps и calls на адрес инструкции, там тоже может быть ситуация... -
Пример, который показывает как снять стек вызовов функций function A0() -- Здесь можно удалить ":gsub('\n','\r\n')", но тогда в консоли текст будет в одну строку print(debug.traceback():gsub('\n','\r\n')) end function A1() A0() end function A2() A1() end function A3() for i=1,3 do A2() end end A3() Можно поставить пошаговую отладку в консоли Lua (как на скриншоте) и пройти по шагам
-
Я обратил внимание на следующие поведения записи и чтения 1. Срабатывают только инструкции чтения до изменения параметра, адрес рабочий С адресом работают инструкции на чтение, но если в друг в этом адресе что-то поменять (например в CE), тот тут же выскочат инструкции на запись. Нельзя однозначно утверждать, что адрес является настроечным параметром, но и нельзя утверждать, что это не рабочий адрес. Какая-то инструкция может жестко менять значение, а может быть будет "стараться" изменить значение адреса в меньшую или большую сторону, но адрес при этом будет рабочим. 2. Срабатывают инструкции записи и чтения, адрес не рабочий Запись и чтение влияет только на часть игры, а не на все или вообще не влияет, а перезаписывается постоянно. Например, на визуальное отображение полоски со здоровьем. Получается, что адрес не рабочий, а у него есть как и в первом пункте инструкции и на запись, и на чтение. 3. Один раз срабатывает инструкция записи и потом всегда на чтение Если попался такой адрес в структуре, то он точно является "настроечным" и рабочим адресом. Например, это какой-то коэффициент, который добавляет, умножает, отнимает... в общем что-то меняет. Что с ним не делай, это адрес будут только "читать". Также это может быть булевой параметр "1 "или "0" и по нему может что-то резко меняться в игре. Окей. Вспоминается окно с кучей инструкций и счетчиков уникальных адресов (не более 8-ми логируется) Постреляв патроны с адресом патронов (в СТАКЛЕРЕ Зов Припяти) сработали инструкции как на запись, так и на чтение. Первая инструкция читает очень часто, вторая редко. В круглых скобках обозначаются количество проскакивающих адресов. Если был выстрел и значение поменялось, то вылезли инструкции записи (все после первых двух). Код читает в цикле адрес...и если, что поменялось, то запишет в него потом. Это похоже на пункт1, который обсуждали выше, но этот адрес патронов не тот, который нужен. С виду рабочий, но патроны потом не стреляют. Патроны это структуры в памяти, а адрес их как счетчик структур Как можно делать Создаем две группы (скрин ниже). Первая текущая и не замороженная. Вторая с двумя замороженными состояниями, когда стоим и ничего не делаем. Делаем несколько выстрелов. Цвет по +AC нас интересует больше всего, он соответствует логике состояний (стреляю и (не стреляю и не стреляю)) Выделяем и перемещаем адреса этого цвета и морозим в таблице. Первый праметр это прочность, второй не знаю. Третий счетик патронов. 3 и 5 адреса связанные, если правильно помню, с объектами патронов В Сталкере это не даст беск. патрнов, но в других играх может иметь смысл как прием сравнения структур и групп. p.s. По Сталкеру Зов Припяти, к сожалению, у меня не было времени взломать патроны или может быть я не умею, не знаю. Какие-то патроны в сталкерах ломал, но не помню как.
-
Немного комментариев к этой версии. 1. Исправлены смещения 2. Добавлены также инструкции на запись На скриноте ниже пример сравнения текущей структуры с координатами в СТАЛКЕРЕ Зов Припяти с копией структуры.
-
Да, действительно делалось только для 6.7. Будет исправлено описание файла. Баг, результат которого можно видеть на скриншоте ниже. Два одинаковых опкода и неверный оффсет +131, а нужно +130 . Об этом баге я знаю. Скоро будет исправлено
-
Не хватало файла GHL_ClassSettings.lua. Перезалил
-
Версия 1.0.2 beta
80 раз скачали
Только для Cheat Engine 6.7 Это тестовая версия, поэтому могут быть ошибки при сканировании. О них можно написать мне в личку с названием игры, сигнатуры инструкции. Если плагин вдруг заключил и пишет что-то в консоли, то нажать на кнопку Stop или для остановки ввести Lua команду stopDissectDataScanner() Установка Распаковать в основную директорию с программой. В архиве форма, файл настроек и lua исходник. -
Проведено огромное количество опытов над структурами. Много переделок. Очень кратко напишу, что поменялось. 1. Название структуры состоит из адреса, количества адресов в ней и времени в миллисекундах на один байт в структуре. Подчеркнуто красным 2. Смещения отбираются только те, на которых за X времени не было обнаружено ни одной инструкции на запись. Чем больше та самая чувствительность, тем точнее результат 3. В именах структур теперь ценная информация. Это смещение, регистр и тип На скриншоте ниже можно посмотреть пункты 2 и 3. Также на этом скриншоте я заморозил по соседству адрес (поставил Lock) и пару раз пострелял в игре Сталкере Зов Припяти Выводы, которые я сделал за очень и очень скромное время пользования. За минут 15 и на паре структур оружия в двух разных играх L4D2 и Сталкер Зов Припяти 1. Если править 4-х байтовые значения, то легко можно нарваться на вылет игры. Но подключившись снова, можно продолжить. 2. Правки значений с типом в 1 байт могут заблокировать оружие (в двух играх) или же устроить скорострельность на полную катушку в L4D2. 3. Правки значений с типом float. Можно легко нарваться на вылет в игре, если например поставить нолик. Деление на ноль или какая-то иная причина. Лучше ставить чуть больше нуля, можно положительные или отрицательные значения 4. Частенько бывают адреса в структуре, на которых включаются инструкции записи только после изменения значения. Тут я пока ничего не смог сделать, просто удалить их из структуры как лишние. 5. Для сканера используется 1 аппаратный брейкпоинт, остальные три штуки еще не используются, т.к. сложно их прикрутить. Если использовать все 4 аппаратных бряка, то скорость сканера была бы в 4 раза быстрее. Сейчас на 2К байт по 10 мс, у меня уходит где-то 150 секунд. Если я ставил 20мс, то находилось на 10 смещений больше или какие-то другие смещения пропадали. Код будущего плагина все еще находится на стадии тестирования. Поэтому пока плагин не выкладываю. upd1: инструкции cmp, add, sub, xor, and, not, test, mulss, fsub, fmul, dec, inc, mul; теперь выводятся в имя элемента структуры. На скриншоте случайно вышел на координаты UI таймера. Сделал три скана трех структур в новых окнах upd2: перемещение структуры Итог перемещения двух структур в первую
-
По RTTI писать не буду, надо изучать и пробовать. Если в теории, то такой способ даже в играх, в которых нет RTTI. Найти координаты любого игрового объекта, например, главного персонажа. На них поставить брейкпоинт на доступ в CE. Включить опцию счетчика уникальных адресов. Там где их будет очень много, то та инструкция скорее всего работает со всеми координатами в мире. Среди этого многообразия адресов долго будет вручную найти координаты аномалии. Можно написать Lua скрипт, который найден ближайший игровой объект рядом с другим игровым объектом и вывести список таких координат. Если координаты аномалии движутся, то можно вручную найти или опять скриптом через Lua.
-
Окей. Решение выложили, тему закрываю
-
Можно написать скрипт в теге кода под спойлером и пару слов как было сделано. Таблицы некогда проверять
-
Охота на структуры и удивительное путешествие в мир структур в L4D2 1. Игру L4D2 в оконный режим 2. Установка плагина (позже) 3. Установка VEH отладчика, иначе вылеты 4. Первая миссия. Ищем адрес патронов. Бряк на адрес. Нашли инструкцию Красным показано, что я не всю структуру проанализирую позже. Долго было ждать. Структура больше 5К байт... 5. Делаем сигнатуру любой инструкции при работе с патронами на всякий случай, если игра вылетит. server.dll,83 BE 14 14 00 00 00 7F 4D 6. Переходим в код и ищем проскакивающие адреса на инструкции. Там один адрес нашего пистолета. Клик на него и переносим адрес начала будущей структуры в окно Dissect Window. Можно не создавать структуру (отказываемся). Кликаем "Scanner" (он будет на всех окнах dissrct data) 7. Далее побежало сканирование. В игре можно что-то делать, можно ничего не делать. Долго ждать.. Меняю опции. Чувствительность как была так и осталась минимальная (это время ожидания прерывания на адресе умноженное на коэфициент чувсвительности и на 100 мс). Размер структуры меняю, до 1100 Наконец ~30 секунд дождался без вылетов (иногда бывают, возможно из-за VEH). Появился результат Самые интересны это байтовые и float значения. и инструкции чтения. Их определит можно пока только по логам... Меняю первый байт на 1 и пистолет стал очень быстро стрелять. Ради чего это все и делалось, чтобы похожие адреса искать... Если сравнить дефолтную расструктуризацию, она слева Логи (для меня и для желающих) по определению типа по опкодам Плагин выложу позже. Надо еще доработать и потестить. Вот к примеру float распознал как Pointer и там где fst тоже по +42C тоже фигня. Это ошибки. Это быстро поправить, но могут быть еще ошибки. Не менее интересны еще вложенные структурки, которые удается раскрыть (не все). Вот одна из них и усеяна параметрами, которые можно покрутить Вложенные структуры пока отдельно можно создавать в окнах, чистить сканером, потом подставлять их в основную структуру по имени. В общем пока рано об этом писать. Больше всего меня волнует польза, т.е. что можно с этим сделать. Пока только сразу вышел на скорострельность. Еще шесть параметров покрутил байтовых, ничего не дало. Надо еще попробовать выводить только смещения, которые работают на инструкцияъ чтения, а не "чтении и записи". Запись скорее всего не нужна. Значения просто активно перезаписываются в структуре. А вот оставлять смещения, с которыми работает только "чтение" скорее всего даст куда больше вероятности найти параметр настройки.
-
Конечно не секрет, что типы данных не правильно определяются. Вот пример для 50-ти адресов Слева как определил данные CE. Справа как определил их я по логу ниже Понравились данные с размером в 1 байт, привлекают в нимание. Как только я переключил на ноль или 1, то персонаж перестал двигаться и не реагировал на движение. Лог инструкций Пытаюсь по логам определить алгоритм для Lua, чтобы скрипт сам ставил тип и смещение. Конечно есть сюрпризы, когда регистр перезаписывает сам себя и еще куча опкодов. Чтобы получить такой лог мож попробовать этот скрипт. Он черновой
-
Решил попробовать написать CE Lua скрипт, который прочесывает структуру и в Dissect data/structures окне создавал бы структуру только со смещениями, с которыми код работает, т.е. читает или пишет. Например, мой персонаж прогуливается по городу, а каждые 200 мс ставится брейкпоинт на смещение +1 до гипотетической N границы структуры (например до 4096). Я не успел сделать определение типа, но смещения внутри структуры получить я успел. Итак, находим начало структуры любой. Запускаем Lua скрипт и просто что-то делаем в игре. Потом вылазит текст с дизассемблированными инструкциями и смещениями. Уже по этим логам можно определить вручную 1) к каким смещением было обращение (адреса по ним мы и будем менять или сравнивать структуры между собой позже) 2) по виду инструкции и соседнему смещению уже примерно можно определить тип данных и их размер Осталось сделать определение типа, а это не так уж долго сделать и осталось взять код из предыдущих записей в блоге формирования структуры в окне dessect data. Так мы получим структуру только с активными смещениями, (а зачем нам пассивные?) и определим в них тип, я надеюсь определим правильно Пример кода, который я использовал
-
Это должен быть адрес одной из координат. Если игра зависает при подключении отладчика, то может попробовать включить VEH дебаггер. В отладчике из меню вызывается "dessect data/structure " и там в окне указывается адрес начала структуры. Если смотреть скриншот выше это был бы адрес из ebx Когда ты кликнешь на инструкцию у тебя появится регистр плюс смещение. mov [ebx+ смещение] ebx будет началом структуры
-
Напоминалка (для себя) - склероз однако:
MasterGH прокомментировал Garik66 запись блога в Блог Garik66
Актуально, если под code будет всегда оригинальный код в 10 байт и 10 байт будут другими на другой инструкции. Я думаю, шаблонный генератор все сделает за нас. Помогает такие штуки не забывать и просто о них даже не думать. -
Поставить брейкпоинт на любой адрес координат. Найти начало структуры. Начало лежит в регистре. Например [eax + 0xx]. Начало в eax Расструктуризовать dessect data/structure Взять случайные смещения рядом с eax + 0xx и поменять значения по ним раза в два больше. Зайти в игру и посмотреть, что поменялось. Потратить время и по всей структуре поменять рандомно значения раза в два больше. Тип float к примеру. Если игра вылетает, то повторить с другими смещениями.