Skip to content
  • Поиск данных в окне Tracer

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

    Программирование
    2
    0 Голоса
    2 Сообщения
    10 Просмотры
    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)
  • 0 Голоса
    1 Сообщения
    17 Просмотры
    Нет ответов
  • Часть1. Lua простые регулярные выражения

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

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

    Видео
    1
    0 Голоса
    1 Сообщения
    13 Просмотры
    Нет ответов
  • Cheat Engine и Lua. Старт

    Прикреплена Перенесена Программирование
    1
    0 Голоса
    1 Сообщения
    103 Просмотры
    Нет ответов
  • Большой брейкпоинт page exceptions

    Приёмы
    1
    0 Голоса
    1 Сообщения
    11 Просмотры
    Нет ответов
  • Запустить активирющий скрипт CE 7.5

    Управление
    5
    1 Голоса
    5 Сообщения
    140 Просмотры
    MasterGHM

    Кнопка "^"

  • Lua ООП конспект

    Справочники
    1
    0 Голоса
    1 Сообщения
    12 Просмотры
    Нет ответов
  • Функция autoAssemble

    Приёмы
    2
    1 Голоса
    2 Сообщения
    125 Просмотры
    PitronicP

    Пользователь @MasterGH написал в Функция autoAssemble:

    // Скрипт похожий на таблицу АА

    Маленькое замечание. Два слеша используются для коментариев в асм. На луа используются пунктир не менее двух чёрточек. Если пользователь не разбирается, он не поймёт почему луа выдаёт ошибку. Тему поправил.

  • CE Lua чистка памяти от утечек

    Плагин-строй
    2
    0 Голоса
    2 Сообщения
    22 Просмотры
    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

  • Обработка исключения в Cheat Engine Lua

    Приёмы
    1
    0 Голоса
    1 Сообщения
    25 Просмотры
    Нет ответов
  • Считаем размер инъекции в байтах

    Приёмы
    1
    0 Голоса
    1 Сообщения
    13 Просмотры
    Нет ответов
  • Выполить текст, как код

    Приёмы
    1
    0 Голоса
    1 Сообщения
    12 Просмотры
    Нет ответов
  • CE Lua ColorPicker (скрытый компонент)

    Плагин-строй
    6
    0 Голоса
    6 Сообщения
    49 Просмотры
    PitronicP

    значит не мой случай, мне женька только экзешники скинул, а как я понял нужны полностью исходники.

  • 0 Голоса
    2 Сообщения
    32 Просмотры
    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
    1a800863-fb55-46e7-a2b0-b3daed1613af-изображение.png
    Чтобы наглядно было. Свойства эти похожи на свойства из Дельфи. Можно загуглить, они поддробно описываются.

    Берем например свойство цвет. Прочитаем оригинальное и запишем свое любое

    local mainFormCE = getMainForm() print(mainFormCE.getColor()) > 536870912 -- в hex-е это 0x20000000. Можно перевести в калькуляторе или через print(string.format("%08X", 536870912))

    Случайное свое впишем ради наглядного примера
    mainFormCE.setColor(546484)

    72d5c265-f388-4d4f-b24c-f3dcb46d8f39-изображение.png

  • 0 Голоса
    3 Сообщения
    48 Просмотры
    MasterGHM

    Update:
    Если скрипт не запускается, то вызывать reinitializeSymbolhandler(true)
    Пример здесь

  • CE Вывод иерархии компонентов

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