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

Поиск инструкций совершающих прыжок на целевой адрес (Заготовка Lua Plagin)


MasterGH

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

Представляю замечательный скрипт по поиску инструкций, которые прыгают на известный адрес.

 

1. Описание проблемы на примере игры "Assassin Creed Unity"

 

 

Скрытый текст

У нас есть инструкция "1455D741F - 32 02 - xor al,[rdx]", но мы не знаем какие инструкции на неё прыгают. 

 

post-3-0-29370400-1430388450_thumb.png

 

Нужен такой инструмент, который позволит найти инструкции и отобразить их

 

2. Описание практического решения решения

Мы можем сделать вручную или в автоматическом режиме. Нажимая кнопку F7 начиная с бряка на 1455D741F запоминать откуда прыгали. Вручную это делать утомительно, а вот в автоматическом режиме самое то.

 

Я выполнил скрипт

 

post-3-0-70513600-1430388456_thumb.png

и получил результат

 

post-3-0-82315700-1430388463_thumb.png

 

Я увидел что за 2К инструкций (и даже в тестах на 20К инструкций) на инструкцию "1455D741F - 32 02 - xor al,[rdx]" происходит прыжок только с "1455CE87B - E9 9F8B0000 - jmp 1455D741F"

 

Этот скрипт может помочь в исследовании отладочного кода

 

3. Скрипт и как им пользоваться

 


-- Плагин CE Lua. Ищет адреса с которых происходит прыжок или вызов на целевой адрес-- 1. Запустить CE-- 2. Если надо в CE поставить VEH дебаггер или другой-- 3. Подключиться к процессу игры-- 4. Скоприовать код ниже в Lua консоль-- 5. Ввести в stringAddress свой адрес в виде строки-- 6. Ввести в maxFoundAddreses свое значение-- 7. Ввести в maxCountStep свое значение-- 8. Запустить выполнение скрипта и набраться терпения. Каждый новый прыжок, который находит скрипт будет выводится сразу. А после завершения поиска будут выведены результаты.local stringAddress = 'ACU.exe+55D741F' -- адрес на который будут пыржки или calllocal maxFoundAddreses = 2000  -- поиск остановится если адресов нашлось больше maxCountAddreseslocal maxCountStep = 2000  -- количество шагов (F7) после которых поиск остановится. Если очень много, то ждать окончания поиска придется долго. Задавать эксперементально-- Эти переменные редактировать не нужноlocal isStartFinding = truelocal countStep = 0local countFoundAddreses = 0local iTargetAdress = getAddress(stringAddress)local tableAdresses = {}local lastEIPorRIP = 0	-- прошлый адресfunction TryAddAddressToStory(lastAddress)	for i = 1, #tableAdresses do		if(tableAdresses[i] == lastAddress) then			return false		end	end	table.insert(tableAdresses, lastAddress)	local sAddress = string.format('0x%X', lastAddress)	local moduleAddress = getNameFromAddress(sAddress)	print(string.format('Find %s : %s', moduleAddress, disassemble(sAddress)))	return trueendfunction debugger_onBreakpoint()	if(isStartFinding) then		countStep = countStep + 1		if(targetIs64Bit()) then			-- Если код оказался на целевом адресе, то попытаться добавить в историю прошлый lastEIPorRIP			if(RIP == iTargetAdress and lastEIPorRIP ~= 0) then				if(TryAddAddressToStory(lastEIPorRIP)) then					countFoundAddreses = countFoundAddreses + 1				end			end			-- Сохранить значение RIP регистра			lastEIPorRIP = RIP		else			-- Если код оказался на целевом адресе, то попытаться добавить в историю lastEIPorRIP			if(EIP == iTargetAdress and lastEIPorRIP ~= 0) then				if(TryAddAddressToStory(lastEIPorRIP)) then					countFoundAddreses = countFoundAddreses + 1				end			end			-- Сохранить значение EIP регистра			lastEIPorRIP = EIP		end				-- Оставновить поиск, если количество шагов боьше максимальрых или найденных адресов больше максимального значения		if(countStep >= maxCountStep or countFoundAddreses >=  maxFoundAddreses) then			isStartFinding = false			debug_removeBreakpoint(iTargetAdress)			debug_continueFromBreakpoint(co_run)			print("Найдено адресов " .. countFoundAddreses)			print("Совершено количество шагов " .. countStep)			--print("Адреса: ")			--for i = 1, #tableAdresses do			--	local sAddress = string.format('0x%X', tableAdresses[i])			--	local moduleAddress = getNameFromAddress(sAddress)			--	print(string.format('%s : %s', sAddress, moduleAddress))			--end			print("Трассировка завершена")		else			-- Иначе делать шаг по коду			debug_continueFromBreakpoint(co_stepinto) --co_run (just continue), co_stepinto(when on top of a call, follow it), co_stepover (when on top of a call run till after the call)		end				return 1 -- не показывать дизассемблер во время поиска isStartFinding	end	return 0 -- показывать дизассемблерend-- Установить бряк на адрес, на который будут совершаться прыжки. Будет происходить поиск этих прыжков в автоматической пошаговой отладке начиня с этого брякаdebug_setBreakpoint(iTargetAdress)
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Представляю замечательный скрипт по поиску инструкций, которые прыгают на известный адрес.

MasterGH, здорово. Спасибо.

Может теперь найти все три jmp на проверки для этой игры и просто занопить их одновременно?

Может это сработает?

Ссылка на комментарий
Поделиться на другие сайты

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

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

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