Skip to content
  • 0 Голоса
    1 Сообщения
    37 Просмотры
    Нет ответов
  • CE 6.8 Обзор нового инструмента поиска по структурам

    Перенесена Статьи
    8
    0 Голоса
    8 Сообщения
    51 Просмотры
    MasterGHM

    Пользователь @Pitronic написал в CE 6.8 Обзор нового инструмента поиска по структурам:

    Разрешаю в этой теме всё что в той дополнить

    Спасибо, за твое разрешение. Мне, кажется, это две разные статьи и лучше в новой теме.
    @Pitronic публиковать статьи тоже можешь.. Там еще можно добавлять теги и выбирать раздел.

  • Крафт в StarsOne

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

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

    Программирование
    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)
  • Cheat Engine и Lua. Старт

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

    Приёмы
    1
    0 Голоса
    1 Сообщения
    11 Просмотры
    Нет ответов
  • Sikulix-скрипт сравнения изображений в играх

    Перенесена Статьи
    1
    0 Голоса
    1 Сообщения
    20 Просмотры
    Нет ответов
  • [The Escapists 2 + Unity + dnSpy] Спавн итемов

    Перенесена Статьи
    1
    0 Голоса
    1 Сообщения
    22 Просмотры
    Нет ответов
  • [dnSpy + Unity ] Пошаговая отладка

    Перенесена Статьи
    1
    0 Голоса
    1 Сообщения
    91 Просмотры
    Нет ответов
  • Настройка частного DNS

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

    Ого 😃 Ну, спасибо

  • CE Script Editor [Notepad+]

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

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

  • 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

  • 0 Голоса
    1 Сообщения
    16 Просмотры
    Нет ответов
  • 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

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

    Справочники
    1
    0 Голоса
    1 Сообщения
    12 Просмотры
    Нет ответов
  • FPU инструкция FINCSTP. Очистка ST(0)

    Справочники
    1
    0 Голоса
    1 Сообщения
    16 Просмотры
    Нет ответов
  • 0 Голоса
    2 Сообщения
    21 Просмотры
    MasterGHM

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

    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 секунд, то это вероятно корневой цикл, а если менее, то это вложенный цикл. На корневом цикле можно остановить трейслог. Об этом может быть потом напишу.

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

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