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

    Перенесена Статьи и видео ce lua regular
    1
    1
    0 Голоса
    1 Сообщения
    152 Просмотры
    MasterGHM
    Есть такой плагин "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 кода Функции по работе со строками. Link Используемые источники: link, link, link, link aamaker.lua
  • Регулярки на Lua. Пронумеровать список строк

    Перенесена Статьи и видео ce lua обучалка regular
    1
    0 Голоса
    1 Сообщения
    55 Просмотры
    MasterGHM
    Пример задачи. Пронумеровать список string string.byte string.char string.dump string.find string.format string.gmatch string.gsub string.len string.lower string.match string.pack string.packsize string.rep string.reverse string.sub string.unpack string.upper local text = [[ string string.byte string.char string.dump string.find string.format string.gmatch string.gsub string.len string.lower string.match string.pack string.packsize string.rep string.reverse string.sub string.unpack string.upper ]] function EnumerateText(text) local count = 0 local rez = text:gsub('%C+', function (s) count = count + 1 return string.format('%s. %s', count, s) end) showMessage(rez) writeToClipboard(rez) end EnumerateText(text) И получил ответ. В следующий раз только вызывать "EnumerateText([[ текст со строками]])" 1. string 2. string.byte 3. string.char 4. string.dump 5. string.find 6. string.format 7. string.gmatch 8. string.gsub 9. string.len 10. string.lower 11. string.match 12. string.pack 13. string.packsize 14. string.rep 15. string.reverse 16. string.sub 17. string.unpack 18. string.upper Тут в буфер текст улетит и выведет в мессагу. После закрытия мессаги через CTRL+V вставит текст, куда хотим Пронумерованные функции — функции работы со строками последней версии Lua 5.3.x из документации На что стоит обратить внимание при регулярках: Работа с пробелами и не пробелами: "%s" и "%S" Работа с символами разделяющие строки и не разделяющими строки: "%с" и "%С" Захват строк "(.+)", "(.-)", "(.)", а также без захвата, т.е. пропуск других символов ".+",".-","." Узнать как и какая функция из выше перечисленных работает, какая используется с регуляторами. Хотим к примеру вывести слово, которое закончится на пробеле (пишу просто "на пробеле" без учета других символов). Это уже "(%w+)", а если хотим второе слово, то это "%W+%w+" (не выводить первое и вывести второе слово) или "%s(%w+)" (после пробела, но чтобы было без пробела, то захватить в круглые скобки), или "^.+%s(%w+)"(начинать с первого символа до пробела и захват до конца слова). Если писать на CE Lua, то регулярки знать не обязательно. Но, их желательно знать, чтобы читать чужой код и писать свой. Да и вообще это интересно. Очень короткие выражения позволяют решить некоторую задачу за быстрое время. Основные задачи: поиск текста и замена текста.