Функция loadstring позволяет исполнять текст как код. Попробуем генерировать числа, сравнения чисел и логику И, ИЛИ.
Цель: просто пример.
Создать пары случайных чисел А и Б.
Случайно сравнить попарно.
Создать случайно логику "И, ИЛИ" и сравнить результаты сравнения до тех пор, пока не будут истинны
В общем хорошо взялся за регулярки на Lua! Всё подряд прогоняю через них, что под руку попадется, любые задачи.
Случайный пример задачи. Пронумеровать список
Тут же написал
И получил ответ. В следующий раз только вызывать "EnumerateText([[ текст со строками]])"
Тут в буфер текст улетит и выведет в мессагу. После закрытия мессаги через CTRL+V вставит текст, куда хотим
Пронумерованные функции — функции работы со строками последней
Я решил рассмотреть три новые функции:
Пользовательские типы данных в 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" на тот который нужно.
Здесь
Появилась такая опция асинхронного выполнения скриптов
Если эту опцию поставить на скрипты, то появляются вот такие часики
АА-шные скрипты могут искать в этот момент сигнатуру.
Lua скрипты потестить было интересно, узнать действительно ли асинхронно выполняется. Например, один скрипт выполняет счет, второй выполняет счет. По выполнении выводится результат.
Во время выполнения включаем первую галку. Тут CE подвисает. Затем успеваем нажат
Есть инструкции, которые добавляют мусора больше чем другие.
Показываем объем памяти мусора
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
Довольно интересная функция, мне понравилась.
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)
--> Примеры выполне
Конечно не секрет, что типы данных не правильно определяются. Вот пример для 50-ти адресов
Слева как определил данные CE. Справа как определил их я по логу ниже
Понравились данные с размером в 1 байт, привлекают в нимание. Как только я переключил на ноль или 1, то персонаж перестал двигаться и не реагировал на движение.
Лог инструкций
Пытаюсь по логам определить алгоритм для Lua, чтобы скрипт сам ставил тип и смещение. Конечно есть сюрпризы, когда
Игра с рандомом. Есть счет.
Запускается через таблицу в аттаче.
Здесь мог быть 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 (как на скриншоте) и пройти по шагам
Почти месяц ковыряюсь со сборкой апк, которая не запускается на инструментальном тестировании в Firebase
Рис.1 Сборка апк на инструментальное тестирование TestLab от Firebase. Окно AirTest IDE
Две апк-шки создается.
1. В Unity, с иvпортом Poco SDK
2. В Плагине как на рисунке
Затем обе апк-шки отправляются на инструметальное тестирование в Firebase
Запускаю тест. Шесть секунд видео со стандартной заставкой и конец теста.
Прошлая точка входа запускающая активирующий скрипт не хотела работать, если запустить гигантский трейнер (сгенеренный на CE), а потом игру.
Для работы трейнера точка входа теперь задается вот таким образом после генерации кода трейнера
Подробнее в исходниках (лучше смотреть позже, после просмотра видео, которое еще готовится)
gta3.CT
У версии CE 7.2 есть к сожалению баги.
1. При генерации трейнера нужно вручную править высоту надписей — надписи
1. Персонаж падает с большой высоты и разбивается
Ищем адрес скорости прыжка прыгая под speedhack. Находим эту скорость. Ставим бряк на доступ. Прыгаем.
Инструкции на чтение добавляем в список адресов и там начинаем нопить
- Либо по одной
- Либо рискнем по половине от половины
- Либо рискнем и все сразу занопим
Если повезет, а должно повезти, то инструкция не прочитает то значение скорости, которое уложило бы персонажа на землю и можно будет прыгать на
Особенности
1) переход на следующий адрес по инструкциям ветвления вычисляется Lua кодом по ret, jmp, jmp condition до исполнения кода
2) определение опкодов ветвления по readmem без дизассемблериования
3) по тестам последний брейкпоинт снимается на ближайшем цикле
Пример лога до близжайшего цикла, когда поднимается из рутины вверх
Обновление плагина
Установка с репозитория: ссылка
Кратко
1. Добавил сохранение/загрузку параметров. Хранение в текстовом файле в папке autoruns
2. Добавил настройки графического интерфейса (слайдеры, пункт меню)
Подбронее
Плагин ведет историю поиска, отсева, отмены. Логи выглядят следующим образом
Для чего может применятся
На шаге отсева посмотреть в логах, какое значение искали до этого и какой способ поиска использовали.
При неудачных поисках мы просматриваем как и что мы сканировали раньше.
Если вообще ничего не получается при сканировании, то логами можно обмениваться.
Горячие клавиши, которые настраиваются из окна настроек CE работают и в логах.
Установка: скоп
За нейронными сетями и быстрыми вычислениями (например на тензорных ядрах видеокарт)
скорее всего, огромное будущее и огромный спрос. Стартануть в эту тему можно, изучив статью с хабра о принципах AlphaGo Zero и вот эту. Основные моменты это рекуррентные сети, которые ищут в глубь и сверточные сети, которые чем-то похоже на хеш-сумму (на тензорных ядрах они-то и быстро считаются).
На данный момент по своей работе я активно развиваюсь в нескольких направлениях: в мн
pcall() функция может вызывать функцию, которая может вызывать исключение.
Возвращает статус в виде булевой о том, есть ли исключение или нет и возвращает текст исключения.
Источник
Как этим пользоваться? Если вдруг знаем, что может произойти ошибка, то можно её обработать и выполнить правильное действие не останавливая работу Lua скрипта.
Или например если не выполняется условие, то можем сами создать ошибку с помощью функции error, что остановит скрипт.
Сложность: 1/5.
В этом видео рассматривается способ взлома игры "Удаление инструкций" (noping).
С помощью этого способа игровое значение не будет перезаписываться игрой, потому что в игре удаляется инструкция записи значения.
Unity — среда для тренировки искусственного интеллекта. Ниже пример обучения ИИ для игры в гонки.
В новой версии Unity много изменений, если кому интересно на официальном сайте много информации по обновлениям
Функция 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
Если по обратной связи строить и исполнять строку кода, то
Напишем функцию, которая в 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 очищает пробелы
Точка входа в работу читов на Cheat Engine на следующем видео будет начинаться с активирующего скрипта. Таблицу с читами по принципу активирующего скрипта я покажу на видео. В нем будет об общем принципе написания таблицы на CE и расширении её с большим количеством опций + фильтр свой/чужой через функцию commonalities + вынос адреса начала структуры + запись по оффсетам от начала структуры и т.п.
"Активирующий скрипт" — главный скрипт, который вытаскивает адрес начала структуры игрок
Пример лога снятия данных с брейкпоинта на структуру 0x1000 за 10 секунд.
В структуре по смещению 0x2C0 находится здоровье персонажа. На начало этой структуры и был поставлен брейкпоинт .
Ниже будет большой кусок опкодов, который работает со структурой. Можно посмотреть в каком порядке опкоды исполняются и с какими смещениями, насколько далеко они друг от друга. Некоторые смещения рядом с известными смещениями могут заинтересовать. Одинаковые опкоды в определенном порядке, но