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

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

Изменить 0:

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

1 ответ

Решение

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

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

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

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])...

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

Другие вопросы по тегам