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

MasterGH

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

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

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

    129

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

  1. MasterGH
    За нейронными сетями и быстрыми вычислениями (например на тензорных ядрах видеокарт) 
     
    скорее всего,  огромное будущее и огромный спрос. Стартануть в эту тему можно,  изучив статью с хабра о принципах AlphaGo Zero и вот эту.  Основные моменты это рекуррентные сети, которые ищут в глубь и сверточные сети, которые чем-то похоже на хеш-сумму (на тензорных ядрах они-то и быстро считаются). 
     
    На данный момент по своей работе я активно развиваюсь в нескольких направлениях: в многопоточном программировании на CPU/GPU,  вычислительных шейдерах, сокетах. Если писать программы на одном CPU ядре, то все чаще этого не хватает по мощности как на ПК так и тем более на мобильных устройствах. Такое ощущение, что без многопоточного программирования скоро нельзя будет никуда устроиться работать. Сейчас  тенденция много ядер на CPU и их использовать. А еще лучше и быстрее что-то "тяжелое" отправить вычислять на GPU. Это не говоря по обработке графических данных. С ними очень эффективно работают программы на GPU. А чтобы системы соединялись между собой на расстояниях надо хорошо знать сокеты и многопоточное программирование. Основная фишка в многопоточности это спланировать множество задач из одной точки программы и в другой точке ждать, когда они все одновременно выполнятся. Некоторые, задачи при этом должны синхронизироваться только с основным потоком. Когда все задачи выполняться на разных ядрах CPU, то итоговый результат на каком-то одном ядре уже сделает все что требуется. Бонусом к ускорению на CPU ядрах служат специальные ассемблерные инструкции, которые например, позволяют обрабатывать больше данных за меньшее количество тактов.
     
    Интересующимся ссылки в основном по Unity игровом движке
     
  2. MasterGH
    Я задался вопросом, что такое pointermap. Вообще о нем не слышал и речь пойдет о нем. Я узнал о нём и прикинул, что возможно круто, а возможно и не круто иметь готовую цепочку указателей перед тем, как что-то делать в отладке. Цепочки можно раскрыть в окне структур и прикинуть, что там в них и "около" каких адресов будет происходить отладка. Во время отладки можно смотреть на окна структур. Может быть, а может быть и нет что-то интересное связать в отладке и с данными об указателях...
     
    На видео сравниваются два способа поиска указателей в Cheat Engine 6.7: классический и используя pointermap. Судя по видео последний  эффективнее по времени,  действиям и результатам поиска. Конкретно для этого случая с помощью pointermap сканирования нашлось несколько цепочек указателей.
     
    Можно предположить, что на других играх стоит попробовать этот способ. Способ с pointermap начинается со времени 9:21.
     
     
  3. MasterGH
    Ниже находится обучающий пример плагина для CE Lua с установкой компактного режима применяя парадигму ООП — инкапсуляции.
     
    Для программирования плагинов на Lua могут пригодится приемы ООП. Это касается сущностей, их поведений и взаимодействий между ними.  В данном примере CECompactView — описание класса на основе мета-таблицы и оно является сущностью. Функции класса — uncompact() и compact(), которые реализуют поведения этой сущности. Основной скрипт с описанием сущности можно поместить в отдельный файл .lua и далее можно кратко инициализировать сущность и управлять ей
     
    Например
     
    Сам класс или мета-таблица.
     
     
    Скрипт можно сохранить в Lua файл и добавить в папку autorun.
    Для интересующихся наследованием и полиморфизмом об этом есть в моем блоге (где-то в начале).
  4. MasterGH
    Пример раскрашивания адресов без каких-либо условий
    source
     
    1) Из прошлой записи блога нашли "MainForm.Foundlist3" для работы с TListView (компонент от Lazarus среды разработки)
    2) OnCustomDrawSubItem — функция обработчик раскрашивания вложенных элементов в Item. Не поленитесь, зайдите в файл документации (C:\Program Files\Cheat Engine 7.4\celua.txt)
    Также есть OnCustomDrawItem — раскрашивание невложенных элементов.
     
    Этот способ раскрашивания можно использовать по условиям. Чтобы связать условия с адресами и цветом смотри MemScan Class, FoundList class в celua.txt.
  5. MasterGH
    Скрипт позволит вывести иерархию компонентов CE в виде текста.
     
    Иерархия компонентов CE нужна для написания плагинов. 
    Например, для ColorPicker и для смены шрифта (подобротнее об этом было где-то было в блоге).
     
    Скрипт:
     
    Для CE 6.7
     
  6. MasterGH
    Уже была запись про тестирование производительности.
    В этом примере тестируем разное обращение к функции со средним арифметическим значением
     
     
    Результаты при 4-х запусках
    avg = 0.93333998758048 avg = 1.0322099291325 avg = 0.92657961891689 avg = 1.1883763135947  
    Вывод. Разница не существенная.
  7. MasterGH
    Немного комментариев к этой версии.
     
    1. Исправлены смещения
    2. Добавлены также инструкции на запись
     
    На скриноте ниже пример сравнения текущей структуры с координатами в СТАЛКЕРЕ Зов Припяти с копией структуры.
     
  8. MasterGH
    Пошаговая отладка в dnSpy позволяет ставить брейкпоинты на C# код во время работы игры, перемещаться по коду, просматривать значения переменных.
    Сэкономит кучу времени при поиске и отладке игрового кода,
     
    1. Страница загрузки dnSpy
    2. Скачиваем dnSpy и все архивы с mono.dll файлами
    Unity-debugging-4.x-win32.zip
    Unity-debugging-4.x-win64.zip
    Unity-debugging-win32.zip
    Unity-debugging-win64.zip
    3. Смотрим свойства exe файла игры и определяем по нему версию Unity. Например, "Версия продукта 5.5.0.3120186" или версия "файла 5.50.39994" может указывать на версию Unity 5.5.
    4. Определяем разрядность приложения через Process Explorer
    5. Т.к. версия Unity 5.5 и приложение 32 разрядное, то открываем Unity-debugging-win32.zip ищем там версию Unity и заменяем mono.dll в директории игры
    6. Запускаем игру и dnSpy x86 (игра 32 разрядная поэтому x86). Открываем файл "\...\Managed\Assembly-CSharp.dll" Запускаем отладку нажав F5 или кноgку Play
    7. Настраиваем соединение и жмем ок

    8. Ставим брейкпоинты, смотрим перемененные, перемещаемся по коду, пишем свой код и так далее
    9. После изменения кода, нужно перезаписать модуль предварительно сохранив его
     
    О других способах подключения пошаговой отладки есть на английском руководство.
    ----------------------
     
    Как работать в пошаговой отладке
     
    Работать можно почти также как и в Cheat Engine в пошаговой отладке или в среде разработки программ.
    Начать стоит с обзора названия пространств имен, названия классов, методов и полей, Названия могут подсказать логическую связь с читом, который хотим сделать.
    Стоит обратить внимание на такие названия как "IsPlayer, Player, Character, CharacterController, MainCharacter, Health, Inventory, Craft" и другие. Чтобы не искать вручную можно задействовать поиск сборкам. Поиск стандартного тега "Player" в виде в строки кода (в Unity выше версии 5.0) или свойства "IsPlayer" может помочь найти игрока или отличить от чужих.
     
    Важно представлять иерархию игровых объектов, которую мы не видим в dnSpy. Программист работая в Unity видит это окошко много лет и эту иерархию всегда представляет смотря на скрипты в dnSpy

    Скрипты наследники от MonoBehavior могут находиться на игровом объекте и могут работать как с ним так и с другими объектами. Получается такая штука, что игровой объект всегда имеет Transform компонент с полями позиций, углами и scale. Классы Transform и GameObject самые основные. Методами этих классов можно разместить объект в мире, создать или удалить его. В идеале удалив объект со сцены не должно быть никаких ошибок связанных с пустыми ссылками, потерей объекта. Также и клонировав объект, тоже не должно быть ошибок. Но не всегда так просто отспавнить игровой объект. Если это сделать методами UnityEngine, то другие классы ничего не будут знать о появлении игрового объекта. Нужно ставить брейкпоинт в функции Start или Awake в классе и трейсить по Shift+11 чтобы выйти на функцию разработчиков спавна этого GameObject. Функции Start или Awake (в классе наследника от MonoBehavior) срабатывают один раз при включении скрипта и инициализации. По ним можно выйти на строку кода, которая создает объекты в мире.
     
    Отдельно стоит сказать про количество скриптов. Практически в любой игре, которая мне попадалась в dnSpy много скриптов или очень много. Иногда и не будет понятных названий у типов (из-за обфускации). В любом случае при пошаговой отладке можно найти требующиеся участки кода для создания чита и использовать их по другой логике.
     
    Основные приемы
    В Update можно обновлять параметры только своего игрока. Например, в Character классе сделать сравнения в Update по IsPlayer свойству (если оно там есть) и у тебя за каждый кадр рендеринга будет максимум характеристик.
    В Update с классом Input можно считывать хоткеи.
    В Start и Awake можно подгружать свои ассеты с внутриигровым user interface. Код скриптов перед загрузкой ассетов должен быть внедрен через dnSpy
    Иерархию игровых объектов и инспектор, если очень нужно, то можно отрисовать в user interface. Обычно не требуется. (поищите по форуму в игрострое)
     
    В заключении
    Пока нет времени делать трейнер или таблицу на CE для включения опций в играх Unity. Для меня пока подходит способ через перезапись модуля в dnSpy вручную.
    Вместо трейнера можно сделать программу патчер, который будет проверять версию игры и перезаписывать модуль с возможностью вернуть оригинальный модуль
  9. 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
     
  10. MasterGH
    Спавн итемов удалось сделать через dnSpy.
    При клике на любой предмет на меню крафта он создается в инвентаре, а если там занято, то выкидывается на карту.
     
    Я переписал метод клика на рецепт, вот он оригинальный
     
    На этот
     
     
     
    Для спавна заменить Assembly-CSharp.dll из архива, сделав копию предварительно
    Assembly-CSharp.rar
  11. MasterGH
    Завтра состоится очень скромная премьера 27 июня в 19.00 (по Московскому времени) видео "Фильтр-свой" чужой. 
    Почему видео находится не на официальном канале? Какая цель у видео?
    Это личное любительское видео-хобби по отладке и изменению игрового кода — взлому игр. Я записываю видео для себя и для желающих.
    Приходите смотреть
     
     
    gta3.CT
  12. MasterGH
    Появилась такая опция асинхронного выполнения скриптов

     
    Если эту опцию поставить на скрипты, то появляются вот такие часики

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

     
    После выполнения

     
    Если продублировать 4 скрипта, то видим, что нельзя запустить асинхронно более двух скриптов

     
    Возможно, я Lua код где-то не правильно написал. Вот такой вариант еще делал
     
    Asynchronous testing.CT
  13. MasterGH
    Источник
     
    Как вступление. Мне нравится Lua, потому что в нем можно писать код в виде строковых данных (и Lua строки, и ассемблерные строки), а затем выполнять эти строки как код. В теории код может по фидбеку делать другой код в автоматическом режиме. Это на мой взгляд неисчерпаемые потенциальные возможности AI ограничивающиеся железом.
     
    В CE 6.7 функция autoAssemble вызываемая в Lua скриптах позволяет включать и теперь выключать скрипт со "своим" dealoc-ом.
     
    Пример.
     
    Функция активации и деактивации:
     
    enableInfiniteHealthCheat()
    disableInfiniteHealthCheat()
     
    // По стилю функции на Lua пишут с буквы в нижнем регистре. Вместо табуляции два пробела. Данные с большой буквы.
     
     
  14. MasterGH
    1. Открываем trainme Dark Byte.
    2. Проходим первый шаг (там нужно сделать One Hit Kill чит через прогресс бар, количество патронов тоже интересно поломать)
    3. Так вот на Step2  ищем адрес здоровья нашего космического корабля.
    Ставим брейкпоинт на доступ, стреляем.
    Видим, три адреса и вот теперь новые функции в контекстном меню как на скриншоте

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

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

     
     
     
    Пример скрипта
     
    Документация кому интересно
     
  16. MasterGH
    Я решил рассмотреть три новые функции:
     
    Пользовательские типы данных в hex-окне Фильтр на окне определения адресов Поиск данных в окне Tracer  
    1. Пользовательские тип данных в hex-окне
     
    Пример как сделать:
     
    Фильтр на окне определения адресов
     
     
    3. Поиск данных в окне Tracer

     
    Обычный поиск, как на прошлых скринах
     
    Примеры
     
    Ну и более интересная версия перебора и одновременного выделения записей.
     Здесь нужно открыть окно "Трейсера" и рядом в Lua окне писать свои условия в функции "Compare()", "PrintData()", Selected()
     

     
    Документация
     
    Для вывода referencedBytes из трейслога можно использовать byteTableToDword(referencedBytes) (смотрим документации выше) получая из TfrmTracer.Entry[index].referencedBytes или в строке поиска у Трейслога вбить 
    byteTableToDword(referencedBytes) > 0 and print(string.format("0x%08X - 0x%08X", RIP, byteTableToDword(referencedBytes))) == 1  
    Практическое применение
     
    Больше всего могут интересовать реальные практические примеры. Если будет время, желание может быть сделаю, а так просто общий обзор.
  17. MasterGH
    Напишем функцию, которая в 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 очищает пробелы, а выражение '^(.-)%-(.-)%-(.-)$' позволит захватить данные между тире в строке.
     
    Может пригодится, когда трейсим своим Lua кодом.
    Если заинтересовали регулярки: ссылка
  18. MasterGH
    В таблице поиска есть колонки ссылающиеся на название Lua перменных: "value" и "previousvalue"

     
    А что можно делать?
     
    Сравнивать текущее и предыдущие значения вместе или по отдельности, в том числе на разных вкладках CE

     
    Примеры:
    value == 65 value == 0x65 (или поставить галку hex) value ~= 65 (или поставить галку not) Можно и такое  сравнение сделать после поиска неизвестного используя математические функции:
    math.abs(value - previousvalue) < 10 Можно делать различные комбинации: 
    and (логическое И). or (логическое ИЛИ). not (логическое НЕ). + (сложение); - (вычитание); * (умножение); / (деление); ^ (возведение в степень); % (остаток от деления). == (равно); ~= (не равно); < (меньше); > (больше); <= (меньше или равно); >= (больше или равно).  
    Что на счет xor? Можно написать функцию xor
     
    Пишем глобальную функцию сначала:
    function BitXOR(a,b)--Bitwise xor local p,c=1,0 while a>0 and b>0 do local ra,rb=a%2,b%2 if ra~=rb then c=c+p end a,b,p=(a-ra)/2,(b-rb)/2,p*2 end if a<b then a=b end while a>0 do local ra=a%2 if ra>0 then c=c+p end a,p=(a-ra)/2,p*2 end return c end А потом применяем даже отдельные функции  как в этом примере
    "value > 0 and BitXOR(value, 100) "
     
    А может быть я хочу только 100 первых результатов
     
     
    CheckCount100() and value > 0 and BitXOR(value, 50)  

     
    Также хочу добавить те адреса, которые предположительно являются указателями
    getAddressSafe('['..value..']')~=nil
     
    Или наоборот не являются указателями
    getAddressSafe('['..value..']')==nil
     
    Еще можно попробовать добавить 50 красных и  50 синих указателей в таблицу CE, но это уже задание кому интересно.
     
    Можно в теории сравнивать адреса со значениями известных адресов и даже с известными указателями, с метками. Но поиск может затянуться, если адресов очень много.
     
    Можно попробовать указать условие, что значение адреса должно находиться в X структуре или в её вероятных указателях.
    Или попробовать оставить только одинаковые значения адресов, т.е. повторяющихся более 1 раза.
    Или попробовать искать только те адреса,  к которым применимы сразу несколько условий чтобы не кликать их постоянно:
    (изменилось) И (больше 0) И (меньше 10000)
    (не изменилось) И (больше 0) И (меньше 10000)
  19. MasterGH
    Чтобы получить цвет из компонента нужно найти его на форме CE через Lazarus. Этот компонент нельзя найти визуально, он скрыт.
    Узнал об этом случайно, когда зашел на форум Cheat Engine в тему расширений на Lua. Теперь в дизассемблере можно будет быстренько цвета менять

  20. MasterGH
    Поиск по модулям
     

     
    Исходник
     
    Поместить ModuleListRegioScan.lua в autorun.
     
    Что интересно, Дарк Байт решил написать на Lua. Эта функция жестко в CE не впиливается. Можно выбирать, хочу это расширение поставить или нет. Посмотрел, если понравится, то оставил. Cheat Engine перекомплировать не нужно и не нужно в нем делать опции скрывать или показывать функционал.
     
    Источник
  21. MasterGH
    Особенности
    1) переход на следующий адрес по инструкциям ветвления вычисляется Lua кодом по ret, jmp, jmp condition до исполнения кода
    2) определение опкодов ветвления по readmem без дизассемблериования
    3) по тестам последний брейкпоинт снимается на ближайшем цикле
     
    Пример лога до близжайшего цикла, когда поднимается из рутины вверх
     
    Код:
     
    Справка
     
    Если трейсить трейслогом 1000 инструкций поверх call, то видим многократное повторение пути внутри цикла между 00437A34 и 0044DFAF.
     
    С помощью скрипта можно выйти на цикл не используя трейслог
    Можно использоваться функции определения куда прыгнет поток, до его выполнения.
    Можно оперировать таблицей адресов с брейкпоинтами в пошаговой отладке.
  22. MasterGH
    Игра с рандомом. Есть счет.
    Запускается через таблицу в аттаче.
     
    Здесь мог быть AI на Lua, возвращающий номер клетки от 1 до 9.
    function InputAI() -- рандом return math.random (1, 9) end Извиняюсь, лучше рандома пока не могу предложить.
     
     
    Крестики и нолики.CT
  23. MasterGH
    Функция 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 Если по обратной связи строить и исполнять строку кода, то предположительно можно генерировать код другим кодом и учитывать гораздо больше условий, чем это может сделать человек.
    Пригодится для ИИ отладки и для ИИ бота.
     
    Код пишет другой код по обратной связи. Реальность? Возможно
×
×
  • Создать...

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

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