Перейти к содержанию

CE Lua. Поиск адресов строк и инструкций работающих со строками


MasterGH

Рекомендуемые сообщения

Результат

 

post-3-0-47597100-1452206431_thumb.png

 

 

 

Зачем это надо?

 

С помощью примера Lua скрипта (выше) есть возможность получить адреса строк и получить адреса инструкций работающих со строками. Т.е. есть программный доступ к этим "штукам". Ну, вот, а что делать дальше нужно решить самому.

 

Примерно можно думать о следующем. Очень часто в строках (не зашифрованных) находится описание параметра какой-то настройки. Это может быть все что угодно. Например, текущее количество вещей в инвентаре. В теории если найти инструкцию работающую с определенными вещами в инвентаре, то можно сделать инъекцию записывающие все вещи. Когда будет обращение к этой инструкции, например, при каждой загрузке уровня, то могут записаться вещи с максимальным количеством, которое поставили. Т.е. если поставили 9999999 и открыли все вещи, то какой смысл их ломать в игре? Когда их так много, что можно играть с ними очень долго.

-- 1. Поиск адресов строк и ссылок на них-- 2. Вывод результата на консольprocessName = 'test.exe' -- подключенный заранее процесс  (у вас другой)function convert(T)   local tmp={}   for k,v in pairs(T) do tmp[#tmp+1]={k,v} end   table.sort(tmp,function (a, return a[1]<b[1] end)   return tmpendif (dissectCode == nil) then	dissectCode = getDissectCode()enddissectCode.clear()dissectCode.dissect(processName)-- Получить таблицу адресов строкreferencedStrings = dissectCode.getReferencedStrings() referencedStringsConv = convert(referencedStrings)local is64Bit = targetIs64Bit()stringlist = createStringlist()for i = 1, #referencedStringsConv do		if(referencedStringsConv[i][1] ~= '') then		-- Выводим адрес строки		if(is64Bit) then			stringlist.add(string.format('%016X:', referencedStringsConv[i][1]))		else			stringlist.add(string.format('%08X:', referencedStringsConv[i][1]))		end		-- Значение строки (первые 120 символов без поиска символа конца строки и для одной кодировки без widechar)		stringlist.add(string.format('	%s', readString(referencedStringsConv[i][1],120)))				-- Теперь ищем адреса ссылки на строку выше		tableRefData = dissectCode.getReferences(referencedStringsConv[i][1])		referencesConv = convert(tableRefData)				-- Выводим адреса инструкций, которые ссылаются на адрес функции		for j=1,#referencesConv do			local ref = referencesConv[j][1]			--local refhex = string.format('%X', ref)			local type = referencesConv[j][2]			-- type = 0 - jtCall 			-- type = 1 - jtUnconditional (jmp dword ptr [00458014], jmp 00402DDC ...)			-- type = 2 - jtConditional (je 0041F2D4,  jae 00414B48,  jl 00414428...)			-- type = 3 - jtMemory ( mov [esi+30],00422950, mov eax,0040FD4C...)			stringlist.add(string.format('	%s, type : %d', disassemble(ref), type))		end	end	endstringlist.add('')stringlist.add(string.format('Найдено адресов строк : %d', #referencedStringsConv))print(stringlist.Text)stringlist.destroy()
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

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

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