Skip to content
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Collapse
Brand Logo

CELua[RU]

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

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

Запланировано Прикреплена Закрыта Перенесена Программирование
ce luaregular
1 Сообщения 1 Posters 83 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • MasterGHM Не в сети
    MasterGHM Не в сети
    MasterGH Администраторы
    написал в отредактировано MasterGH
    #1

    Есть такой плагин "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

Powered by NodeBB | Contributors
СeLua[RU] 2024©
  • Войти

  • Нет учётной записи? Зарегистрироваться

  • Login or register to search.
  • Первое сообщение
    Последнее сообщение
0
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы