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

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

Изменить 0:

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


person Mos Moh    schedule 22.05.2015    source источник


Ответы (1)


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

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

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

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

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

Пример:

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

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

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

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

Как это сделать в пинтуле:

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

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

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

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

person Neitsa    schedule 27.05.2015
comment
Спасибо, дорогой, у меня есть следующий адрес, один из которых является RVA: (первая часть адреса (маленький адрес) постоянна для каждого запуска, но последняя часть (большой адрес) меняется для каждого запуска) Address loop_repeation Нет ._of_Instruction_In_Loop 4195942 1 8 4195972 1 3 ....... ... ... 140513052566480 1 2 ...... ... ... - person Mos Moh; 31.05.2015
comment
@MosMoh Не могли бы вы отредактировать и обновить свой вопрос тем, что вы вставили сюда? Его трудно читать, если он не отформатирован должным образом ... Кроме того, вы пытались применить какое-либо из моих предложений? Что не работает? - person Neitsa; 01.06.2015
comment
@ Neitsa, спасибо, дорогая, я редактирую вопрос, надеюсь, теперь понятно, я не пробовал, у меня все еще есть недоразумение, если количество выполняемых инструкций изменилось во время выполнения (может быть из-за условия вызова функции) этот метод еще работает? ‹br› спасибо за бумагу я понял. - person Mos Moh; 01.06.2015