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

MasterGH

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

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

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

    129

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

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

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

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

     
    Сколько я не пользовался CE я никогда не знал об этом отладчике. Когда я случайно узнал, то был приятно удивлен.
    Если мы пишем какую-то функцию и она дает сбой, то её можно отладить как на скриншоте. Это может быть и не функция.
    Например, код прочитал какой-то файл с текстом сохраненных параметров и подсмотрели в пошаговой Lua отладке что происходит дальше.
     
    *Действуют горячие клавиши. Например, F7— шаг, F9 — запуск без остановки.
  3. MasterGH
    FINCSTP
     
     
    Похожа на FSTP, также вращает стек регистров FPU (я кстати не знал, увидел при тестах в CE), но только не перемещает значение по адресу.
     
    FSTP [здесь указывается адрес или регистр]
    FINCSTP
     
    Если нужно вытолкнуть значение из ST(0), а адрес куда его выталкивать не нужен, то можно сделать так
    FINCSTP
    Или аналог
    FSTP ST(0)
     
    При использовании стоит обратить внимание на флаги, возможно их состояние будет влиять на исполнение кода.
     
    *Вообще не помню почему я пишу "выталкивать значение" через fstp, когда оно появляется снизу в ST(8). Т.е. не выталкивается по сути.
  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
    Решил попробовать написать CE Lua  скрипт, который прочесывает структуру и в Dissect data/structures окне создавал бы структуру только со смещениями, с которыми код работает, т.е. читает или пишет.
     
    Например, мой персонаж прогуливается по городу, а каждые 200 мс ставится брейкпоинт на смещение +1 до гипотетической N границы структуры (например до 4096).
     
    Я не успел сделать определение типа, но смещения внутри структуры получить я успел.
     
    Итак, находим начало структуры любой. Запускаем Lua скрипт и просто что-то делаем в игре. Потом вылазит текст с дизассемблированными инструкциями и смещениями. Уже по этим логам можно определить вручную
    1) к каким смещением было обращение (адреса по ним мы и будем менять или сравнивать структуры между собой позже)
    2) по виду инструкции и соседнему смещению уже примерно можно определить тип данных и их размер
     

     
    Осталось сделать определение типа, а это не так уж долго сделать  и осталось взять код из предыдущих записей в блоге формирования структуры в окне dessect data. Так мы получим структуру только с активными смещениями, (а зачем нам пассивные?) и определим в них тип, я надеюсь определим правильно
     
    Пример кода, который я использовал
     
  6. 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)
     
     
  7. MasterGH
    Отличная книга по изучению паттернов проектирования. Ее можно читать со шпаргалкой по паттернам (иллюстрацию по паттернам можно загуглить).
    Перед этим еще загуглить SOLID + Unity .
    До кучи еще алгоритмы и структуры данных. 
    Все это  пригодится, чтобы пойти работать на программиста игр или приложений с разными типами реальности: дополненная, виртуальная и смешанная. А так же сейчас можно встретить вакансии по программированию не только Android, iOS устройств, шлемов и очков, но различных устройств и дронов.
    Об алгоритмах может быть позже напишу
  8. 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)
  9. MasterGH
    В игровом движке может быть следующая архитектура
     
    Менеджер сцен
        Список сцен
            Сцена1
              Менеджер игровых объектов
                Список игровых объектов
                    Игровой объект1
                    Игровой объект2
                    Игровой объект3
            Сцена2
              Менеджер игровых объектов
                Список игровых объектов
                    Игровой объект1
                    Игровой объект2
                    Игровой объект3
            Сцена3
              Менеджер игровых объектов
                Список игровых объектов
                    Игровой объект1
                    Игровой объект2
                    Игровой объект3
            
    Сцены могут подгружаться по одной или несколько сразу и выгружаться.
    Каждый игровой объект содержит менеджер поведений
     
    Игровой объект
        Менеджер проведений
            Список игровых проведений
                Поведение1
                Поведение2
                Поведение3

    Поведения есть стандартные от игрового движка и есть пользовательские, которые пишут программисты.
    Стандартное поведение Transform нахождение в пространстве может быть установлено по умолчанию у всех игровых объектов.
    Поведение Transform хранит позицию, углы, масштаб, а также методы перемещения, вращения и другие.
     
    Если представить себе иерархичную древовидную структуру, то именно по ней игровые объекты могут находиться друг в друге. Как папки файлового браузера. Transform позволит узнать является ли игровой объект родителем, дочерним по отношению к другому игровому объекту.
     
    Система событий позволяет отправить событие по иерархии вглубь, из глубины или конкретному игровому объекту. Поведения могут содержать функции, которые принимают событие и реагируют на него. Например, я отправил игровому объекту событие "по иерархии вглубь" о том, что в такой-то точке есть сигнал бедствия. Поведения, которые приняли это событие могут обработать его и направить ботов "спасателей" в эту точку.
    Поведения содержат функции игрового движка. Некоторые из них могут быть как: Update(), Start(), Enable(), Disable(), FixedUpdate()
     
    Update - срабатывает перед кадром отрисовкой. Time.DeltaTime дельта времени между кадрами
    FixedUpdate - также как и Update(), только это перед "кадром физики".
    Start(), OnEnable(), OnDisable() - первый запуск, включение и выключение поведения.
     
    Игровые объекты могут содержать строковый тег и номер слоя. Игровые объекты по слоям могут быть видны камере, могут взаимодействовать по физике. Слоем может быть номер или битовая маска.
  10. 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 Если по обратной связи строить и исполнять строку кода, то предположительно можно генерировать код другим кодом и учитывать гораздо больше условий, чем это может сделать человек.
    Пригодится для ИИ отладки и для ИИ бота.
     
    Код пишет другой код по обратной связи. Реальность? Возможно
  11. MasterGH
    Обновление плагина
     
    Установка с репозитория: ссылка
     

     
    Кратко
    1. Добавил сохранение/загрузку параметров. Хранение в текстовом файле в папке autoruns
    2. Добавил настройки графического интерфейса (слайдеры, пункт меню)
    Подбронее
     
    Слайдеров много, сам путаюсь в них, какие за что отвечают.
    С цветами экспериментировал не понравилось, пока оставляю градацию "черный-белый".
    Для тех кто видит в первые этот плагин.
     
    Плагин планируется развивать дальше, сейчас это черновой вариант
  12. MasterGH
    Опубликованная в веб формате книга на официальном сайте.
    Язык английский
     
    Перейти
     
    Оглавление книги
     
    Книга о приемах программирования больших проектов, в которых огромное количество строк кода. Основная проблема, когда ты уже что-то написал и надо добавить в уже существующий проект внушительный функционал или же наборот его поменять, или убрать. Хватаешься за галову и думаешь, что проще написать проект заного. Автор из числа тех программистов, которые оставляют свой опыт и знания (есть донат). Порой бывает информация более полезной в блогах чем где-либо, редко бывает в виде книг.
     
    Про автора книги знаю очень мало, кому надо можете погуглить.
  13. MasterGH
    В этой записи блога не будет чего-то, что показало бы "вау, это что-то новое и есть результат". Все сырое и результат пока мне только снится — быстрый поиск условий и включение, и выключение ветвей по этим условиям. Мыслю я не инструкциями, не группой инструкций, а ветвлениями кода и условиями, которые их запускают. Проще 20 ветвлений по 5 окон, чем тонна инструкций... Жаль пока теория, практики с результатом нет.
     
    Рисунок. На нем слева прототип, справа текущий сырой вариант
     
    1) ставим брейкпоинт на адрес патронов
    2) от него расплетаются ветви кода от каждого хита, от каждой инструкции, и по ретам ветвление выходит из рутины
     
    Кружи означают ret-ы. Клик на круг будет переходлм в дизассемблер
    Стрелки будут показывать входы и выход связанные с соседними рутинами (поиск общих адресов будет стрелками)
     

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

     
    Как видно, довольно все еще сырое, но видно, что все 20 ветвлений по ретам сформировались до корневого цикла.
     
    Потом можно будет, я надеюсь, увидеть связи между этим ветвлениями, когда я прикручу стрелки. По кружкам кликать и переходить в дизассемблер и смотреть условия выше. На условии искать другие адреса, которое запускает ветвь кода. На адресах опять делать ветвления (новое окно с ветвлениями о ретам)... На практике будет получаться более двух таких окон (для патронов). Нужно будет искать адреса связанные с условиями в новом окне.
     
     
  14. MasterGH
    На видео показано рисование через поток и рисование без потока
    Когда происходит рисование без потока, то окно нельзя подвинуть, не работает кнопка и даже не возможно работать с Cheat Engine
     
     
     
     
     
    Код:
     
     
     
     
  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
    В архиве два файла. Функции
    1. Контекстное меню. Компактное/ не компактное окно CE
    2. Сохранение и загрузка положения и размера формы CE
    3. Сохранение и загрузка компактного состояния формы или не компактного
     
    Сделано на энтузиазме после написания класса сохранения и загрузки параметров.
    После запуска, CE будет там, где её (CE) закрыли с позицией, размерами и с состоянием "Компактны режим", если последний был включен.
     
    Параметры сохраняются на жесткий диск в файл "..\autorun\userdata.txt"
    CompactView.rar
  17. MasterGH

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

     
    Настройки

  18. 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  
  19. 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
  20. 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+" означает искать слово пока оно не закончится
     
    А здесь заполняем таблицу ключ — значение из строки, которую можно было бы взять из файла
     
    Пока на этом все... Более сложные примеры в предыдущей части записи
  21. MasterGH
    Особенности
    1) переход на следующий адрес по инструкциям ветвления вычисляется Lua кодом по ret, jmp, jmp condition до исполнения кода
    2) определение опкодов ветвления по readmem без дизассемблериования
    3) по тестам последний брейкпоинт снимается на ближайшем цикле
     
    Пример лога до близжайшего цикла, когда поднимается из рутины вверх
     
    Код:
     
    Справка
     
    Если трейсить трейслогом 1000 инструкций поверх call, то видим многократное повторение пути внутри цикла между 00437A34 и 0044DFAF.
     
    С помощью скрипта можно выйти на цикл не используя трейслог
    Можно использоваться функции определения куда прыгнет поток, до его выполнения.
    Можно оперировать таблицей адресов с брейкпоинтами в пошаговой отладке.
  22. 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 секунд, то это вероятно корневой цикл, а если менее, то это вложенный цикл. На корневом цикле можно остановить трейслог. Об этом может быть потом напишу.
×
×
  • Создать...

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

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