Skip to content

Программирование

Программирование и отладка

49 Темы 94 Сообщения

Подкатегории


  • Игровой движок

    2 Темы
    2 Сообщения
    MasterGHM

    В этом разделе находятся темы связанные с игровым движком Unity3d.
    В основном я буду писать темы по работе с этим движком.

  • Программирование и отладка

    9 Темы
    9 Сообщения
    MasterGHM

    API

  • Программирование плагинов, примеров, инфо

    17 Темы
    55 Сообщения
    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) \+ }

    Готов реализовать любое из этих улучшений в вашем форке. Какое направление наиболее приоритетно?

  • Среды разработки, программы, утилиты и т.п.

    2 Темы
    2 Сообщения
    MasterGHM
    Программа Cheat Engine 7.5

    ---
    Назначение:

    для создания читов (поиска и изменения игровых значений в памяти и др.) для обучения программированию.

    Ссылка на сайт для скачивания.
    Ссылка на официально руководство (только для опытных)

    Для тех, кто только начал обучаться программированию с помощью Cheat Engine рекомендуется читать темы на этом форуме или искать простые примеры и руководства. Также можно задать вопросы по Cheat Engine здесь на форуме

  • Конспекты, заметки, руководства, описания, faq

    3 Темы
    3 Сообщения
    MasterGHM

    Инфа по совместной работе с гитом. Может быть пригодится кому, а может и нет. Такую систему я использую на работе недавно.

    Можно совместно работать над одним большим проектом через git-flow. Возможно, кто-то из форумчан тоже использует git flow на работе.

    git-flow — это набор расширений git предоставляющий высокоуровневые операции над репозиторием для поддержки модели ветвления Vincent Driessen.

    Кратко. Модель контроля версии построена на 4 ветках

    master - релизы
    develop - разработка
    feature - фичи
    hotfix - исравления

    С develop начинается разработка через копирования в ветку feature.
    Над фичей идет работа, а после завершения feature мержится с develop и feature сразу удаляется.
    После запланированных изменений develop мержится с master уходя в релиз.
    Если возникли баги, то от master создается ветвь на hotfix . После фиксов hotfix мержится с master.

    Доступ к мастер ветки может иметь один человек или его доверенные лица. Ветка Develop открыта для разработчиков. Это значит, что множество разработчиков колдуют в Develop ветке, а мержит изменения с master уже главный разработчик или несколько главных разработчиков.

    В мастере создаются теги с обозначением версии.

    Учитывая номер версии МАЖОРНАЯ.МИНОРНАЯ.ПАТЧ, следует увеличивать:

    МАЖОРНУЮ версию, когда сделаны обратно несовместимые изменения API.
    МИНОРНУЮ версию, когда вы добавляете новый функционал, не нарушая обратной совместимости.
    ПАТЧ-версию, когда вы делаете обратно совместимые исправления.
    Дополнительные обозначения для предрелизных и билд-метаданных возможны как дополнения к МАЖОРНАЯ.МИНОРНАЯ.ПАТЧ формату.

    git-flow заметки
    Семантическое версионирование

  • 10 Темы
    16 Сообщения
    PitronicP

    Иногда код ассемблера необходимо с делать с условием пример фильтр свой чужой. Реализовать это можно сравнением двух адресов и задать условие. Сравнение задаётся командой cmp, после которой идёт условие прыжка , после которого выполняется ваш код. пример мы нашли смещение от адреса число которое равно 1 от начала структуры адреса игрока и нам надо если оно равно чтоб здоровье было больше. и так пишем наш код.
    cmp [eax+1234],1 // сравнили наш адрес фильтра с единицей
    jne code // если не равно прыжок на метку code
    mov [eax+40],#99999 // а если равно
    кроме метки code могут быть безымянные метки
    @F прыжок в перёд
    @B прыжок назад
    пример
    cmp [eax+1234],1 // сравнили наш адрес фильтра с еденицей
    jne @F // если не равно прыжок в перёд
    mov [eax+40],#99999 // а если равно
    также есть чистая безымянная метка которая позволит сделать два условия
    @@: безымянная метка
    пример с этим же кодом
    cmp [eax+1234],1 // сравнили наш адрес фильтра с единицей
    jne @F // если не равно прыжок в перёд
    mov [eax+40],#99999 // а если равно
    @@: // прыжок на безымянную метку
    mov [eax+40],0 // если [eax+1234],1 не равен это наш враг и с метки @@: не наш игрок умирает
    Теперь таблица условных прыжков и переходов:
    JA прыжок, если выше
    JAE прыжок, если выше или равно
    JB прыжок, если ниже
    JBE прыжок, если меньше или равно
    JC Прыгает, если перенос
    JCXZ прыжок, если равно нулю
    JE прыжок, если равно
    JG прыжок, если больше
    JGE прыжок, если больше или равно
    JL прыжок, если меньше
    JLE прыжок, если меньше или равно
    Прыжок JNA, если не выше
    JNAE прыжок, если не выше или не равно
    Прыжок JNB, если не ниже
    JNBE прыжок, если не ниже или не равно
    Переход JNC, если не выполняется перенос
    JNE прыжок, если не равно
    Переход JNG, если не больше
    JNL прыжок, если не меньше
    JNO переходит, если не переполнено
    JZ прыжок если равно нулю.

  • Cheat Engine и Lua. Старт

    Прикреплена Перенесена
    1
    0 Голоса
    1 Сообщения
    159 Просмотры
    Нет ответов
  • Создать структуру программно

    2
    0 Голоса
    2 Сообщения
    33 Просмотры
    MasterGHM

    Решил попробовать написать CE Lua скрипт, который прочесывает структуру и в Dissect data/structures окне создавал бы структуру только со смещениями, с которыми код работает, т.е. читает или пишет.

    Например, мой персонаж прогуливается по городу, а каждые 200 мс ставится брейкпоинт на смещение +1 до гипотетической N границы структуры (например до 4096).

    Я не успел сделать определение типа, но смещения внутри структуры получить я успел.

    Итак, находим начало структуры любой. Запускаем Lua скрипт и просто что-то делаем в игре. Потом вылазит текст с дизассемблированными инструкциями и смещениями. Уже по этим логам можно определить вручную

    к каким смещением было обращение (адреса по ним мы и будем менять или сравнивать структуры между собой позже)

    по виду инструкции и соседнему смещению уже примерно можно определить тип данных и их размер
    a3ea23e7-54e8-46c5-82a5-f3d2a73cc540-изображение.png
    Осталось сделать определение типа, а это не так уж долго сделать и осталось взять код из предыдущих записей в блоге формирования структуры в окне dessect data. Так мы получим структуру только с активными смещениями, (а зачем нам пассивные?) и определим в них тип, я надеюсь определим правильно

    Пример кода, который я использовал

    addressStructure1 = 0x412E0200 --> адрес начала структуры в любой игре sizeStructure = 100 --> гипототический размер структуры 100 для быстрых поисков, по умолчанию 4096 indexStructure = 0 --> индекс внутри структуры, который будет перемещаться вместе с breakPointAddress breakPointAddress = 0 --> адрес, на который сейчас постален брейкпоинт waitTimeTillBreak = 300 --> частота активности смещеиня resultText = '' --> конкатенация частей текста в этой переменной \-- Функция пытается поставить брейкпоинт на следующий байт в структуре function TryNextSetBreakPointToAddress() debug_removeBreakpoint(breakPointAddress) indexStructure = indexStructure + 1 if indexStructure > sizeStructure then debugTimer.Interval = 1000 debugTimer.Enabled = false debugTimer.destroy() debug_continueFromBreakpoint(co_run) print(resultText) --> вывод результата с завершением отладки return end breakPointAddress = addressStructure1 + indexStructure debug_setBreakpoint(breakPointAddress, 1, bptAccess, bpmDebugRegister) debug_continueFromBreakpoint(co_run) end \-- Любимая функция снятия отладочных данных function debugger_onBreakpoint() -- проверить обращение к структуре prevAddress = getPreviousOpcode(RIP) resultText = resultText..string.format('Offset: + %X : %s', indexStructure, disassemble(prevAddress)) .. '\r\n' TryNextSetBreakPointToAddress() return 1 end \-- Простой таймер debugTimer = createTimer(nil, false) debugTimer.OnTimer = function(timer) TryNextSetBreakPointToAddress() end debugTimer.Interval = waitTimeTillBreak debugTimer.Enabled = true breakPointAddress = addressStructure1 + indexStructure debug_setBreakpoint(breakPointAddress, 1, bptAccess, bpmDebugRegister)
  • Часть2. Lua простые регулярные выражения

    1
    0 Голоса
    1 Сообщения
    30 Просмотры
    Нет ответов
  • Часть1. Lua простые регулярные выражения

    1
    0 Голоса
    1 Сообщения
    72 Просмотры
    Нет ответов
  • 0 Голоса
    1 Сообщения
    31 Просмотры
    Нет ответов
  • Visual Studio. Топ 10 часто используемых горячих клавиш

    1
    0 Голоса
    1 Сообщения
    1k Просмотры
    Нет ответов