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

MasterGH

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

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

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

    129

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

  1. MasterGH
    На видео показано рисование через поток и рисование без потока
    Когда происходит рисование без потока, то окно нельзя подвинуть, не работает кнопка и даже не возможно работать с Cheat Engine
     
     
     
     
     
    Код:
     
     
     
     
  2. MasterGH
    ИМХО отказываться от CE Lua скриптов из-за утечек памяти не стоит.
    Можно чистить память следующим образом
    function startCollectgarbageProcess(interval, showStatus) local timer1 = createTimer(true) timer1.Interval = interval timer1.onTimer = function () if (showStatus) then print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) end collectgarbage("restart") collectgarbage("collect") if (showStatus) then print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) end end end -- Собирать каждую 1 минуту и показать результат startCollectgarbageProcess(60000, true)  
  3. MasterGH
    Нажали checkbox — заполнились данные по базовому адресу

     
    Отжали checkbox — удалились данные

     
     
    Если проще руками забить и поставить опцию раскрытия, то можно и без скрипта.
  4. 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)
     
     
  5. MasterGH
    Где писать Lua код?
      Lua Engine окно, которое вызывается из главного окна CE.
      Lua Console окно, которое вызывается из окна отладки CE.
      Окно Autoassembler скрипта с вставки {$lua}, {$asm}

      Lua Engine окно и Autoassembler-ные скрипты могут сохраняться в файлах Cheat Engine *.CT. *.CETRAINER, *.EXE
      Lua Console для пошаговой отладки Lua кода и просмотров результатов ошибок и функции print()
     
    Моя первая программа
     
    Сначала узнаем версию для CE 6.7 и это будет первая программа
    Запускаем CE и жмем ctrl+alt+L и Lua Engine, вводим
    print(_VERSION) -->> Lua 5.3 Вторая программа
    showMessage('Hello World!') Следующий шаг — собрать справочные материалы и практические руководства.
    Неважно какими они будут по сложности и объему. Всегда можно будет обратиться к ним позже, когда потребуется что-то найти.
     
    Справочные материалы
    Если CE использует версию Lua 5.3, то нужен официальный справочник по этой версии.

    Ищем

    Я  обращаюсь к celua.txt и defines.lua. Находятся в директории Cheat Engine. В этих файлах краткое справочное руководство.
     
    Стоит также отметить, что Cheat Engine 6.7 написана на Lazarus. Написав, например программу по рисованию фигур, линий на форме на Lazarus или Delphi можно  будет понять, как сделать также классами и функциями на CE Lua. А что нельзя сделать CE Lua, то решается внедрением и исполнения кода в саму Cheat Engine.
     
    Продолжение следует...
     
    upd: добавил ссылку Category:Assembler
  6. MasterGH
    Как контролировать включение и выключение скриптов в таблице
     
    AA или "Autoassembler code" код похожий на язык программирования ассемблера.

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

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

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

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

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

     
    Сразу к делу. Нужен поинтер и процесс.
    Запустим туториал из Cheat Engine из меню Health->Cheat Engine Tutorial.
    Прохождение туториала подробно описано здесь
     
     
    Подключаемся к процессу идем на 8-мой шаг. В руководстве есть поинтер
    [[[["Tutorial-i386.exe"+XXXXXX]+C]+14]+0]+18  
    Вместо XXXXXX может быть любое смещение. Поэтому надо бы поискать
     
    Нашил адрес.
    Поставили бряк.
    Нашли esi
    Поставили бряк
     
    Вышли сюда
    Поинтер получили, дальше пойдет Lua.
     
    Открываем Lua консоль и проверяем поинтер
    Выведем адрес и его значение
    Окей. Поинтер верный.
     
    Другой вариант читать значение поинтера примерно такой
    local address = getAddress("game.exe") address = readPointer(address + 0x123) address = readPointer(address + 0x456) local value = readFloat(address + 0x789) Есть и такие варианты
    value = readInteger("[[[[[[[[[witcher3.exe + 028F3F60] +0] +18] +20] +40] +40] + 1c0] +10] +28]") value = readFloat("[[[[[[[[[witcher3.exe + 028F3F60] +0] +18] +20] +40] +40] + 1c0] +10] +28]") value = readDouble("[[[[[[[[[witcher3.exe + 028F3F60] +0] +18] +20] +40] +40] + 1c0] +10] +28]")  
    Теперь самое интересное — создание структур с помощью Lua
     
    Построим структуру [[[[005FD660]+C]+14]+0]+18. На +18 будет наш адрес.
     
    Сначала построим один уровень —"005FD660"
    Если выполнить скрипт выше, то мы построим структуру одного уровня.
     
    Построим теперь структуру двух уровней  "[005FD660]+C". Второй уровень нужно развернуть

    Для этого после создания структуры создам дочернюю
    myStructure2 = createStructure('MyStructure2') myStructure2.autoGuess('[005FD660]', 0, 50) -- И поместим её по индексу local offset = 0 myStructure.getElementByOffset(offset).setChildStruct(myStructure2) -- Чтобы развернуть список поитеров. К сожалению разворачивается только два уровня structureFrm.Menu.Items[1][6].doClick()   Итого получается такой скрипт до второго уровня
     

      Создадим и развернем весь указатель [[[[005FD660]+C]+14]+0]+18
      Не будем делать через цикл, чтобы не усложнять.

      Полный скрипт
     
    Результат

     
     Ну и на закуску.
     
    Допустим мы знаем что по адресу X будет всегда тип float (как X,Y,Z координаты). Но расструктуризация будет показывать другой тип, дизассемблер будет показывать другой тип — 4 байта. Что делать?
    И сразу еще допустим double тип всегда хотим как float тип (в виде комментов в дизассемблере или в расструктуризации)
     
    Воспользоваться следующей функцией
    -- Может менять тип адреса x в окне дизассемблере в комментариях, когда в инструкции существует адрес -- Может менять тип адреса в окне расструктуризации -- Изменив тип, будет ображаться значение другого типа onAutoGuess(function) : Registers an function to be called whenever autoguess is used to predict a variable type function override (address, ceguess): Return the variable type you want it to be. If no change, just return ceguess Ну и вот два примера
     
    upd: спрятал код под спойлеры
  8. MasterGH
    Решил попробовать написать CE Lua  скрипт, который прочесывает структуру и в Dissect data/structures окне создавал бы структуру только со смещениями, с которыми код работает, т.е. читает или пишет.
     
    Например, мой персонаж прогуливается по городу, а каждые 200 мс ставится брейкпоинт на смещение +1 до гипотетической N границы структуры (например до 4096).
     
    Я не успел сделать определение типа, но смещения внутри структуры получить я успел.
     
    Итак, находим начало структуры любой. Запускаем Lua скрипт и просто что-то делаем в игре. Потом вылазит текст с дизассемблированными инструкциями и смещениями. Уже по этим логам можно определить вручную
    1) к каким смещением было обращение (адреса по ним мы и будем менять или сравнивать структуры между собой позже)
    2) по виду инструкции и соседнему смещению уже примерно можно определить тип данных и их размер
     

     
    Осталось сделать определение типа, а это не так уж долго сделать  и осталось взять код из предыдущих записей в блоге формирования структуры в окне dessect data. Так мы получим структуру только с активными смещениями, (а зачем нам пассивные?) и определим в них тип, я надеюсь определим правильно
     
    Пример кода, который я использовал
     
  9. MasterGH
    Довольно интересная функция, мне понравилась. 
    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) --> Примеры выполнения: --> Index: 55, Name: ShowHint --> Index: 10, Name: Top После исполнения Lua скрипта вот такой диалог появится. Можно искать свойство через ввод текста

     
     
    Список строк (Stringlist Class) используют:
    createStringlist(): Strings  - постой список
    getAutoAttachList(): Strings  - список имен процессов для автоподключения
    getPropertyList(class) : Strings - список свойств
    getCommonModuleList(): Strings  - список пропускаемых при сканировании модулей
    getProcesslist(Strings) - список процессов
    getWindowlist(Strings) - список окон
    getThreadlist(Strings) - список потоков
    Database.Params: Strings  - свойство  базы данных SQL
    ListItem.SubItems: Strings - свойство подстрок в визуальном компоненте списка
    ComboBox.Items: Strings - комбобокс
    Memo.Lines: Strings  - мемо компонент
    RadioGroup.Items: Strings  - компонент RadioGroup
    ListBox.Items: Strings - компонент ListBox
    FileDialog.Files: Strings  -  выбранные файлы в диалоге
  10. MasterGH
    FINCSTP
     
     
    Похожа на FSTP, также вращает стек регистров FPU (я кстати не знал, увидел при тестах в CE), но только не перемещает значение по адресу.
     
    FSTP [здесь указывается адрес или регистр]
    FINCSTP
     
    Если нужно вытолкнуть значение из ST(0), а адрес куда его выталкивать не нужен, то можно сделать так
    FINCSTP
    Или аналог
    FSTP ST(0)
     
    При использовании стоит обратить внимание на флаги, возможно их состояние будет влиять на исполнение кода.
     
    *Вообще не помню почему я пишу "выталкивать значение" через fstp, когда оно появляется снизу в ST(8). Т.е. не выталкивается по сути.
  11. MasterGH
    Обновление плагина
     
    Установка с репозитория: ссылка
     

     
    Кратко
    1. Добавил сохранение/загрузку параметров. Хранение в текстовом файле в папке autoruns
    2. Добавил настройки графического интерфейса (слайдеры, пункт меню)
    Подбронее
     
    Слайдеров много, сам путаюсь в них, какие за что отвечают.
    С цветами экспериментировал не понравилось, пока оставляю градацию "черный-белый".
    Для тех кто видит в первые этот плагин.
     
    Плагин планируется развивать дальше, сейчас это черновой вариант
  12. MasterGH
    Нет времени, пока напишу заметки.
     
    1. Можно сделать плагин с визуализацией счетчиков обращений к видимым данным в MemoryView с подключенным DBVM.
    2. По аналогии в Dessect Data Scanner сделать выбор DBVM режима.
     
    DBVM позволяет обойти ограничение в 4 аппаратных брейкопинта и в реальном времени визуализировать данные, которые обращаются к памяти на чтение, запись. Показывать счетчик обращения и даже показывать спискок инструкций при наведении курсором на байт или иные данные в MemoryView. В случае c Dessect Data Scanner может ускорить расструктуризацию, а не по 1-ому брейкпоинту снимать показания X секунд пробегаясь по структуре.
     
    Кстати, кто-нибудь шарит в алгоритмах, структурах данных и паттернах проектирования? Если шарите, поделитесь в каких задачах применяли.
     
  13. MasterGH
    Была задача получить два списка из документа, в котором было с пару десятков тысяч строк. На практике выяснилось, что искать текст после ключевого слова легче чем искать текст до ключевого слова. Об этом и будет дальше
     
    В утилите, которую я делал "Lua Regular Expressions (v. 1.0)"

     
    Текст во вкладке "gmatch"
     
    Game1
    gameCompany
    DAU
    53.21k
    -20%
    Game2
    gameCompany
    DAU
    20.35k
    -20%
     
    Поиск элемента после строки
     
    "DAU "DAU%c%c(.-)%c%c""
     > 53.21k;20.35k;
     
    Поиск элемента до строки
    Вот такой паттерн со двигом скобок для поиска прыдыдущеей фразы
     
    "%c%c(.-)gameCompany%c%c"
     
    не прокатит для вывода списка игр над фразой gameCompany
      
     > ;53.21k
     > -20%
     > 
     > Game2
     > ;
     
    Очевидно, можно сделать поиск по похожим фрагментам, которые идут последовательно сверху вниз. 
     
    Для просты сначала добавим первую пустую строку и видим повторяющиеся фрагменты
     
    %c%cGame1%c%cgameCompany%c%c
     
    пишем шаблон ".*%c%c(.-)%c%cgameCompany%c%c" и опять мимо
     
     > Game1;53.21k
     > -20%
     > 
     > Game2;
     
    Потому что текст над Game2 пошел выше Game2. Тогда делаем захват, только первой фразы и дальше не идем
     
    "%c%c(%w-)%c%cgameCompany%c%c"
     > Game1;Game2;
     
    И тогда все ок.
     
    Но это еще не все. Осталась первая пустая строка, которую добавили, если её удалить, тогда
     
    "%c%c(%w-)%c%cgameCompany%c%c"
     > Game2;
     
     Не видит Game1.
     
     Значит мы можем  убрать %c%c,
     
     "(%w-)%c%cgameCompany
     > Game1;Game2;
     
    Дальше название игры может быть таким "My Game: my Game". Здесь и пробел и двоеточие. В таком случае текст уже будет
     
    My Game1: my Game
    gameCompany
    DAU
    53.21k
    -20%
    My Game2: my Game
    gameCompany
    DAU
    20.35k
    -20%
     
    Пробуем
    (%w-)%c%cgameCompany
    > Game;Game;
     
    Что не верно, т.к. захват одним (%w-)
     
    Мы должны в скобках развернуть фразу имени игры. В ней могут быть пробелы, числа, текст и двоеточие
     
    ([%w%s]-)%c%cgameCompany
    >  my Game; my Game;
     
    Затем

    ([:%w%s]-)%c%cgameCompany

    > My Game1: my Game;

    > My Game2: my Game;
     
    Затем
    %c?%c?([:%w%s]-)%c%cgameCompany

    > My Game1: my Game;
    > My Game2: my Game;
     
    Вот и все. Если  попариться один раз, то тексты уже парсить будет гораздо быстрее.
     
    Так я вывел столбы DAU и названий игр в таблицу, что было в районе 500 строк из пару десятков тысяч строк
     
    p.s. Текст в консоли Lua отличается %c%c, а %с
    p.s.p.s. Можно разсплитить текст по "/n/r" или "/n" в таблицу строк и по индексам данных находить предыдущую или последующую фразу. Но мне проще две строки ввести "%c?%c?([:%w%s]-)%c%cgameCompany" и "DAU%c%c(.-)%c%c"
  14. 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 секунд, то это вероятно корневой цикл, а если менее, то это вложенный цикл. На корневом цикле можно остановить трейслог. Об этом может быть потом напишу.
  15. MasterGH
    Пример1. Узнать во сколько раз string.match() медленее string.find()
     
    Пример2. Создание лишней локальной переменной
     
    Ответы: 1.38,  1.04.
     
    Если значение меньше единицы, то оптимизированный код хуже.
    Если значение больше единицы, то стоит использовать более оптимизированный вариант.
     
    Для простого поиска лучше использовать string.find чем string.match.
     
     
    Еще несколько примеров
     
    Для чего может пригодиться. Может пригодиться при оптимизации кода трассировке на брейкпоинтах в пошаговой отладке
  16. MasterGH

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

     
    Настройки

  17. MasterGH
    Долго не могу решить проблему
    Traceback (most recent call last): File "C:\air test\plugins\firebase\build.py", line 124, in run self.SIGNAL_INSERT_LOGVIEW.emit(_str.decode("GB2312").encode("utf-8")) UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 11-12: illegal multibyte sequence QObject::~QObject: Timers cannot be stopped from another thread Если кто шарит на питоне просьба помочь. Питон 2.7
     
    Основная строка
    self.SIGNAL_INSERT_LOGVIEW.emit(_str.decode("GB2312").encode("utf-8")) При билде апк в firebase через плагин в AirTest (QA-тестирование на Unity)
     
    Среда разработки от уважаемых китайских разработчиков Я думаю в связи с этим ошибки с кодировкой GB2312. Гуглил, искал... пока безтолку
     
     
    Исходники
    Билд
  18. MasterGH
    Вполне читерская программа Sikulix
     
    Помощник для нахождения отличий
     
    Исходник:
     
    Картинки для тренировки
     
    Игра
    Sikulix
    Документация
    Туториалы
     
    Sikulix умеет:
    ждать появления или исчезновения элемента, просто ждать, периодически просматривать область в background (например игрового чата); читать (и писать) текст в(/из) поля ввода, "нажимать на клавиатуру", подсвечивать области, кликать по элементам, удерживать и перетаскивать; перемещаться по окнам по названию процессов; сохранять скриншоты в том числе определенные области; показывать много разных диалогов: ввода, тултипов, сообщений; сравнивать изображения и находить отличные области (пример выше); поиск элементов по маске; поиск групп элементов и перебор их; создание гайдов или руководств  
    Из наиболее интересных применений:
    1) в играх где необходим поиск графических элементов с действиями (кликеры, поиск отличий или поиск/подсчет элементов, маджонги и другие);
    2) нажать на найденных элементы(кнопки, чек-боксы);
    3) найти текстовое значение, перевести в число, посчитать;
    4) ожидает выхода человека из скайпа (или что-то вроде мониторинга чатов);
     
    Ну и так далее...
  19. MasterGH
    Установка:
    1. Файл GHL_ClassSettings.lua закинуть в autorun (нужен для сохранения и загрузки данных формы)
    2. Двойной клик на Lua Regular expression.CETRAINER вызовет это окно
     
    Описание:
    - Для тренировки и проверки написания регулярных выражений
    - Выбор извлечения строк в виде одной или в виде последовательности
    - При нажатии на кнопку или при вводе текста в memo вычисляется выражение
    Lua Regular expression.CETRAINER
    GHL_ClassSettings.lua
×
×
  • Создать...

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

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