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

MasterGH

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

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

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

    129

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

  1. MasterGH
    Пост для тех, кто интересуется Lua в Cheat Engine. 
     
    Можно подхватить разные моменты активации и деактивации записи в таблице CE и рассчитать размер кода между метками
     
    1. По шаблону вставляем АА код для туториала Cheat Engine
    2. Регистрируем метки-маркеры в АА коде
    3. Этими метками в Lua считаем и выводим ""endCode - startCode" размер байтов
     
    Пример, который подсчитал 15 байтов

     
     
     
    Пример скрипта
     
    Документация кому интересно
     
  2. MasterGH
    Вступление
     
    В CE выделим участок кода и функцию
    Sub eax,edx - вычитание и наиболее значимее чем запись и чтение.
    После декомпиляции
    Если выделили две инструкции
     
    Обращать внимание будем на математику, логику, условия и потом на чтение и запись.
    В данном случае, нужно найти вычитание из адреса "eax4->f1152 = eax4->f1152 - (eax3 + 1)"
     
     
    Как поставить декомпилятор
    1. С форума Cheat Engine качаем архив
    2. Распаковываем в папку с Cheat Engine
    3. В настройках открываем плагин cesmartdec.dll
    4. Идем на инструкцию, выделяем функцию 
    5. Декомпилируем на первой выделенной инструкции из всех выделенных
     
  3. MasterGH
    Существует три логических оператора: and, or, not.
    Те, кто уже знаком с языками программирования знают, как эти логические операторы работают.
    Например, 
        A = true     B = true         if A and B then print('Условие "A and B" выполняется') end         if A or B then print('Условие "A or B" выполняется') end         B = false     if not (B == A) then print('Условие "not (B == A)" выполняется') end  
    Но, дальше интереснее.
        Все логические операторы считают false и nil ложными, а все остальное — истинными.      Оператор "and" возвращает свой первый аргумент, если он ложен и в противном случае возвращается второй аргумент     Оператор "or" возвращает свой первый аргумент, если он не равен false и в противном случае возвращается второй аргумент.  
    Сходу можно запутаться, но с примерами станет понятнее
     
      print (4 and 5) --> "5". В этом примере '4" не ложный, а значит при операторе "and" вернется второй аргумент "5".   print(0 and 13) --> "0". Аналогично   print(false and 13) --> "false". В этом примере первый аргумент false(ложный), а значит при операторе and вернется "false".   
      print(4 or 5)  --> "4"  В этом примере "4" не ложный, а значит при операторе "or" вернется уже первый аргумент "4".   print(false or 5) --> "5" В этом примере "false" ложный, а значит при операторе "or" вернется уже первый аргумент "5".   
      Если кто вспомнил, то в C# есть такой оператор "?" (условный) 
      string result = 4 == 4 ? "равно" : "не равно";  // result будет равен true
       На Lua это эквивалентно 
      local result = ( (4 == 5 and "равно") or "не равно")   
      А если опустить все скобки, то 
     
    local result = 4 < 5 and "равно" or "не равно".   
     Скобки можно опустить, потому что "and" имеет выше приоритет чем "or."
     
    Или вот еще пример
    compactmenuitem.Caption = state and 'Compact View Mode' or 'Full View Mode'  
      Вот такая интересная штука для ускоренного сравнения вместо конструкции
      
      if условие then     -- код   else     -- код   end   
      Идем дальше. Полезной идиомой Lua является 
      
      x = x or v  
      что эквивалентно 
      
      if not х then       х = v    end   
      Т. е. x равен значению v, когда x ложное.
      
    Оператор "not" всегда возвращает true или false 
        print(not nil)      --> true     print(not false)    --> true     print(not 0)        --> false     print(not not nil)  --> false
     
  4. MasterGH
    Инфа по совместной работе с гитом. Может быть пригодится кому, а может и нет. Такую систему я использую на работе недавно.
     
    Можно совместно работать над одним большим проектом через git-flow. Возможно, кто-то из форумчан тоже использует git flow на работе.
     
     
    Кратко. Модель контроля версии построена на 4 ветках
     
    master - релизы
    develop - разработка
    feature - фичи
    hotfix - исравления
     
    С develop начинается разработка через копирования в ветку feature.
    Над фичей идет работа, а после завершения feature мержится с develop и feature сразу удаляется.
    После запланированных изменений develop мержится с master уходя в релиз.
    Если возникли баги, то от master создается ветвь на hotfix . После фиксов hotfix мержится с master.
     
    Доступ к мастер ветки может иметь один человек или его доверенные лица. Ветка Develop открыта для разработчиков. Это значит, что множество разработчиков колдуют в Develop ветке, а мержит изменения с master уже главный разработчик или несколько главных разработчиков.
     
    В мастере создаются теги с обозначением версии.
     
    Шпаргалка по git-flow: ссылка
    Семантическое версионирование : ссылка
  5. MasterGH
    UserData в Lua это пользовательский тип.  Точно не знаю, но я думаю  в документации в CE Lua (celua.txt или здесь на офф. сайте) тип userData у всех классов или большинства классов. Например,  проверим, что главная форма CE это userData тип
    local mainFormCE = getMainForm() print(type(mainFormCE)) > userdata (вывод из консоли) Выводим список свойств следующим образом через getmetatable функцию. Метатаблица — это  особая  таблица свойств Lua-переменной (подробнее здесь)
    local mainForm = getMainForm() local listUserData = createStringlist() for k,_ in pairs(getmetatable(mainForm)) do listUserData.add(k) end local allowCustomInput = false local id, name = showSelectionList("Title", "Caption", listUserData, allowCustomInput) print ('Index: '..id..", Name: "..name) listUserData.destroy()  
    Результат в виде списка свойство переменной mainForm
     
    Чтобы наглядно было. Свойства эти похожи на свойства из Дельфи. Можно загуглить, они поддробно описываются.
    Берем например свойство цвет. Прочитаем оригинальное и запишем свое любое
     
    local mainFormCE = getMainForm() print(mainFormCE.getColor()) > 536870912 -- в hex-е это 0x20000000. Можно перевести в калькуляторе или через print(string.format("%08X", 536870912)) Случайное свое впишем ради наглядного примера
    mainFormCE.setColor(546484)
     
     
  6. MasterGH
    Источник
     
    Как вступление. Мне нравится Lua, потому что в нем можно писать код в виде строковых данных (и Lua строки, и ассемблерные строки), а затем выполнять эти строки как код. В теории код может по фидбеку делать другой код в автоматическом режиме. Это на мой взгляд неисчерпаемые потенциальные возможности AI ограничивающиеся железом.
     
    В CE 6.7 функция autoAssemble вызываемая в Lua скриптах позволяет включать и теперь выключать скрипт со "своим" dealoc-ом.
     
    Пример.
     
    Функция активации и деактивации:
     
    enableInfiniteHealthCheat()
    disableInfiniteHealthCheat()
     
    // По стилю функции на Lua пишут с буквы в нижнем регистре. Вместо табуляции два пробела. Данные с большой буквы.
     
     
  7. MasterGH
    Планируется улучшать и дорабатывать плагины, показать как с ними работать.
     
    1. Вывод данных в окно логов: сканирование, подключение к процессу, опции сканирования, состояния активации и деактивации записией в таблице CE и другие 
    2. Запись действий из пункта 1, сохранение этих действий и воспроизведение по кнопке или горячим клавишам
    3. Показ в дизассемблере CE ветвлений кода при проходе потоками разными цветами (можно видеть код, который не был пройден в разных ситуациях)
    4. Дополнительное окно дизассемблера с опциями подсветки инструкций по типу в градации черно-белых цветов: математические инструкции, логические инструкции, инструкции ветвления, на чтение и запись. 
    5. Улучшение плагина "Dessect Data Scanner" с DBVM или на 4-HW брекйпоинта. В случае DBVM количество брейкпоинтов не ограничено и можно определить тип данных одновременно для каждого байта в структуре по смещениям, а в случае 4-х байтов это в режиме без DBVM одновременно задействуются все 4 hw брейкпоинта, а не 1 hw как сейчас.
     
    Extensions: 
  8. MasterGH
    Завтра состоится очень скромная премьера 27 июня в 19.00 (по Московскому времени) видео "Фильтр-свой" чужой. 
    Почему видео находится не на официальном канале? Какая цель у видео?
    Это личное любительское видео-хобби по отладке и изменению игрового кода — взлому игр. Я записываю видео для себя и для желающих.
    Приходите смотреть
     
     
    gta3.CT
  9. MasterGH
    Поиск по модулям
     

     
    Исходник
     
    Поместить ModuleListRegioScan.lua в autorun.
     
    Что интересно, Дарк Байт решил написать на Lua. Эта функция жестко в CE не впиливается. Можно выбирать, хочу это расширение поставить или нет. Посмотрел, если понравится, то оставил. Cheat Engine перекомплировать не нужно и не нужно в нем делать опции скрывать или показывать функционал.
     
    Источник
  10. MasterGH
    Как контролировать включение и выключение скриптов в таблице
     
    AA или "Autoassembler code" код похожий на язык программирования ассемблера.

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

       Попробовав разные варианты вы увидите, что нельзя включать или выключать галку в разных ситуациях. Например в этой получится включить галку, а выключить нет из-за ошибки.
     

       Следующий вариант проверяет открыт ли процесс. Если нет, то покажет сообщение.
     
    Как узнать, что процесс был закрыт после открытия

      process - зарезервированное переменная, показывает что процесс открыт

    В комментариях можно увидеть при каких условиях блокируются включение галки
     
     
  11. MasterGH
    1. WebSite-Watcher позволяет отслеживать изменения на веб-страницах в том числе по по регулярным выражениям. Можно отслеживать изменения на сайтах Cheat Engine и других. Форум отслеживать смысла особого нет. Проще подписаться на обновление и почтовый клиент поставить.
    2. Программы тестирования и автоматизации под разные ОС:
        Sikuli — открытая кросс-платформенная визуальная среда создания сценариев-скриптов
        AirTest IDE — почти как Sikuli и более того, китайские разработчики были вдохновлены Sikili и решили взять из него многое и использоваться  в QA тестировании. 
    3. Автоматический скрывать значков на рабочем столе AutoHideDesctopIcons
    4. LightShot - быстро делаем скриншоты и заметки к ним. Можно еще использовать SnagIt, он еще и видео может снимать
    5. f.lux — софтина регулирующее цветовую температуру компьютерного монитора
    6. VerseQ — лучший на мой взгляд клавиатурный тренажер. Есть плагины тренировки на языки программирования
    7. Scanner — показывает график в виде секторов о данных на жестком диске
    8. ProcessExplorer, ProcessMonitor, WinScanner, API Monitor... все по системе
    9. Возможно понравится XYplorer как замена или дополнение к файловому браузеру
    10. NotePad ++ и sublime_text - на мой взгляд хорошие редакторы текста, может быть даже одни из лучших
     
    Как-то раз нужно было поставить пробелы между китайскими иероглифами в гугл таблице (все для игры на Unity), чтобы в игре разрядить текст и он не был мелким. На notepad++ это выгладило так

  12. MasterGH
    Отличная книга по изучению паттернов проектирования. Ее можно читать со шпаргалкой по паттернам (иллюстрацию по паттернам можно загуглить).
    Перед этим еще загуглить SOLID + Unity .
    До кучи еще алгоритмы и структуры данных. 
    Все это  пригодится, чтобы пойти работать на программиста игр или приложений с разными типами реальности: дополненная, виртуальная и смешанная. А так же сейчас можно встретить вакансии по программированию не только Android, iOS устройств, шлемов и очков, но различных устройств и дронов.
    Об алгоритмах может быть позже напишу
  13. MasterGH
     
     
     
     
    Репозиторий
     
    1. На адрес устанавливается брейкпоинт.
    2. Идем в игру делаем или не делаем что-то
    3. Начинают срабатывать инструкции на брейкпоинте
    4. От каждой инструкции начинается трейслог, подобный тому, который есть у CE, но менее тормозной
    5. Заканчивается трейслог на инструкции, на 100-ом счетчике после ret-а (об этом пункте будет уточнение). Здесь выходим на коневой цикл
    6. Трейслог останавливается и ожидание следующей инструкции, которая сработает на брейкпоинте, она должна быть отличной
     
    В итоге мы имеем кучу трейслогов начинающихся с адреса работающего с параметром (например, кол-во патронов в обойме) и заканчивающихся на корневом цикле. Также мы собираем данные об адресах с рет-ами и счетчиками.
    По этим данным можно нарисовать схему, где ret-ы меняют направление пути прохождения потоком дизассемблерного кода
     
    На скриншотах ниже
    Вертикальные линии со кружками -— это ветвь трейслога
    Белый кружок — адрес ret-a, который не повторялся
    Пунктирный кружок — адрес ret-а, который повторялся. Стрелка от такого пунктирного круга будет указывать на белый круг.
     
    По схеме видим, где ret-ы меняют свое направление поднимаясь по рутине в корневом цикле
     
     
     
     
    По плану по визуальной части:
    1. Клик на кружок — переход на код
    2. Придумать что-то, чтобы стрелки не накладывались друг на друга
    3. Установка брейкпоинтов на кружках — становиться красными
    4. Легенда. Номер ветви, связанная инструкция, состояние брейкпоинтов. Комментарий к ветви
    5. Загрузка/сохранение легенды
     
    Для чего нужно. Для поиска условий, которые включают и выключают ветви кода. Т.е. чтобы можно было это условие быстро найти и изменив его, повторить выполнение кода ветви, которая "пробьётся" из корневого цикла. Таким образом попытаться повторить действие в игре, а если не получаться повторить, то определить дополнительные условия.
  14. MasterGH
    Решил попробовать написать CE Lua  скрипт, который прочесывает структуру и в Dissect data/structures окне создавал бы структуру только со смещениями, с которыми код работает, т.е. читает или пишет.
     
    Например, мой персонаж прогуливается по городу, а каждые 200 мс ставится брейкпоинт на смещение +1 до гипотетической N границы структуры (например до 4096).
     
    Я не успел сделать определение типа, но смещения внутри структуры получить я успел.
     
    Итак, находим начало структуры любой. Запускаем Lua скрипт и просто что-то делаем в игре. Потом вылазит текст с дизассемблированными инструкциями и смещениями. Уже по этим логам можно определить вручную
    1) к каким смещением было обращение (адреса по ним мы и будем менять или сравнивать структуры между собой позже)
    2) по виду инструкции и соседнему смещению уже примерно можно определить тип данных и их размер
     

     
    Осталось сделать определение типа, а это не так уж долго сделать  и осталось взять код из предыдущих записей в блоге формирования структуры в окне dessect data. Так мы получим структуру только с активными смещениями, (а зачем нам пассивные?) и определим в них тип, я надеюсь определим правильно
     
    Пример кода, который я использовал
     
  15. MasterGH
    1. Открываем trainme Dark Byte.
    2. Проходим первый шаг (там нужно сделать One Hit Kill чит через прогресс бар, количество патронов тоже интересно поломать)
    3. Так вот на Step2  ищем адрес здоровья нашего космического корабля.
    Ставим брейкпоинт на доступ, стреляем.
    Видим, три адреса и вот теперь новые функции в контекстном меню как на скриншоте

     
    На "(1)-(2)" - вызываем контекстное меню выделив адрес своего корабля и добавляем его в группу1. Тоже самое делаем для красных адресов кораблей противников
    На "(2)" вызываем опцию сканирования и видим "(3)"
    На (3) выбираем скан по RAX или по другим значениям. Например, когда по RAX не нашли ничего.
     
    Дальше видим окно и галку ставим "Only find matching groups" и сканим. Видим результат 

     
    Т.е. по +70 и другим смещениям можно сделать фильтр свой - чужой.
     В общем замечательный инструмент для работы со структурами с заданием уровня сканирования по оффестам
  16. MasterGH
    Пример1. Узнать во сколько раз string.match() медленее string.find()
     
    Пример2. Создание лишней локальной переменной
     
    Ответы: 1.38,  1.04.
     
    Если значение меньше единицы, то оптимизированный код хуже.
    Если значение больше единицы, то стоит использовать более оптимизированный вариант.
     
    Для простого поиска лучше использовать string.find чем string.match.
     
     
    Еще несколько примеров
     
    Для чего может пригодиться. Может пригодиться при оптимизации кода трассировке на брейкпоинтах в пошаговой отладке
  17. 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  
  18. MasterGH
    В общем хорошо взялся за регулярки на Lua!  Всё подряд прогоняю через них, что под руку попадется, любые задачи.
     
    Случайный пример задачи. Пронумеровать список
     
    Тут же написал
     
     
    И получил ответ. В следующий раз только вызывать "EnumerateText([[ текст со строками]])"
     
    Тут в буфер текст улетит и выведет в мессагу. После закрытия мессаги через CTRL+V вставит текст, куда хотим
    Пронумерованные функции — функции работы со строками последней версии Lua 5.3.x из документации
     
    На что стоит обратить внимание при регулярках:
    1. Работа с пробелами и не пробелами: "%s" и "%S"
    2. Работа с символами разделяющие строки и не разделяющими строки: "%с" и "%С"
    3. Захват строк "(.+)", "(.-)", "(.*)", а также без захвата, т.е. пропуск других символов ".+",".-",".*"
    4. Узнать как и какая функция из выше перечисленных работает, какая используется с регуляторами.
     
    Хотим к примеру вывести слово, которое закончится на пробеле (пишу просто "на пробеле" без учета других символов). Это уже "(%w+)", а если хотим второе слово, то это "%W+%w+" (не выводить первое и вывести второе слово) или "%s(%w+)" (после пробела, но чтобы было без пробела, то захватить в круглые скобки), или "^.+%s(%w+)"(начинать с первого символа до пробела и захват до конца слова).
     
    Если писать на CE Lua, то регулярки знать не обязательно. Но, их желательно знать, чтобы читать чужой код и писать свой. Да и вообще это интересно. Очень короткие выражения позволяют решить некоторую задачу за быстрое время. Основные задачи: поиск текста и замена текста.
  19. MasterGH

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

     
    Настройки

×
×
  • Создать...

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

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