Как я могу отследить определенный цикл в бинарных инструментах с помощью инструмента 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:
- Отключите его для всей системы:
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])...
Наконец, есть хороший документ (довольно старый, но все еще применимый) по определению петли с помощью pin, если это может вам помочь.