Как я могу отследить определенный цикл в бинарных инструментах с помощью инструмента Pin?

Я новичок в использовании инструмента пин-кодов Intel и хочу отслеживать определенный цикл в двоичном файле, но я обнаружил, что при каждом запуске адрес команд, изменяемых при каждом запуске, как мне найти конкретную инструкцию или определенный цикл, даже если он меняться в каждом заезде?

Изменить 0:

У меня есть следующий адрес, одним из которых является RVA 🙁 первая часть адреса (маленький адрес) является постоянной для каждого запуска, но последняя секция (большой адрес) изменяется для каждого запуска)
Адрес loop_repeation No._of_Instruction_In_Loop
4195942 1 8
4195972 1 3
…….    …    …
140513052566480 1 2
……    …    …

3

Решение

адрес инструкций менялся при каждом запуске, как найти конкретную инструкцию или определенный цикл, даже если он изменился при каждом запуске?

Это, вероятно, потому что у вас есть ASLR включен (который включен по умолчанию в Ubuntu). Если вы хотите, чтобы анализируемая программа загружалась по одному и тому же адресу при каждом запуске, вы можете:

1) Отключить ASLR:

  • Отключите это для всей системы: sysctl -w kernel.randomize_va_space=0 как объяснил здесь.
  • Отключите его для каждого процесса: $> setarch $(uname -m) -R /bin/bash как объяснил здесь.

2) Рассчитайте дельту (смещения) в вашем pintool:

Для каждого адреса, которым вы манипулируете, вам нужно использовать RVA (Относительный виртуальный адрес), а не полный VA (виртуальный адрес).

Пример:

  • Допустим, при первом запуске ваша программа загружается с 0x80000000 (это «Базовый адрес»), и цикл начинается с 0x80000210.
  • При втором запуске программа загружается с 0x90000000 («Базовый адрес»), а цикл начинается с 0x90000210.

Просто рассчитайте смещения циклов по базовому адресу:

  • Base_Address — Program_Address = смещение
  • 0x80000210 — 0x80000000 = 0x210
  • 0x90000210 — 0x90000000 = 0x210

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

Как это сделать в вашем pintool:

  • Учитывая (инструкция) адрес, используйте IMG_FindByAddress найти соответствующее изображение (модуль).
  • С картинки используйте IMG_LowAddress получить базовый адрес модуля.
  • Вычтите основание модуля из инструкции: у вас есть RVA.

Теперь вы можете сравнить RVA между ними и посмотреть, являются ли они одинаковыми (они также должны быть в одном модуле).

Очевидно, что это не работает для кода JITed, поскольку код JITed не имеет исполняемого модуля (например, mmap () [linux] или VirtualAlloc () [windows]) …

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

3

Другие решения


По вопросам рекламы [email protected]