Перейти к содержанию
  • записи
    104
  • комментариев
    125
  • просмотра
    15 683

Часть1. Lua. Захват выражения в квадратных скобках


MasterGH

2 541 просмотр

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

 

58f77bef44145_.thumb.png.f29206caec124bc

 

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

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

aamaker.lua

0 Комментариев


Рекомендуемые комментарии

Комментариев нет

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.