Я решил рассмотреть три новые функции:
Пользовательские типы данных в hex-окне
Фильтр на окне определения адресов
Поиск данных в окне Tracer
1. Пользовательские тип данных в hex-окне
Пример как сделать:
Фильтр на окне определения адресов
3. Поиск данных в окне Tracer
Обычный поиск, как на прошлых скринах
Примеры
Ну и более интересная версия перебора и одновременн
Функции:
1) Три типа данных: float, double, integer
2) 10 слотов сохранений
3) Управление горячими клавишами. ctrl+X - где X от 0 до 9 сохраняет позицию, shift + X загружает ранее сохраненную позицию
4) Озвучивание загрузки или сохранения Как пользоваться:
1. Подключаемся к процессу игры любым способом (хоть вручную, хоть на Lua, чем угодно)
2. В CE вставляем Lua скрипт
3. Меняем адрес teleport_address = "03D2C6DC" на тот который нужно.
Здесь
Пример1. Узнать во сколько раз string.match() медленее string.find()
Пример2. Создание лишней локальной переменной
Ответы: 1.38, 1.04.
Если значение меньше единицы, то оптимизированный код хуже.
Если значение больше единицы, то стоит использовать более оптимизированный вариант.
Для простого поиска лучше использовать string.find чем string.match.
Еще несколько примеров
Для чего может пригодиться. Может пр
В общем хорошо взялся за регулярки на Lua! Всё подряд прогоняю через них, что под руку попадется, любые задачи.
Случайный пример задачи. Пронумеровать список
Тут же написал
И получил ответ. В следующий раз только вызывать "EnumerateText([[ текст со строками]])"
Тут в буфер текст улетит и выведет в мессагу. После закрытия мессаги через CTRL+V вставит текст, куда хотим
Пронумерованные функции — функции работы со строками последней
Прошлая точка входа запускающая активирующий скрипт не хотела работать, если запустить гигантский трейнер (сгенеренный на CE), а потом игру.
Для работы трейнера точка входа теперь задается вот таким образом после генерации кода трейнера
Подробнее в исходниках (лучше смотреть позже, после просмотра видео, которое еще готовится)
gta3.CT
У версии CE 7.2 есть к сожалению баги.
1. При генерации трейнера нужно вручную править высоту надписей — надписи
Есть инструкции, которые добавляют мусора больше чем другие.
Показываем объем памяти мусора
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 us
Появилась такая опция асинхронного выполнения скриптов
Если эту опцию поставить на скрипты, то появляются вот такие часики
АА-шные скрипты могут искать в этот момент сигнатуру.
Lua скрипты потестить было интересно, узнать действительно ли асинхронно выполняется. Например, один скрипт выполняет счет, второй выполняет счет. По выполнении выводится результат.
Во время выполнения включаем первую галку. Тут CE подвисает. Затем успеваем нажат
Конечно не секрет, что типы данных не правильно определяются. Вот пример для 50-ти адресов
Слева как определил данные CE. Справа как определил их я по логу ниже
Понравились данные с размером в 1 байт, привлекают в нимание. Как только я переключил на ноль или 1, то персонаж перестал двигаться и не реагировал на движение.
Лог инструкций
Пытаюсь по логам определить алгоритм для Lua, чтобы скрипт сам ставил тип и смещение. Конечно есть сюрпризы, когда
Довольно интересная функция, мне понравилась.
showSelectionList() позволяет просмотреть список класса Strings и выбрать свойство через список.
Как пример посмотрим список свойств главной формы и выберем любое свойство
local mainForm = getMainForm()
local listProperties = getPropertyList(mainForm)
local allowCustomInput = false
local id, name = showSelectionList("Title", "Caption", listProperties, allowCustomInput)
print ('Index: '..id..", Name: "..name)
--> Примеры выполне
Сложность: 1/5.
В этом видео рассматривается способ взлома игры "Удаление инструкций" (noping).
С помощью этого способа игровое значение не будет перезаписываться игрой, потому что в игре удаляется инструкция записи значения.
Игра с рандомом. Есть счет.
Запускается через таблицу в аттаче.
Здесь мог быть AI на Lua, возвращающий номер клетки от 1 до 9.
function InputAI()
-- рандом
return math.random (1, 9)
end
Извиняюсь, лучше рандома пока не могу предложить.
Крестики и нолики.CT
Пример, который показывает как снять стек вызовов функций
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 (как на скриншоте) и пройти по шагам
Точка входа в работу читов на Cheat Engine на следующем видео будет начинаться с активирующего скрипта. Таблицу с читами по принципу активирующего скрипта я покажу на видео. В нем будет об общем принципе написания таблицы на CE и расширении её с большим количеством опций + фильтр свой/чужой через функцию commonalities + вынос адреса начала структуры + запись по оффсетам от начала структуры и т.п.
"Активирующий скрипт" — главный скрипт, который вытаскивает адрес начала структуры игрок
Почти месяц ковыряюсь со сборкой апк, которая не запускается на инструментальном тестировании в Firebase
Рис.1 Сборка апк на инструментальное тестирование TestLab от Firebase. Окно AirTest IDE
Две апк-шки создается.
1. В Unity, с иvпортом Poco SDK
2. В Плагине как на рисунке
Затем обе апк-шки отправляются на инструметальное тестирование в Firebase
Запускаю тест. Шесть секунд видео со стандартной заставкой и конец теста.
Особенности
1) переход на следующий адрес по инструкциям ветвления вычисляется Lua кодом по ret, jmp, jmp condition до исполнения кода
2) определение опкодов ветвления по readmem без дизассемблериования
3) по тестам последний брейкпоинт снимается на ближайшем цикле
Пример лога до близжайшего цикла, когда поднимается из рутины вверх
За нейронными сетями и быстрыми вычислениями (например на тензорных ядрах видеокарт)
скорее всего, огромное будущее и огромный спрос. Стартануть в эту тему можно, изучив статью с хабра о принципах AlphaGo Zero и вот эту. Основные моменты это рекуррентные сети, которые ищут в глубь и сверточные сети, которые чем-то похоже на хеш-сумму (на тензорных ядрах они-то и быстро считаются).
На данный момент по своей работе я активно развиваюсь в нескольких направлениях: в мн
1. Персонаж падает с большой высоты и разбивается
Ищем адрес скорости прыжка прыгая под speedhack. Находим эту скорость. Ставим бряк на доступ. Прыгаем.
Инструкции на чтение добавляем в список адресов и там начинаем нопить
- Либо по одной
- Либо рискнем по половине от половины
- Либо рискнем и все сразу занопим
Если повезет, а должно повезти, то инструкция не прочитает то значение скорости, которое уложило бы персонажа на землю и можно будет прыгать на
Обновление плагина
Установка с репозитория: ссылка
Кратко
1. Добавил сохранение/загрузку параметров. Хранение в текстовом файле в папке autoruns
2. Добавил настройки графического интерфейса (слайдеры, пункт меню)
Подбронее
Плагин ведет историю поиска, отсева, отмены. Логи выглядят следующим образом
Для чего может применятся
На шаге отсева посмотреть в логах, какое значение искали до этого и какой способ поиска использовали.
При неудачных поисках мы просматриваем как и что мы сканировали раньше.
Если вообще ничего не получается при сканировании, то логами можно обмениваться.
Горячие клавиши, которые настраиваются из окна настроек CE работают и в логах.
Установка: скоп
Пример лога снятия данных с брейкпоинта на структуру 0x1000 за 10 секунд.
В структуре по смещению 0x2C0 находится здоровье персонажа. На начало этой структуры и был поставлен брейкпоинт .
Ниже будет большой кусок опкодов, который работает со структурой. Можно посмотреть в каком порядке опкоды исполняются и с какими смещениями, насколько далеко они друг от друга. Некоторые смещения рядом с известными смещениями могут заинтересовать. Одинаковые опкоды в определенном порядке, но
pcall() функция может вызывать функцию, которая может вызывать исключение.
Возвращает статус в виде булевой о том, есть ли исключение или нет и возвращает текст исключения.
Источник
Как этим пользоваться? Если вдруг знаем, что может произойти ошибка, то можно её обработать и выполнить правильное действие не останавливая работу Lua скрипта.
Или например если не выполняется условие, то можем сами создать ошибку с помощью функции error, что остановит скрипт.
Функция loadstring исполняет строку кода как функцию.
f = loadstring ("print 'hello, world'")
f () --> hello, world
Есть еще и такая функция как string.dump. Она создает строку из функции
function f () print "hello, world" end
s = string.dump (f)
-- Можно строку тут же запустить как код
loadstring (s) () --> hello, world
Если по обратной связи строить и исполнять строку кода, то
Unity — среда для тренировки искусственного интеллекта. Ниже пример обучения ИИ для игры в гонки.
В новой версии Unity много изменений, если кому интересно на официальном сайте много информации по обновлениям
Напишем функцию, которая в 3.2 раз быстрее кода ниже
splitDisassembledString(disassemble(address))
Сравнивая скорости получаем оптимизацию в ~3.20 раза быстрее.
Пример использования
function GetDebugString2(address)
local clearString = string.gsub(disassemble(address), '%s','')
return string.match(clearString, '^(.-)%-(.-)%-(.-)$')
end
local address, bytes, opcode = GetDebugString2(0x0045464A)
print(address)
print(bytes)
print(opcode)
gsub очищает пробелы
Я обратил внимание на следующие поведения записи и чтения
1. Срабатывают только инструкции чтения до изменения параметра, адрес рабочий
С адресом работают инструкции на чтение, но если в друг в этом адресе что-то поменять (например в CE), тот тут же выскочат инструкции на запись. Нельзя однозначно утверждать, что адрес является настроечным параметром, но и нельзя утверждать, что это не рабочий адрес. Какая-то инструкция может жестко менять значение, а может быть будет "стараться" измен