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

MasterGH

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

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

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

    129

Записи блога, опубликованные MasterGH

  1. MasterGH
    Был вопрос на форуме о том, как узнать, а куда смотрит игрок и как нарисовать линию в экранных координатах.
    Я не нарисую отрезки в окне игры в экранных координатах, но могу отобразить точки одного отрезка для одного глаза 2д-панельками в экранных координатах (хотя визуально, у Unity экранные координаты связаны с 3д координатами по масштабу пикселя на метр на сцене). Для наглядности все же в окнах сцены будут отрезки в 3д-координатах.
     

     
     
     
    Чтобы посмотреть функции операторов такие как умножение, сложение и свойства normalized, и переписать код на C++ можно декомплировать .net библиотеку C:\Program Files\Unity\Editor\Data\Managed\UnityEngine.dll через ILSpay. Например, там есть расчеты умножения кватерниона (X,Y,Z,W) на эйлеровы углы (X,Y,Z), нормализация, сложение. Библиотеку это можно взять из Unity игр или установив движок Unity.
     
    Адреса позиции и углов обычно находятся рядом друг с другом.
  2. MasterGH
    CT таблица для составления регулярных выражений 4-х функций
     
    string.match (s, pattern [, init]) string.gmatch (s, pattern) string.gsub (s, pattern, repl [, n]) string.find (s, pattern [, init [, plain]]) Функция string.gsub может принимать в аргумент функции "repl" таблицу (тогда будет замена по ключам значений из таблицы ) или в аргумент "repl" может попадать некоторая другая функция с аргументом найденного слова (тогда будет вызов этой другой функции при каждом захвате символа или слова). Более подробное в документации Lua 5.3
     
    Еще несколько ссылок с практическим руководством
     

    Lua Regular expression.CT
  3. MasterGH
    Пример1. Узнать во сколько раз string.match() медленее string.find()
     
    Пример2. Создание лишней локальной переменной
     
    Ответы: 1.38,  1.04.
     
    Если значение меньше единицы, то оптимизированный код хуже.
    Если значение больше единицы, то стоит использовать более оптимизированный вариант.
     
    Для простого поиска лучше использовать string.find чем string.match.
     
     
    Еще несколько примеров
     
    Для чего может пригодиться. Может пригодиться при оптимизации кода трассировке на брейкпоинтах в пошаговой отладке
  4. MasterGH
    В общем хорошо взялся за регулярки на Lua!  Всё подряд прогоняю через них, что под руку попадется, любые задачи.
     
    Случайный пример задачи. Пронумеровать список
     
    Тут же написал
     
     
    И получил ответ. В следующий раз только вызывать "EnumerateText([[ текст со строками]])"
     
    Тут в буфер текст улетит и выведет в мессагу. После закрытия мессаги через CTRL+V вставит текст, куда хотим
    Пронумерованные функции — функции работы со строками последней версии Lua 5.3.x из документации
     
    На что стоит обратить внимание при регулярках:
    1. Работа с пробелами и не пробелами: "%s" и "%S"
    2. Работа с символами разделяющие строки и не разделяющими строки: "%с" и "%С"
    3. Захват строк "(.+)", "(.-)", "(.*)", а также без захвата, т.е. пропуск других символов ".+",".-",".*"
    4. Узнать как и какая функция из выше перечисленных работает, какая используется с регуляторами.
     
    Хотим к примеру вывести слово, которое закончится на пробеле (пишу просто "на пробеле" без учета других символов). Это уже "(%w+)", а если хотим второе слово, то это "%W+%w+" (не выводить первое и вывести второе слово) или "%s(%w+)" (после пробела, но чтобы было без пробела, то захватить в круглые скобки), или "^.+%s(%w+)"(начинать с первого символа до пробела и захват до конца слова).
     
    Если писать на CE Lua, то регулярки знать не обязательно. Но, их желательно знать, чтобы читать чужой код и писать свой. Да и вообще это интересно. Очень короткие выражения позволяют решить некоторую задачу за быстрое время. Основные задачи: поиск текста и замена текста.
  5. MasterGH
    Установка:
    1. Файл GHL_ClassSettings.lua закинуть в autorun (нужен для сохранения и загрузки данных формы)
    2. Двойной клик на Lua Regular expression.CETRAINER вызовет это окно
     
    Описание:
    - Для тренировки и проверки написания регулярных выражений
    - Выбор извлечения строк в виде одной или в виде последовательности
    - При нажатии на кнопку или при вводе текста в memo вычисляется выражение
    Lua Regular expression.CETRAINER
    GHL_ClassSettings.lua
  6. MasterGH
    Legacy of Kain: Defiance
     
    Это старая PC игра выпущена в районе 2003-2004 годах, когда я еще учился в школе в классе 11-ом.
    В самом конце игры была сложная миссия сражения с боссом, никак не получалось её пройти.
     
    Кстати из этой игры есть персонаж на аватаре у пользователя с форума Cheat Engine
     
    Не мог пройти, как не пытался. То ли руки не из того места, пройти очень хотелось. Было у меня немного журналов игровых и там я много раз видел программу MTC. Казалось, что она очень сложная для понимания. Просто помнил о ней и не пользовался.
     
    Так вот игру пройти не мог и решил все-таки MTC научиться пользоваться. С помощью МТС я впервые сделал чит на HP и прошел игру. После этого я переломал все игры, которые у меня были, изучил в этой программе все что можно, хотя с большим трудом это все давалось. Потом появился Интернет. Узнал про Artmoney и другие сканеры. Кстати 9 мая разработчики обещали новую версию Artmoney.
     
    В общем с Legacy of Kain: Defiance и МТС, и началось увлечение взломом игр
  7. MasterGH
    С точностью до тысячной доли секунды можно посчитать задержку выполнения кода, что можно применить как счет производительности.
    local x = os.clock() local s = 0 for i=1,100000 do s = s + i end print(string.format("elapsed time: %.3f\n", os.clock() - x)) После выполнения, показывает 2 тысячных секунды или 2 мс
    elapsed time: 0.002 Можно посчитать прошедшее время для другой цели. Например, если цикл в отладке выполняется более 3 секунд, то это вероятно корневой цикл, а если менее, то это вложенный цикл. На корневом цикле можно остановить трейслог. Об этом может быть потом напишу.
  8. MasterGH
    FINCSTP
     
     
    Похожа на FSTP, также вращает стек регистров FPU (я кстати не знал, увидел при тестах в CE), но только не перемещает значение по адресу.
     
    FSTP [здесь указывается адрес или регистр]
    FINCSTP
     
    Если нужно вытолкнуть значение из ST(0), а адрес куда его выталкивать не нужен, то можно сделать так
    FINCSTP
    Или аналог
    FSTP ST(0)
     
    При использовании стоит обратить внимание на флаги, возможно их состояние будет влиять на исполнение кода.
     
    *Вообще не помню почему я пишу "выталкивать значение" через fstp, когда оно появляется снизу в ST(8). Т.е. не выталкивается по сути.
  9. MasterGH
    Особенности
    1) переход на следующий адрес по инструкциям ветвления вычисляется Lua кодом по ret, jmp, jmp condition до исполнения кода
    2) определение опкодов ветвления по readmem без дизассемблериования
    3) по тестам последний брейкпоинт снимается на ближайшем цикле
     
    Пример лога до близжайшего цикла, когда поднимается из рутины вверх
     
    Код:
     
    Справка
     
    Если трейсить трейслогом 1000 инструкций поверх call, то видим многократное повторение пути внутри цикла между 00437A34 и 0044DFAF.
     
    С помощью скрипта можно выйти на цикл не используя трейслог
    Можно использоваться функции определения куда прыгнет поток, до его выполнения.
    Можно оперировать таблицей адресов с брейкпоинтами в пошаговой отладке.
  10. MasterGH
    Если нужно найти начало и конец подстроки. Пример
    Попробуем найти слово lab в троке gamehacklab.ru
    print(string.find('gamehacklab.ru', 'lab')) >9 11 Если не найдена подстрока, то вернет nil.
     
    С помощью string.match можем выводить не индексы, а строку
    print(string.match('gamehacklab.ru', 'lab')) >lab С помощью string.gmatch можем выводить последовательно строки
    Где 'a.' означает символ 'a' и еще один следующий любой
     
    Здесь комбинация символов "%a+" означает искать слово пока оно не закончится
     
    А здесь заполняем таблицу ключ — значение из строки, которую можно было бы взять из файла
     
    Пока на этом все... Более сложные примеры в предыдущей части записи
  11. MasterGH
    Есть такой плагин "AA Maker" и там довольно интересные регулярные выражения на Lua. Разберем некоторые выражения
     
    Выражение ''%[(.*)%]' - захват всего, что в квадратных скобках
     
    Пример
    local s = 'mov eax, [ecx + 4]' print(string.match(s, '%[(.*)%]')) --> ecx + 4 Символ "%" нужно всегда ставить перед специальными символами такими как ^$()%.[]*+-?
    Символ "%[" и "%]" означают квадратные скобки в строке
    Разбирая комбинацию (.*).
    Точка означает любой символ, а символ умножить означает повторение любого символа
    Круглые скобки означают "подшаблон" 
    Т.е. можем извлечь содержимое инструкции.
     
    Примеры
    "(.*)" - захват всей строки "/(.*)/" - захват всего, что находится между КРАЙНИМИ символами / "/(.-)/" - захват всего, что находится между ПЕРВЫМИ ДВУМЯ символами / Пример из ААMaker плагина
    local _,_,x = string.find(opcode, '%[(.*)%]') из функции ниже Функция
    string.find("СТРОКА", "ШАБЛОН") возвращает номер позиции начала начала и конца шаблона
     
    Пример
    print(string.find('some string', 'me')) --> 3 4  
    Вся функция с комментариями из AAMaker
     
     
    Чтобы посмотреть результат, сделал скрин отладки Lua кода
     

     
    Функции по работе со строками. Link
    Используемые источники: link, link, link, link
    aamaker.lua
  12. MasterGH
    Функция loadstring позволяет исполнять текст как код. Попробуем генерировать числа, сравнения чисел и логику И, ИЛИ.
    Цель: просто пример.
     
    Создать пары случайных чисел А и Б.
    Случайно сравнить попарно.
    Создать случайно логику  "И, ИЛИ" и сравнить результаты сравнения до тех пор, пока не будут истинны
     
     
    Пример вывода в Cheat Engine:
    >= or a = 83, b = 75, result = true a = 18, b = 86, result = false a = true, b = false, result = true Т.е.
    (83 >= 75 or 18 >= 86) == true, т.к. первое условие верное 83 >= 75 83 >= 75 = true 18 >= 86 = false  
  13. MasterGH

     
    Можно в редакторе сделать автозавершение инструкци для CE Lua и даже для CE Autoassembler.
     
    Накидал пример, может быть, кому интересно будет для других языков.
    Установка. Поместить файл в директорию на скриншоте
     
    lua.xml

     
    Настройки

  14. MasterGH
    В архиве два файла. Функции
    1. Контекстное меню. Компактное/ не компактное окно CE
    2. Сохранение и загрузка положения и размера формы CE
    3. Сохранение и загрузка компактного состояния формы или не компактного
     
    Сделано на энтузиазме после написания класса сохранения и загрузки параметров.
    После запуска, CE будет там, где её (CE) закрыли с позицией, размерами и с состоянием "Компактны режим", если последний был включен.
     
    Параметры сохраняются на жесткий диск в файл "..\autorun\userdata.txt"
    CompactView.rar
  15. MasterGH

     
    На скриншоте 22 ветви трассеровки от адреса патронов не входя в call-ы до корневого цикла. Корневой цикл определяется, когда поиск происходит более трех секунд и не находит ничего. Вполне хватает этого времени. Буду еще повторно тестить и проверять доходит ли он цикла или надо еще что-то придумывать.
    Желтым выделяется точка, вертикальная полоса ветви и связи с такими же узлами. Узел это адрес выхода из ret
    Внизу ряд счетчиков от 00 до 99. Если более 99 то отсчет заного. Показывает дианамику обращения к ветвям после нахождения корневого цикла
    Есть еще несколько функций, которых не видно на скриншоте — в контекстном меню.
    Анализ можно запустить из окна CE из главной таблицы, выделив адрес и опцию либо на чтение, либо на доступ.
     
    При тестах увидел, что логи неполные. Например, первый кружок это инструкция читающая патроны очень часто. От этой инструкции идут вверх множество вариантов ветвей,а  у меня один вариант — вертикальная полоска с кружками. От первого круга надо сделать ветвление влево и вправо.
     
    Занялся модернизацией этого рисования и оптимизацией. Например, чтобы определить является ли проход по ret, то не нужен дизассемблер. Залез в доки и посмотрел опкоды
     
    function IsRet(address) local value = readBytes(address,1, false) return value == 0xC3 or value == 0xCB or value == 0xC2 or value == 0xCA end Скорость трассеровки должна в несколько раз увеличиться. К сожалению, смогу это узнать, когда перепишу текущий плагин.
    Там были уже сделаны изменения (все еще сырое для публикации плагина, пока не публикую)
     
     
  16. MasterGH
    На видео показано рисование через поток и рисование без потока
    Когда происходит рисование без потока, то окно нельзя подвинуть, не работает кнопка и даже не возможно работать с Cheat Engine
     
     
     
     
     
    Код:
     
     
     
     
  17. MasterGH
    В этой записи блога не будет чего-то, что показало бы "вау, это что-то новое и есть результат". Все сырое и результат пока мне только снится — быстрый поиск условий и включение, и выключение ветвей по этим условиям. Мыслю я не инструкциями, не группой инструкций, а ветвлениями кода и условиями, которые их запускают. Проще 20 ветвлений по 5 окон, чем тонна инструкций... Жаль пока теория, практики с результатом нет.
     
    Рисунок. На нем слева прототип, справа текущий сырой вариант
     
    1) ставим брейкпоинт на адрес патронов
    2) от него расплетаются ветви кода от каждого хита, от каждой инструкции, и по ретам ветвление выходит из рутины
     
    Кружи означают ret-ы. Клик на круг будет переходлм в дизассемблер
    Стрелки будут показывать входы и выход связанные с соседними рутинами (поиск общих адресов будет стрелками)
     

     
    На экране справа вариант без стрелок, т.к. не успел еще их отладить. 4 ветки трассера по ретам из рутины связанные с адресом патронов, выстрелами.
    Потом я продолжал стрелять, перезаряжаться, выкидывать и поднимать оружие. В итоге собрал 20 ветвлений по ретам от инструкций связанные с патронами
     
     

     
    Как видно, довольно все еще сырое, но видно, что все 20 ветвлений по ретам сформировались до корневого цикла.
     
    Потом можно будет, я надеюсь, увидеть связи между этим ветвлениями, когда я прикручу стрелки. По кружкам кликать и переходить в дизассемблер и смотреть условия выше. На условии искать другие адреса, которое запускает ветвь кода. На адресах опять делать ветвления (новое окно с ветвлениями о ретам)... На практике будет получаться более двух таких окон (для патронов). Нужно будет искать адреса связанные с условиями в новом окне.
     
     
  18. MasterGH
    Открываем Lua консоль из дизассемблера
    Пишем Lua скрипт
    Дальше по шагам как на картинке

     
    Сколько я не пользовался CE я никогда не знал об этом отладчике. Когда я случайно узнал, то был приятно удивлен.
    Если мы пишем какую-то функцию и она дает сбой, то её можно отладить как на скриншоте. Это может быть и не функция.
    Например, код прочитал какой-то файл с текстом сохраненных параметров и подсмотрели в пошаговой Lua отладке что происходит дальше.
     
    *Действуют горячие клавиши. Например, F7— шаг, F9 — запуск без остановки.
  19. MasterGH
    Опубликованная в веб формате книга на официальном сайте.
    Язык английский
     
    Перейти
     
    Оглавление книги
     
    Книга о приемах программирования больших проектов, в которых огромное количество строк кода. Основная проблема, когда ты уже что-то написал и надо добавить в уже существующий проект внушительный функционал или же наборот его поменять, или убрать. Хватаешься за галову и думаешь, что проще написать проект заного. Автор из числа тех программистов, которые оставляют свой опыт и знания (есть донат). Порой бывает информация более полезной в блогах чем где-либо, редко бывает в виде книг.
     
    Про автора книги знаю очень мало, кому надо можете погуглить.
  20. MasterGH
    Обновление плагина
     
    Установка с репозитория: ссылка
     

     
    Кратко
    1. Добавил сохранение/загрузку параметров. Хранение в текстовом файле в папке autoruns
    2. Добавил настройки графического интерфейса (слайдеры, пункт меню)
    Подбронее
     
    Слайдеров много, сам путаюсь в них, какие за что отвечают.
    С цветами экспериментировал не понравилось, пока оставляю градацию "черный-белый".
    Для тех кто видит в первые этот плагин.
     
    Плагин планируется развивать дальше, сейчас это черновой вариант
  21. MasterGH
    Чтобы получить цвет из компонента нужно найти его на форме CE через Lazarus. Этот компонент нельзя найти визуально, он скрыт.
    Узнал об этом случайно, когда зашел на форум Cheat Engine в тему расширений на Lua. Теперь в дизассемблере можно будет быстренько цвета менять

  22. MasterGH
    Связь точек линиями и связь через метод описанный в статье
     
    Пример1. Слева линии, справа работа алгоритма
     

     
    Пример2. Скриншот из pdf документа с разным значением коэфициента
     

     
    Пример3. С альфа и без альфа канала
     
     
    Ссылка на статью.
    Часть оригинала bundles_infovis.pdf
     
    Где можно применить? Пока не придумал, но впечатлило.
×
×
  • Создать...

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

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