Перейти к содержанию
  • записей
    46
  • комментария
    23
  • просмотра
    3 292

[IDA Pro] Отслеживание интересующего регистра по функции

Авторизация  
partoftheworlD

161 просмотр

Сегодня напишем простейшую реализацию функции поиска используемого регистра в коде при статическом анализе, как когда-то показывал этот функционал в radare2.

Немного модифицированный скрипт стоит у меня на вооружении для динамического анализа т.е. определяет где впервые адрес появляется, как рассчитывается, дампит смещения и пробует найти сигнатуру на статический адрес в коде. В общем немного подумав и почитав доки по иде, тоже сможете такое сделать без особых проблем.

 

Скрипт пишется минут за 15-20, но в дальнейшем экономит нереально много времени.

 

Единственная проблема возникла с получением точно адреса инструкции, во избежании повторений в выводе и была написана альтернатива функции range. 

                                         	 # подключаем необходимые библиотеки
import idc                               	 # стандартные модуля для общения между идой
import idaapi
import re                                	 # для расширения функционала поиска

reg_value = r'.*\[r14\+.*'               	 # то, что будем искать

def range_reverse(start, stop):          	 # аналог функции range
    for i in FuncItems(start):
        if i < start and i >= stop:
            yield i
            
ea = ScreenEA()                          	 # получение текущего адреса курсора
current_function = idaapi.get_func(ea)   	 # получение информации о функции

                                         	 # перебор инструкций по адресам
for inst_addr in range_reverse(ea, current_function.startEA):
	disasm_output = idc.GetDisasm(inst_addr) # вывод дизассемблированной инструкции по её адресу
	if re.findall(reg_value, disasm_output): # фильтрация по нужному тексту
    		print("0x%X" % inst_addr, disasm_output)

Раз скрипт уже написали(скопипастили), приступим к тестам.

 

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

 

image.thumb.png.069d9f319c77d8eb8665fa9844e8fb58.png

 

Выполняем скрипт и получаем всю информацию о интересующем регистре, так же, чтобы избавится от инструкций чтения и выводить только инструкции записи, можно добавив одну проверку, но с этим вы сами сможете справиться, я надеюсь вы меня не расстроите.

 

image.thumb.png.134e13067df90b2440cd34f8a52cf60c.png

 

Так же можем отследить как вычисляется база следуя за регистром, переходя двойным кликом по адресу в окне вывода.

 

image.thumb.png.845d46356006f3acb5312754e973ce25.png

image.thumb.png.f76ee1a1a155c453f18e1fe647aea6cf.png

 

Это ведь проще, чем руками скролить функцию под 10-20к инструкций. В общем, если лень, что-то делать — автоматизируй или не делай.

 

  • Понравилось 2
  • Плюс 2
Авторизация  


1 Комментарий


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

Небольшой совет по питону: вместо 

reg_value = r'.*\[r14\+.*'

лучше использовать:

reg_value = re.compile(r'.*\[r14\+.*')
...
reg_value.findall(disasm_output)

Это немного ускорит использование regexp в цикле :) 

 

  • Плюс 1

Поделиться этим комментарием


Ссылка на комментарий

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×

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

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