• Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
  • Зарегистрироваться
  • Войти
CELua[RU]
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
  • Зарегистрироваться
  • Войти

Часть1. Lua простые регулярные выражения

Запланировано Прикреплена Закрыта Перенесена Программирование
ce luaregular
1 Сообщения 1 Posters 93 Просмотры 1 Watching
Загружаем больше сообщений
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • M Не в сети
    УченикMasterGH Администраторы
    отредактировано MasterGH 14 мая 2023 г., 08:05

    Есть такой плагин "AA Maker" и там довольно интересные регулярные выражения на Lua. Разберем некоторые выражения

    Выражение ''%[(.*)%]' - захват всего, что в квадратных скобках

    Пример

    local s = 'mov eax, [ecx + 4]'
    print(string.match(s, '%[(.*)%]'))
    \--> ecx + 4

    Символ "%" нужно всегда ставить перед специальными символами такими как ^$()%.[]*+-?

    Символ "%[" и "%]" означают квадратные скобки в строке

    Разбирая комбинацию (.*).

    Точка означает любой символ, а символ умножить означает повторение любого символа

    Круглые скобки означают "подшаблон"

    Подшаблоны

    В шаблон можно включить подшаблоны, выделив их круглыми скобками. Если найденная строка соответствует шаблону, то ее подстроки, соответствующие подшаблонам, будут доступны для будущего использования. Подшаблоны пронумерованы согласно их левым круглым скобкам. Например, в шаблоне "(a*(.)%w(%s*))", часть строки, соответствующая "a*(.)%w(%s*)" будет зафиксирована как первый подшаблон (и поэтому имеет номер 1); любые символы попавшие под соответствие "." будут зафиксированы как подшаблон номер 2, и часть строки, соответствующая "%s*" получит номер 3.

    Специальный вариант использования подшаблонов - получение текущей позиции в строке. Для этого используются пустые подшаблоны (). Например, если мы применим шаблон "()aa()" к строке "flaaap", то получим два результата: 3 и 5.

    Шаблон не может содержать вложенные ноли. Используйте %z вместо этого.

    Т.е. можем извлечь содержимое инструкции.
    Примеры

    "(.*)" - захват всей строки
    "/(.*)/" - захват всего, что находится между КРАЙНИМИ символами /
    "/(.-)/" - захват всего, что находится между ПЕРВЫМИ ДВУМЯ символами /

    Пример из ААMaker плагина

    local _,_,x = string.find(opcode, '%[(.*)%]') из функции ниже
    

    Функция

    string.find("СТРОКА", "ШАБЛОН") возвращает номер позиции начала начала и конца шаблона

    Пример

    print(string.find('some string', 'me'))
    \--> 3 4

    Вся функция с комментариями из AAMaker

    \-- Таблица паттернов для нескольких инструкций inc, mov, fld, fstp (ключи таблицы)
    \-- Они нужны для создания автоматического АА кода, через замену строк другими строками
    \- {$Type} — очевидно для типа byte, word, dword
    \- [x] — очевидно обращение к адресу
    \- {$Value} — это значение
    \- \r\n — переход на следующую строку
    \-- Что будем делать с этой таблицой будет видно по коду или смотрите плагин
    PATTERN = {
    ['inc'] = 'mov{$Type}[x],{$Value}',
    ['mov'] = 'mov{$Type}[x],{$Value}\r\n{$OriginalCode}',
    ['fld'] = 'mov{$Type}[x],{$Value}\r\n{$OriginalCode}',
    ['fstp'] = '{$OriginalCode}\r\n'..'mov{$Type}[x],{$Value}'
    }
    \-- Не очень понятно зачем квадратные скобки у ключей. Можно написать не ['inc'], а 'inc'
    \-- Функция проверки паттерна
    function checkPattern()
    -- Получение имени адреса из адреса dv_address1 (выделенный адрес в дизассемблере)
    local address = getNameFromAddress(dv_address1)
    -- Получение инструкции по имени адреса
    local _,opcode = splitDisassembledString(disassemble(address))
    -- ComboBox.Text свойство равно "Injection" или "AOBScanModule"
    local choose = getProperty(cmbCheatType,"Text")
    if choose == 'Injection' or choose == 'AOBScanModule' then
    -- Перебор по ключу и значению таблицы PATTERN
    for key,value in pairs(PATTERN) do
    -- Если в опкоде нашли ключ из таблицы паттернов
    -- Где key это inc, mov, fld, fstp (см. выше таблицу PATTERN)
    -- Где opcode это например инструкция 'inc [edx + 4]'
    if string.find(opcode,key) ~= nil then
    local _,_,x = string.find(opcode, '%[(.*)%]')
    if x ~= nil then
    -- В value будет значение 'mov{$Type}[x],{$Value}'
    patternInjectAsmCode = value
    -- Нашли паттерн и вернули его
    return true
    end
    end
    end
    end
    -- Паттерн не нашли в таблице, вернули false
    patternInjectAsmCode = '{$OriginalCode}'
    return false
    end
    \-- patternInjectAsmCode

    Чтобы посмотреть результат, сделал скрин отладки Lua кода
    1d5685ba-4f64-4bf1-9eb3-8d9c82fdc34c-image.png

    Функции по работе со строками. Link

    Используемые источники: link, link, link, link

    aamaker.lua

    1 ответ Последний ответ Ответить Цитировать 0

    • 1 / 1
    1 / 1
    • Первое сообщение
      1/1
      Последнее сообщение
    Powered by NodeBB | Contributors
    СeLua[RU] 2025©