• Structure hunter (beta)

    Прикреплена
    16
    0 Голоса
    16 Сообщения
    3k Просмотры
    MasterGHM
    Вот детальный анализ недочетов текущего подхода, направления для улучшений и инновационные способы интеграции ИИ: --- 1. Что не учли в текущей реализации 1.1 Динамическое изменение структур - Проблема: Игры с procedural generation (например, Starfield) могут менять расположение полей во время выполнения. - Решение: Добавить мониторинг паттернов доступа: function TrackStructureChanges(baseAddr) while true do local newLayout = AnalyzeStructure(baseAddr) CompareLayouts(lastLayout, newLayout) -- Алерт при изменениях sleep(1000) end end 1.2 Мультиплатформенная поддержка - Упущение: Нет оптимизации под ARM (Android/iOS) и консоли (PS5/Xbox). - Исправление: Добавить детектор ABI: function GetPlatformType() if readMemory(0x10000, 4) == 0x7F454C46 then return "ELF" -- Android/Linux elseif readString(0, 4) == "XBOX" then return "XBOX" end end 1.3 Обработка сетевых структур - Пробел: Не анализируются пакеты сетевого протокола, хотя они часто дублируют игровые структуры. - Доработка: Интеграция сниффера пакетов: function HookNetworkPackets() -- Фильтрация пакетов, содержащих координаты игроков PacketSniffer.filter("PlayerPosition", "xx xx ?? ?? xx FF") end --- 2. Ключевые направления для улучшений 2.1 Гибридный статико-динамический анализ - Идея: Комбинировать результаты CE с Ghidra: graph LR CE[Динамический анализ в CE] -->|Экспорт| Ghidra Ghidra[Статический анализ] -->|Импорт паттернов| CE 2.2 Система предсказания смещений - Метод: Использовать статистику обращений для предсказания важных полей: function PredictImportantOffsets() local stats = CollectAccessStats() return { health = stats.mostAccessed[1].offset, ammo = stats.mostWritten[3].offset } end 2.3 Визуализация в 3D - Инновация: Отображение структур как графа в 3D-пространстве (используя Cheat Engine's OpenGL): function Draw3DStructureGraph() for addr, links in pairs(graph) do RenderNode(addr, links, GetStructureColor(addr)) end end --- 3. Интеграция ИИ: конкретные применения 3.1 Классификация типов данных через ML - Подход: Нейросеть анализирует паттерны памяти: # Образец модели PyTorch class TypeClassifier(nn.Module): def forward(self, x): # x: [значения памяти, контекст инструкций] return torch.softmax(self.layers(x), dim=1) # Вероятности типов - Использование в Lua: function AIDetectType(address) local tensor = MemoryToTensor(address, 64) local result = ExecutePyScript("model.predict", tensor) return {"float", "int", "pointer"}[result] end 3.2 Генерация эксплойтов через ИИ - Пример: Автоматический поиск уязвимостей: function FindVulnerabilities() local patterns = AI_GenerateCrashPatterns() for _, pattern in ipairs(patterns) do if TryCorruptMemory(pattern) then LogExploit(pattern) end end end 3.3 NLP для анализа игрового кода - Применение: Автоматическое комментирование структур: function GenerateComments() local code = Disassemble(0x123456, 50) local comment = AI_AnalyzeCode(code) SetComment(0x123456, comment) -- Например: "Рендеринг частиц, цикл из 12 итераций" end --- 4. Практические примеры улучшений 4.1 Для читеров - Авто-определение уязвимостей: -- ИИ ищет паттерны для телепортации local teleportCheat = AI_FindMemoryPattern({ "float x,y,z", "write frequency > 1Hz", "range -1000..1000" }) 4.2 Для моддеров - Генерация SDK для модов: GenerateModSDK({ structures = analyzed_graph, hooks = FindCodeHooks(), api = AI_GenerateAPI() }) 4.3 Для разработчиков - Детектор багов: -- ИИ находит некорректные указатели local bugReports = AI_ScanFor( "dangling pointers", memory_ranges, expected_patterns ) --- 5. Что еще можно улучшить? 5.1 Оптимизация Проблема Решение Медленный поиск Кэширование + параллельные потоки Ложные срабатывания Ансамбли ИИ-моделей 5.2 Безопасность function AntiAntiCheat() -- Маскировка брейкпоинтов под легитимные вызовы HideDebugger({ stealth_mode = "SYSTEM_CALL", fake_patterns = GetNormalTrafficSamples() }) end 5.3 Пользовательский опыт \-- Голосовое управление читами RegisterVoiceCommand("дай бессмертие", function() SetGodMode(true) end) --- Итог: дорожная карта улучшений Срочные доработки (1-2 недели): Динамический трекинг структур ARM/консольная поддержка Среднесрочные (1-3 месяца): Интеграция ИИ для классификации 3D-визуализация Долгосрочные (6+ месяцев): Полный AI-ассистент для реверса Генерация читов через NLP Пример коммита для начала работ: \+ function AI_Integration() { \+ // Добавляем вызов Python ML-модели \+ local result = ExecutePython("predict_type.py", memoryDump) \+ } Готов реализовать любое из этих улучшений в вашем форке. Какое направление наиболее приоритетно?
  • CE Dissect Data Scaner 1.0.2 (4 hardware breakpoints)

    6
    2
    0 Голоса
    6 Сообщения
    472 Просмотры
    MasterGHM
    Сегодя или завтра еще выложу исходники на другой аналогичный плагин (не новый). Там breakpoint на область памяти (на структуру). Но это все старые иходники. Видео по нему у меня есть на yutube канале. Если, кто захочет усовершенствовать плагины, то, наверно, я могу создать отдельную ветку репозитория и кто-то сможет коммитить туда изменения. Аналогично используя форум и репозиторий возможна совместная разработка таблиц и исходников на CE для плагинов и для игр. Просто нужно чтобы, кто-то инициировал. Если, кто сможет организовать это все, то смогу дать необходимые права. Временм у меня к сожалению, не много. Но если что-то подсказать, то буду связи.
  • CE Plugin: AA Maker 2.4.2

    Перенесена
    7
    2
    1 Голоса
    7 Сообщения
    519 Просмотры
    PitronicP
    Хотя можно добавить в это окно как на скриншоте я стрелкой показал. одновременно и имя в таблице и имя скрипта в асм.
  • CE Action Logger 1.0 Beta

    4
    1
    0 Голоса
    4 Сообщения
    246 Просмотры
    MasterGHM
    Отправил
  • CE Stack Viewer

    1
    1
    0 Голоса
    1 Сообщения
    75 Просмотры
    MasterGHM
    Информация о файле Назначение Плагин позволяет в реальном режиме игры наблюдать за стеком на определенной инструкции отладочного кода. Это в свою очередь позволяет в окне расструктуризации данных "Dessect Data Structure" сравнивать старые и текущие структуры стека в реальном режиме игры, наблюдать за появлением красных данных и обращать на них особое внимание. Красные данные показывают чем отличаются стеки при действиях в игре. Например, выстрелив один раз и выстрелив следующий раз можно увидеть отличия красным цветом в стеке в реальном режиме. Это могут быть не только изменения патронов, но и чего-то другого, когда уже стреляем другим оружием. Важно то, что можно видеть изменения в реальном времени, а не по копиям стека, которые приходилось раньше снимать много раз. Мы можем видеть как часто по времени что-то меняется, все в динамике... Есть у меня сомнения по поводу постоянного ESP сравнения, при котором происходит "наблюдение" за стеком, но пока оставлю как есть. Установка Распаковать файлы архива в директорию "autorun". Например, C:\Program Files (x86)\Cheat Engine 6.4\autorun Краткое руководство Запускаем игру Находим адрес параметра Ставим брейкпоинт на адрес и появляются инструкции (или что-то делаем в игре чтобы инструкции появились) Выделяем инструкцию, которую требуется исследовать Останавливаем отладку Открываем Stack Viewer из окна Дизассемблер-> Tools->* Stack Viewer [Plugin] и переносим в ESP, EIP (или RSP, RIP) в поля окна Stack Viewer. Нажимаем галку "Is Active" и идем в игру, и если надо что-то делаем в игре, потому что инструкция должна выполниться хотя бы один раз чтобы заполнить дамп стека в реальном времени Открываем окно расструктуризации и пишем метку "MemStackRunTime" (или другую) и делаем расструктуризацию. Открывает плагин Tiny Dumper и клонируем "MemStackRunTime" в другую метку "StackDump1" (или другую). Теперь у нас в окне две структуры: с разовой копией и постоянно обновляющейся копией стека. Идем в игру и повторно делаем какие-то действия при этом наблюдаем за окном расструктуризации. Если в окне красные данные не появились, то следует проскролить структуру ниже. Если красные данные появились, то можно повторить действия в игре и пронаблюдать в реальном режиме закономерность изменения красных данных и частоту их изменения. Возможно найдутся интересные зависимости связанные с каким-то действием в игре. Если красных данных не нашлось, то никаких изменений в стеке не было. Попробуйте сделать что-то другое. Для остановки наблюдения за стеком выключаем галку "Is Active"
  • CE Tiny Dumper

    Перенесена
    2
    1
    0 Голоса
    2 Сообщения
    113 Просмотры
    MasterGHM
    Пошаговое руководство по Tiny Dumper В этом руководстве по шагам описано как снять дамп со стека и раструктуризовать его. Если лень читать, то предлагаю посмотреть хотя бы последний скрин. Там можно увидеть результат. Это самый важный скрин. Перед запуском CE устанавливаем файлы плагина в папку autorun (frmTinyDumper.xml и TinyDumper.lua) Запускаем игру например "Painkiller - Battle out of Hell 1.64" поставленная в оконный режим через 3DAnalyze. Оконный режим ставить обязательно, т.к. будет пошаговая отладка. В противном случае игра зависнет, а с CE рабтать нельзя будет Запустить CE с установленным плагином и подключиться к игре Ищем адрес здоровья (или брони, или патронов), тип Double (8 байт) 0x24571EA8 = 99.2900238037109 Ставим бряк на доступ или на запись на адрес 0x24571EA8 Идем в игру и встаем под удар персонажем Появляются инструкции и там же нажимаем на кнопку Stop, чтобы бряки не мешались в окне бряков Берем например инструкцию 1015C194 - 89 53 08 - mov [ebx+08],edx По ней идем в дизассемблер и на инструкции жмем F5 - установка бряка на доступ Открываем окно бряков, выделяем инструкцию и пишем условие на прерывание с остановкой процесса EBX==0x24571EA0 (это условие взяли, потому что ebx находится в инструкции, а значение взяли EBX из отладчика) Нажимаем Ок, идем в игру 9. Видим, что произошла остановка игры 10. Открываем окно ТиниДампера Пишем значение регистра esp и название будущей зарегенной метки Нажимаем "Dump and Close" и CTRL+U чтобы видеть под рукой зареганные ваши метки Открываем окно расструктуризации CTRL+D и пишем метку в свободное поле Далее следуем действия как на рисунках Наконец результат Не только сохраняются данные, которые пропадут на следующий такт процессора, но и расструктуризовали и можем сравнивать эти данные с другими дампами стека. Зачем, как и для чего это выходит за рамки этого руководства. Сейчас процесс игры остановлен на бряке кода. Чтобы продолжить игру. Удаляем бряк из окна бряков и отпускаем игру по F9. Теперь снимаем другие дампы на том же адресе для адресов здоровья врагов на предмет отличиях их или для поиска указателей... Во всяком случае сохраненный дамп может дать какие-то подсказки и зацепки. Главное не начать новый уровень игры или не загружать сохранения, т.к. обычно при переходе на новый уровень данные могут измениться... На этом пока все ----- Tiny dumper 1.2 Сравнение структур после перезагрузки. Поиск фильтра свой-чужой-дружественый Запускаем игру, запускаем CE и присоединяем процесс игры к CE Сохраняем игровой слот перед тем как искать структуры Находим три структуры игроков: свой игрок, дружественный, враг Дампим три структуры из пункта 3 указывая: базовый адрес структуры, уникальную метку Игру закрываем, снова открываем, загружаем слот, присоединяем процесс игры к CE В Tiny dumper 1.2 вызываем контекстное меню правой кнопки мышки и вызываем опцию "Rewrite dumps" - дампы из кеша перезаписываются в память в процесса игры Снова находим три структуры игроков: свой игрой, дружественный, враг В окне расструктуризации создаем три группы Группа1 "Свой игрок": -адрес после перезагрузки -метка из тини дампера своего игрока до перезагрузки Группа2 "Чужой игрок": -адрес после перезагрузки -метка из тини дампера чужого игрока до перезагрузки Группа3 "Дружественный игрок": -адрес после перезагрузки -метка из тини дампера дружественного игрока до перезагрузки Если повезет, то находим фильтр - фиолетового цвета строка. Если филетовых строк несколько, то запоминаем их смещения и значения на всякий случай Пишем АА-скрипт со смещением фильтра. Правильно написанный АА-скрипт не будет крешить игру. Активируем АА-скрипт и проверяем в игре, что свой и дружественный игроки не получают урон, а вражеские получают урон. Если это не так, то берем другие смещения из пункта 9 и повторяем 10. Если фильтр найти не удалось, то ищем 3 многоуровневых указателя до верхего статического адреса для своего, для 2-х врагов. Открываем Structure Spider. Указываем в поиске уровень вложенности указателей. Попеременно вводим два статических адреса - начала структур своего и чужих игроков. Правило поиска выбираем исходя из типов игроков. Если это свой и чужой, то искать отличные. Если это чужой и чужой, то искать одинаковые. Перезапускам игру и опять проделываем эти действия. Если не нашлось ничего, то что-то делали не так или отличия между группами игроков нет. Однако графический интерфейс обычно связан только с нашим героем и не связан с другими. Поэтому по связи GUI как минимум фильтр свой-чужой можно сделать всегда. Что касается дружественных игроков, то нужно будет исследовать более углубленно.
  • CE mapbranches

    1
    4
    0 Голоса
    1 Сообщения
    730 Просмотры
    MasterGHM
    MapBranches (Другие записи: https://celua.ru/topic/113/ветвления-кода-связанные-с-адресом-старые-записи/2) На адрес устанавливается брейкпоинт. Идем в игру делаем или не делаем что-то Начинают срабатывать инструкции на брейкпоинте От каждой инструкции начинается трейслог, подобный тому, который есть у CE, но менее тормозной Заканчивается трейслог на инструкции, на 100-ом счетчике после ret-а (об этом пункте будет уточнение). Здесь выходим на коневой цикл Трейслог останавливается и ожидание следующей инструкции, которая сработает на брейкпоинте, она должна быть отличной В итоге мы имеем кучу трейслогов начинающихся с адреса работающего с параметром (например, кол-во патронов в обойме) и заканчивающихся на корневом цикле. Также мы собираем данные об адресах с рет-ами и счетчиками. По этим данным можно нарисовать схему, где ret-ы меняют направление пути прохождения потоком дизассемблерного кода На скриншотах ниже Вертикальные линии со кружками -— это ветвь трейслога Белый кружок — адрес ret-a, который не повторялся Пунктирный кружок — адрес ret-а, который повторялся. Стрелка от такого пунктирного круга будет указывать на белый круг. По схеме видим, где ret-ы меняют свое направление поднимаясь по рутине в корневом цикле По плану по визуальной части: Клик на кружок — переход на код Придумать что-то, чтобы стрелки не накладывались друг на друга Установка брейкпоинтов на кружках — становиться красными Легенда. Номер ветви, связанная инструкция, состояние брейкпоинтов. Комментарий к ветви Загрузка/сохранение легенды Для чего нужно. Для поиска условий, которые включают и выключают ветви кода. Т.е. чтобы можно было это условие быстро найти и изменив его, повторить выполнение кода ветви, которая "пробьётся" из корневого цикла. Таким образом попытаться повторить действие в игре, а если не получаться повторить, то определить дополнительные условия.
  • Эта тема удалена!

    Перенесена
    0
    0 Голоса
    0 Сообщения
    6 Просмотры
    Нет ответов
  • CE Tool Lua Regular expressions 2

    ce plugin
    2
    5
    0 Голоса
    2 Сообщения
    136 Просмотры
    MasterGHM
    Lua поиск элемента до и после строки Была задача получить два списка из документа, в котором было с пару десятков тысяч строк. На практике выяснилось, что искать текст после ключевого слова легче чем искать текст до ключевого слова. Об этом и будет дальше В утилите "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начала добавим первую пустую строку и видим повторяющиеся фрагменты "%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. Можно раcсплитить текст по "/n/r" или "/n" в таблицу строк и по индексам данных находить предыдущую или последующую фразу. Но мне проще две строки ввести "%c?%c?([:%w%s]-)%c%cgameCompany" и "DAU%c%c(.-)%c%c"
  • CE disassembler

    ce plugin
    1
    3
    0 Голоса
    1 Сообщения
    688 Просмотры
    MasterGHM
    Кратко Добавил сохранение/загрузку параметров. Хранение в текстовом файле в папке autoruns Добавил настройки графического интерфейса (слайдеры, пункт меню) Обновления UI Гладкая перерисовка, двойной буфер Стрелки прыжков сдвигаются вправо при увеличении их количества Слайдер яркости фона Слайдер количества адресов в невидимой области от 0 до +1К от верхнего и нижнего адресов. Увеличивает количество стрелок для прыжков. Стрелки в невидимой области обозначаются двумя цветами. Один цвет для тех стрелок, у которых адрес прыжка и адрес назначения не выходят в область видимости. Второй цвет для тех стрелок, которых адрес прыжка или адрес назначения входят в области видимости. Видимые стрелки обозначаются белым. На рисуемые стрелки прыжков влияет слайдер яркости. Не показывать стрелки прыжков для инструкций типа 'jmp [...]', 'jne [...]'... Сохранение и загрузка при заходе и выходе из CE значения слайдеров верхнего адреса выбранного адреса параметры шрифтов и других С цветами экспериментировал не понравилось, пока оставляю градацию "черный-белый". Основное назначение его показывать приоритетные инструкции более ярким цветом. Инструкции такие как арифметические и логические. Это первый и второй слайдеры. Третий - инструкции на запись, чтение. Четвертый - инструкции ветвления. Пятый слайдер - остальные инструкции. Остальные слайдеры связаны с настройками. Основные из них размер шрифта, яркость фона, вертикальный отступ между инструкциями и другие. Также в плагин встроена поддержка работы с окнами трейслогов. Происходит постоянный поиск новых и отсутствующих окон трейслогов... Делаем трейслоги. Двойной клик по адресам и переходим по адресу в дизассемблер (если он открыт) и видим в нем раскрашенные пути маркерами. Если окон много, то видим пересечения, расхождения путей и видим инструкции, которые не выполнялись...Встроено контекстное меню установки брейкпоинтов на call-ы в трейслоге. Если его вызывать, то после идем в игру и, не делая того, что исследуем, прерываемся на брейкпоинтах и снимаем их. Когда больше не прерываемся, то делаем в игре то, что нужно и прерываемся на оставшемся брейкпоинте. На нем исследуем условие входа в рутину. Тут как бы можно на страх и риск изменить условие, чтобы ветка кода повторила свое выполнение. Если позволяет, то выполнить поток вызвав call... Но я придерживаюсь варианта изменения данных для того чтобы поток сам повторил рутину. Либо подменить параметры функции или подменить параметры после выхода функции. На данный момент показать что-то на практике нечего. Как будет, сделаю и покажу видео. Встроена поддержка маркирования путей на выбранном участке кода. Это специальное окно в меню "утилитах" в окне дизассемблера его можно найти. Указывается верхний адрес и нижний адрес области кода. Например, функции. При старте начинается логирование уникальных прохождения от начального до конечного адреса и раскраска маркерами. Возможных таких путей 8. Т.е. делая что-то в игре (разовые действия) видим уникальную ветвь, она тут же появляется и на этой ветви можно прерваться поставив опцию, и оттрейсить выход из рутины... Более подробное описание и скриншоты в закрытом разделе в моем старом блоге. Имеют к нему доступ пользователи со статусом "Разработчики". Новую информацию я буду писать в этой теме. Плагин сейчас на стадии чернового варианта, кто хочет пробуйте. Установка с репозитория. Чтобы подключить нужно загрузить .CT таблицу. Знаю что не удобно, но пока так. Плагин планируется развивать дальше, сейчас это черновой вариант
  • CE Compact View

    2
    0 Голоса
    2 Сообщения
    137 Просмотры
    MasterGHM
    Ниже находится обучающий пример плагина для CE Lua с установкой компактного режима применяя парадигму ООП — инкапсуляции. Для программирования плагинов на Lua могут пригодится приемы ООП. Это касается сущностей, их поведений и взаимодействий между ними. В данном примере CECompactView — описание класса на основе мета-таблицы и оно является сущностью. Функции класса — uncompact() и compact(), которые реализуют поведения этой сущности. Основной скрипт с описанием сущности можно поместить в отдельный файл .lua и далее можно кратко инициализировать сущность и управлять ей Например \-- Создание экземпляра класса через new() функцию, где аргументом является состояние компактный или некомпактный ce_compact_view = CECompactView:new(true) \-- Проверить состояние \--print(ce_compact_view:get_state() and 'Compact View Mode' or 'Full View Mode') \-- Установить компактный режим \--ce_compact_view:compact() \-- Установить не компактный режим \--ce_compact_view:uncompact() Сам класс или мета-таблица. \-- Класс инкапсулирующий поведения компактного состояния окна CE CECompactView = {} function CECompactView:new(state) local obj = {} -- Состояние компактное или нет: true или false obj.compact_mode = state -- Форма CE, где getMainForm — поддерживаемая функция CE и возвращает главную форму CE obj.form_ce = getMainForm() -- Получение элементов контекстного меню главной формы local menu_items = obj.form_ce.menu.items -- Создание нового контекстного меню с названием CompactView и именем ItemCompact obj.menu_item_compact = createMenuItem(menu_items) obj.menu_item_compact.name = 'ItemCompact' obj.menu_item_compact.caption = 'CompactView' -- Добавление контекстного меню на главную форму menu_items.add(obj.menu_item_compact) -- Сменить состояние окна CE: компактное или нет function obj:set(state) -- view_components состояния скрытия компонентов obj.compact_mode = state -- видимость компонентов обратна компактному режиму local view_components = not state obj.form_ce.panel1.visible = view_components obj.form_ce.panel4.visible = view_components obj.form_ce.panel5.visible = view_components obj.form_ce.Splitter1.visible = view_components -- Записать имя по состоянию obj.menu_item_compact.caption = state and 'Full View Mode' or 'Compact View Mode' -- Поставить обработчик по состоянию obj.menu_item_compact.onClick = state and obj.compact or obj.uncompact print(state and 'Compact View Mode' or 'Full View Mode') end -- Некопактное окно CE function obj:uncompact() obj:set(true) end -- Компактное окно CE function obj:compact() obj:set(false) end -- Состояние окна CE: компактное или нет function obj:get_state() return obj.compact_mode end -- Связь таблицы (смотрим докуметацию по Lua) setmetatable(obj, self) obj.__index = self -- Активировать состояние obj:set(state) -- Возвращает ссылку на экземпляр return obj end \------------ \-- Создание экземпляра класса ce_compact_view = CECompactView:new(true) \-- Проверить состояние \--print(ce_compact_view:get_state() and 'Compact View Mode' or 'Full View Mode') \-- Установить компактный режим \--ce_compact_view:compact() \-- Установить не компактный режим \--ce_compact_view:uncompact() Скрипт можно сохранить в Lua файл и добавить в папку autorun.
  • CE Lua ColorPicker (скрытый компонент)

    ce plugin ce lua ce components
    6
    1
    0 Голоса
    6 Сообщения
    217 Просмотры
    PitronicP
    значит не мой случай, мне женька только экзешники скинул, а как я понял нужны полностью исходники.
  • CE Script Editor [Notepad+]

    Перенесена todo ce plugin notepad++
    1
    0 Голоса
    1 Сообщения
    61 Просмотры
    MasterGHM
    Расширение для Notepad+ Там все файлы и ссылки: перейти Пару картинок запосчу, чтобы иметь представление что это Не хватает изменения размеров картинок. Не хватает спойлеров (добавил в todo) Не хватает цвета для текста
  • CE Lua чистка памяти от утечек

    ce lua ce plugin memory leak
    2
    0 Голоса
    2 Сообщения
    130 Просмотры
    MasterGHM
    Оптимизация CE Lua кода по сборке мусора Есть инструкции, которые добавляют мусора больше чем другие. Показываем объем памяти мусора print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) Ниже код того как попробовать узнать сколько мусора добавил код при парсинге ассемблерной строки двумя способами local s = " 0045464A - FF 05 A4B54500 - inc [0045B5A4] { [000003EA] }" function GetDebugString(address) return splitDisassembledString(s) end \-- address, bytes, opcode function GetDebugString2(address) local clearString = string.gsub(s, '%s','') return string.match(clearString, '^(.-)%-(.-)%-(.-)$') end function NoOptimizeCode() GetDebugString2() end function OptimizeCode() GetDebugString() end local countRepeat = 500000 -- add more cycle local x1 = 0 local x2 = 0 x1 = getTickCount() print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) for i = 1, countRepeat do NoOptimizeCode() end print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) x2 = getTickCount() for i = 1, countRepeat do OptimizeCode() end print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) print(string.format("%.2f", (x2 - x1)/(getTickCount() - x2)) ) Пример результатов могут отличаться. Фиг его знает почему. Возможно работает сборщик мусора в разные моменты времени Lua memory usage 1.8 MiB Lua memory usage 1.8 MiB Lua memory usage 1.8 MiB 1.49 Lua memory usage 1.8 MiB Lua memory usage 2.3 MiB Lua memory usage 2.3 MiB 1.47 Lua memory usage 2.3 MiB Lua memory usage 2.8 MiB Lua memory usage 2.8 MiB 1.49
  • CE вывод списка записей и вывод свойств компонентов

    ce lua ce plugin ce components userdata
    2
    2
    0 Голоса
    2 Сообщения
    127 Просмотры
    MasterGHM
    Ищем свойства userData. 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)
  • CE Вывод иерархии компонентов

    ce plugin ce lua ce components
    1
    1
    0 Голоса
    1 Сообщения
    92 Просмотры
    MasterGHM
    Скрипт позволит вывести иерархию компонентов CE в виде текста. Иерархия компонентов CE нужна для написания плагинов. Например, для ColorPicker и для смены шрифта (подобротнее об этом было где-то было в блоге). print("Controls list for CE "..getCEVersion()..'\n') function PrintComponents(obj, tabCount) local tabLine = string.rep(' ', tabCount) local componentCount = obj.ComponentCount if obj.Caption == nil then print(tabLine..obj.Name..'('..obj.ClassName..')') else print(tabLine..obj.Name..'('..obj.ClassName..') -> "'..obj.Caption..'"') end for i = 0, componentCount - 1 do local subObject = obj.Component[i] PrintComponents(subObject, tabCount + 1) end end PrintComponents(MainForm, 1) Результат Controls list for CE 7.4 MainForm(TMainForm) -> "Cheat Engine 7.4" Splitter1(TSplitter) Panel1(TPanel) -> "" Panel4(TPanel) -> "" advancedbutton(TSpeedButton) -> "Advanced Options" CommentButton(TSpeedButton) -> "Table Extras" lblSigned(TLabel) -> "This table has been signed by Someone" Panel5(TPanel) -> "" ProcessLabel(TLabel) -> "No Process Selected" foundcountlabel(TLabel) -> "0" ScanText(TLabel) -> "Value:" lblScanType(TLabel) -> "Scan Type" lblValueType(TLabel) -> "Value Type" LoadButton(TSpeedButton) -> "" SaveButton(TSpeedButton) -> "" Label6(TLabel) -> "Found:" SpeedButton2(TSpeedButton) -> "" SpeedButton3(TSpeedButton) -> "" btnNewScan(TButton) -> "First Scan" gbScanOptions(TGroupBox) -> "Memory Scan Options" ScanOptionsModuleList(TComboBox) Panel2(TPanel) -> "" cbCopyOnWrite(TCheckBox) -> "CopyOnWrite" cbWritable(TCheckBox) -> "Writable" cbExecutable(TCheckBox) -> "Executable" Panel3(TPanel) -> "" Label2(TLabel) -> "Stop" Label1(TLabel) -> "Start" ToAddress(TEdit) FromAddress(TEdit) Panel6(TPanel) -> "" cbFastScan(TCheckBox) -> "Fast Scan" edtAlignment(TEdit) cbPauseWhileScanning(TCheckBox) -> "Pause the game while scanning" Panel8(TPanel) -> "" rbfsmLastDigts(TRadioButton) -> "Last Digits" rbFsmAligned(TRadioButton) -> "Alignment" btnNextScan(TButton) -> "Next Scan" ScanType(TComboBox) VarType(TComboBox) ProgressBar(TProgressBar) UndoScan(TButton) -> "Undo Scan" scanvalue(TEdit) Panel7(TPanel) -> "" sbOpenProcess(TSpeedButton) -> "" btnFirst(TButton) -> "First Scan2" btnNext(TButton) -> "Next scan 2" LogoPanel(TPanel) -> "" Logo(TImage) SettingsButton(TSpeedButton) -> "Settings" pnlScanValueOptions(TPanel) -> "" rbBit(TRadioButton) -> "Bits" rbDec(TRadioButton) -> "Decimal" cbHexadecimal(TCheckBox) -> "Hex" Panel9(TPanel) -> "" pnlScanOptions(TPanel) -> "" pnlFloat(TPanel) -> "" rt3(TRadioButton) -> "Truncated" rt1(TRadioButton) -> "Rounded (default)" rt2(TRadioButton) -> "Rounded (extreme)" cbUnicode(TCheckBox) -> "UTF-16" cbCaseSensitive(TCheckBox) -> "Case sensitive" cbFloatSimple(TCheckBox) -> "Simple values only" cbpercentage(TCheckBox) -> "Percent" cbNot(TCheckBox) -> "Not" cbCodePage(TCheckBox) -> "Codepage" cbRepeatUntilStopped(TCheckBox) -> "Repeat" cbLuaFormula(TCheckBox) -> "Lua formula" cbNewLuaState(TCheckBox) -> "Separate Lua state" Panel10(TPanel) -> "" cbUnrandomizer(TCheckBox) -> "Unrandomizer" cbSpeedhack(TCheckBox) -> "Enable Speedhack" Panel14(TPanel) -> "" Label54(TLabel) -> "Speed" lblSH0(TLabel) -> "0" lblSH20(TLabel) -> "500" btnSetSpeedhack2(TButton) -> "Apply" editSH2(TEdit) tbSpeed(TTrackBar) scanvalue2(TEdit) ScanText2(TLabel) -> "Scan Value" andlabel(TLabel) -> "and" Foundlist3(TListView) (TCustomListViewEditor) btnAddAddressManually(TButton) -> "Add Address Manually" btnMemoryView(TButton) -> "Memory View" cbCompareToSavedScan(TCheckBox) -> "Compare to first/saved scan" lblcompareToSavedScan(TLabel) -> "<xxxx>" UpdateTimer(TTimer) FreezeTimer(TTimer) PopupMenu2(TPopupMenu) (TMenuItem) -> "" (TMenuItem) -> "Add to new group" miAutoAssembleErrorMessage(TMenuItem) -> "<Error message here>" Deletethisrecord1(TMenuItem) -> "Delete this record" Change1(TMenuItem) -> "Change record" Description1(TMenuItem) -> "Description" Address1(TMenuItem) -> "Address" Type1(TMenuItem) -> "Type" Value1(TMenuItem) -> "Value" miUndoValue(TMenuItem) -> "Undo last edit" Smarteditaddresses1(TMenuItem) -> "Smart edit address(es)" Browsethismemoryregion1(TMenuItem) -> "Browse this memory region" miDisassemble(TMenuItem) -> "Disassemble this memory region" miShowAsSigned(TMenuItem) -> "Show as signed" Showashexadecimal1(TMenuItem) -> "Show as hexadecimal" miZeroTerminate(TMenuItem) -> "Zero-Terminate string" miShowAsBinary(TMenuItem) -> "Show as binary" miChangeColor(TMenuItem) -> "Change Color" SetHotkey1(TMenuItem) -> "Assign Hotkey" miSetDropdownOptions(TMenuItem) -> "Set/Change dropdown selection options" Freezealladdresses2(TMenuItem) -> "Toggle Selected Records" miFreezePositive(TMenuItem) -> "Freeze Positive" miFreezeNegative(TMenuItem) -> "Freeze Negative" Changescript1(TMenuItem) -> "Change script" miAsyncScript(TMenuItem) -> "Execute asynchronous" N5(TMenuItem) -> "-" miGeneratePointermap(TMenuItem) -> "Generate pointermap" Pointerscanforthisaddress1(TMenuItem) -> "Pointer scan for this address" Findoutwhataccessesthisaddress1(TMenuItem) -> "Find out what accesses this address" Setbreakpoint1(TMenuItem) -> "Find out what writes to this address" sep2(TMenuItem) -> "-" miDBVMFindWhatWritesOrAccesses(TMenuItem) -> "DBVM Find out what writes or accesses this address" sep1(TMenuItem) -> "-" Calculatenewvaluepart21(TMenuItem) -> "Recalculate new addresses" Forcerechecksymbols1(TMenuItem) -> "Force recheck symbols" N4(TMenuItem) -> "-" Cut1(TMenuItem) -> "Cut" Copy1(TMenuItem) -> "Copy" Paste1(TMenuItem) -> "Paste" MenuItem1(TMenuItem) -> "Select All" N1(TMenuItem) -> "-" CreateGroup(TMenuItem) -> "Create Header" miGroupconfig(TMenuItem) -> "Group config" miHideChildren(TMenuItem) -> "Hide children when deactivated" miBindActivation(TMenuItem) -> "Activating this entry activates it's children" miBindDeactivation(TMenuItem) -> "Deactivating this entry deactivates it's children" miRecursiveSetValue(TMenuItem) -> "Setting a value to this entry sets same value to children" miAllowCollapse(TMenuItem) -> "Allow left and right arrow keys to collapse and expand" miManualExpandCollapse(TMenuItem) -> "Manual expand/collapse" miAlwaysHideChildren(TMenuItem) -> "Always hide children" Plugins1(TMenuItem) -> "Plugins" foundlistpopup(TPopupMenu) (TMenuItem) -> "" miAddAddress(TMenuItem) -> "Add selected addresses to the addresslist" miChangeValue(TMenuItem) -> "Change value of selected addresses" miChangeValueBack(TMenuItem) -> "Change value of selected addresses back to previous/saved value" Browsethismemoryarrea1(TMenuItem) -> "Browse this memory region" Browsethismemoryregioninthedisassembler1(TMenuItem) -> "Disassemble this memory region" Removeselectedaddresses1(TMenuItem) -> "Remove selected addresses" Copyselectedaddresses1(TMenuItem) -> "Copy selected addresses" Selectallitems1(TMenuItem) -> "Select all items" MenuItem4(TMenuItem) -> "-" miShowPreviousValue(TMenuItem) -> "Show previous value column(s)" miOnlyShowCurrentCompareToColumn(TMenuItem) -> "Only show current "compare to" column" MenuItem13(TMenuItem) -> "-" miForgotScan(TMenuItem) -> "Reload the previous value list (Forgot value scan)" MenuItem14(TMenuItem) -> "-" miFlFindWhatAccesses(TMenuItem) -> "Find out what accesses this address" miFlFindWhatWrites(TMenuItem) -> "Find out what writes to this address" N2(TMenuItem) -> "-" miFoundListPreferences(TMenuItem) -> "Preferences" MenuItem19(TMenuItem) -> "-" miDisplayHex(TMenuItem) -> "Hexadecimal" miDisplayDefault(TMenuItem) -> "Default" miDisplayByte(TMenuItem) -> "Byte" miDisplay2Byte(TMenuItem) -> "2 Bytes" miDisplay4Byte(TMenuItem) -> "4 Bytes" miDisplay8Byte(TMenuItem) -> "8 Bytes" miDisplayFloat(TMenuItem) -> "Float" miDisplayDouble(TMenuItem) -> "Double" OpenDialog1(TOpenDialog) SaveDialog1(TSaveDialog) TopDisabler(TTimer) emptypopup(TPopupMenu) (TMenuItem) -> "" MenuItem2(TMenuItem) -> "New Item1" ccpmenu(TPopupMenu) (TMenuItem) -> "" Cut2(TMenuItem) -> "Cut" Copy2(TMenuItem) -> "Copy" Paste2(TMenuItem) -> "Paste" ActionList1(TActionList) actSave(TAction) -> "" actOpen(TAction) -> "" actAutoAssemble(TAction) -> "actAutoAssemble" actMemoryView(TAction) -> "actMemoryView" actOpenProcesslist(TAction) -> "" actOpenDissectStructure(TAction) -> "actOpenDissectStructure" actOpenLuaEngine(TAction) -> "actOpenLuaEngine" UpdateFoundlisttimer(TTimer) AutoAttachTimer(TTimer) MainMenu1(TMainMenu) (TMenuItem) -> "" (TMenuItem) -> "English" (TMenuItem) -> "Save scan session" (TMenuItem) -> "Load scan session" (TMenuItem) -> "-" File1(TMenuItem) -> "&File" miAddTab(TMenuItem) -> "Add scan tab" New1(TMenuItem) -> "Clear list" MenuItem8(TMenuItem) -> "Open Process" miOpenFile(TMenuItem) -> "Open File" miSaveFile(TMenuItem) -> "Save File" N7(TMenuItem) -> "-" miSave(TMenuItem) -> "Save" Save1(TMenuItem) -> "Save As..." Load1(TMenuItem) -> "Load" miLoadRecent(TMenuItem) -> "Load Recent" miSignTable(TMenuItem) -> "Sign table" MenuItem3(TMenuItem) -> "-" miSaveScanresults(TMenuItem) -> "Save current scanresults" miDeleteSavedScanResults(TMenuItem) -> "Delete scanresult" MenuItem6(TMenuItem) -> "-" MenuItem9(TMenuItem) -> "Generate generic trainer lua script from table" MenuItem5(TMenuItem) -> "-" MenuItem7(TMenuItem) -> "Quit" Edit3(TMenuItem) -> "&Edit" Settings1(TMenuItem) -> "Settings" Process1(TMenuItem) -> "&Process" OpenProcess1(TMenuItem) -> "Open Process window" CreateProcess1(TMenuItem) -> "Create Process" N6(TMenuItem) -> "-" a1(TMenuItem) -> "a" b1(TMenuItem) -> "b" c1(TMenuItem) -> "c" d1(TMenuItem) -> "d" e1(TMenuItem) -> "e" miTable(TMenuItem) -> "Table" miShowLuaScript(TMenuItem) -> "Show Cheat Table Lua Script" MenuItem10(TMenuItem) -> "-" miCreateLuaForm(TMenuItem) -> "Create form" miResyncFormsWithLua(TMenuItem) -> "Resynchronize forms with Lua" miLuaFormsSeperator(TMenuItem) -> "-" miAddFile(TMenuItem) -> "Add file" mi3d(TMenuItem) -> "D3D" miHookD3D(TMenuItem) -> "Hook Direct3D" MenuItem11(TMenuItem) -> "-" miSetCrosshair(TMenuItem) -> "Set custom crosshair" miWireframe(TMenuItem) -> "Toggle wireframe mode" miZbuffer(TMenuItem) -> "Toggle disabled zbuffer" miLockMouseInGame(TMenuItem) -> "Lock mouse in game window" miSetupSnapshotKeys(TMenuItem) -> "Start and configure snapshot recording" miSnapshothandler(TMenuItem) -> "Snapshot handler" ools1(TMenuItem) -> "&Tools" miDotNET(TMenuItem) -> ".Net" miGetDotNetObjectList(TMenuItem) -> "Get object list" miNetwork(TMenuItem) -> "Network" miCompression(TMenuItem) -> "Compression" miScanDirtyOnly(TMenuItem) -> "Scan changed regions only" miScanPagedOnly(TMenuItem) -> "Scan paged (physical) memory only" Plugins2(TMenuItem) -> "P&lugins" miLanguages(TMenuItem) -> "Languages" miHelp(TMenuItem) -> "&Help" Helpindex1(TMenuItem) -> "Cheat Engine Help" miLuaDocumentation(TMenuItem) -> "Lua documentation" miTutorial(TMenuItem) -> "Cheat Engine Tutorial" MenuItem12(TMenuItem) -> "Cheat Engine Tutorial (64-Bit)" MenuItem15(TMenuItem) -> "Cheat Engine Tutorial Games" miEnableLCLDebug(TMenuItem) -> "Generate errorlogs" N8(TMenuItem) -> "-" miAbout(TMenuItem) -> "About" pmTablist(TPopupMenu) (TMenuItem) -> "" miRenameTab(TMenuItem) -> "Rename" miTablistSeperator(TMenuItem) -> "-" miCloseTab(TMenuItem) -> "Close tab" pmValueType(TPopupMenu) (TMenuItem) -> "" miDefineNewCustomType(TMenuItem) -> "Define new custom type (Auto Assembler)" miDefineNewCustomTypeLua(TMenuItem) -> "Define new custom type (LUA)" miEditCustomType(TMenuItem) -> "Edit selected custom type" miDeleteCustomType(TMenuItem) -> "Delete selected custom type" miShowCustomTypeDebug(TMenuItem) -> "Show custom type debug info" ColorDialog1(TColorDialog) pmResetRange(TPopupMenu) (TMenuItem) -> "" miResetRange(TMenuItem) -> "Reset range" pmScanRegion(TPopupMenu) (TMenuItem) -> "" miPresetAll(TMenuItem) -> "Preset: Scan all memory" miPresetWritable(TMenuItem) -> "Preset: Scan writable memory" MainMenu2(TMainMenu) (TMenuItem) -> "" tLuaGCPassive(TTimer) tLuaGCActive(TTimer) mfImageList(TImageList) frmAutoInject(TfrmAutoInject) -> "Lua script: Cheat Table" Panel1(TPanel) -> "" Panel3(TPanel) -> "" btnExecute(TButton) -> "Execute script" Panel2(TPanel) -> "" MainMenu1(TMainMenu) (TMenuItem) -> "" File1(TMenuItem) -> "File" miNewWindow(TMenuItem) -> "New Window" miNewTab(TMenuItem) -> "New Tab" Load1(TMenuItem) -> "Open" Save1(TMenuItem) -> "Save" SaveAs1(TMenuItem) -> "Save As..." miLuaSyntaxCheck(TMenuItem) -> "Syntax Check" Assigntocurrentcheattable1(TMenuItem) -> "Assign to current cheat table" N2(TMenuItem) -> "-" Exit1(TMenuItem) -> "Exit" View1(TMenuItem) -> "View" Syntaxhighlighting1(TMenuItem) -> "Syntax highlighting" MenuItem3(TMenuItem) -> "Auto assembler syntax highlighting preferences" MenuItem2(TMenuItem) -> "Lua syntax highlighting preferences" MenuItem1(TMenuItem) -> "C highlighting preferences" AAPref1(TMenuItem) -> "Preferences" emplate1(TMenuItem) -> "Template" Codeinjection1(TMenuItem) -> "Code injection" APIHook1(TMenuItem) -> "API Hook" Coderelocation1(TMenuItem) -> "Code relocation" miCallLua(TMenuItem) -> "Call CE lua function" menuAOBInjection(TMenuItem) -> "AOB Injection" menuFullInjection(TMenuItem) -> "Full Injection" CheatTablecompliantcodee1(TMenuItem) -> "Cheat Table framework code" Inject1(TMenuItem) -> "Inject" Injectincurrentprocess1(TMenuItem) -> "Inject into current process" Injectintocurrentprocessandexecute1(TMenuItem) -> "Inject into current process and execute" OpenDialog1(TOpenDialog) SaveDialog1(TSaveDialog) PopupMenu1(TPopupMenu) (TMenuItem) -> "" miCut(TMenuItem) -> "Cu&t" miCopy(TMenuItem) -> "&Copy" miPaste(TMenuItem) -> "&Paste" miUndo(TMenuItem) -> "&Undo" miRedo(TMenuItem) -> "Redo" N6(TMenuItem) -> "-" miFind(TMenuItem) -> "&Find..." mifindNext(TMenuItem) -> "Find Next" mifindPrevious(TMenuItem) -> "Find Previous" miReplace(TMenuItem) -> "Replace" TabMenu(TPopupMenu) (TMenuItem) -> "" miMoveLeft(TMenuItem) -> "Move left" miMoveRight(TMenuItem) -> "Move right" miRenameTab(TMenuItem) -> "Rename" Close1(TMenuItem) -> "Close" FindDialog1(TFindDialog) undotimer(TTimer) ReplaceDialog1(TReplaceDialog) aaImageList(TImageList) (TSynAASyn) (TSynCppSyn) (TSynLuaSyn) Assemblescreen(TSynEditPlus) (TSynBeautifier) SynLeftGutterPartList1(TSynGutterPartList) SynGutterMarks1(TSynGutterMarks) SynGutterLineNumber1(TSynGutterLineNumber) SynGutterChanges1(TSynGutterChanges) SynGutterSeparator1(TSynGutterSeparator) SynGutterCodeFolding1(TSynGutterCodeFolding) SynRightGutterPartList1(TSynRightGutterPartList) (TTimer) (TAddresslist) -> "" List(TTreeviewWithScroll) (TTimer) (TTimer) Header(THeaderControl) (TPopupMenu) (TMenuItem) -> "" (TMenuItem) -> "Sort on click" (TTimer)
Powered by NodeBB | Contributors
СeLua[RU] 2026©
Любое копирование материалов с указанием первоисточника