Я новичок в использовании инструмента Intel Pin и хочу отслеживать определенный цикл в двоичном файле, но я нашел в каждом запуске адрес инструкций, измененных при каждом запуске, как я могу найти конкретную инструкцию или конкретный цикл, даже если это меняется при каждом запуске?
Изменить 0:
У меня есть следующий адрес, который из них является RVA: (первая часть адреса (маленький адрес) постоянна для каждого запуска, но последний раздел (большой адрес) менялся для каждого запуска)
Address loop_repeation No._of_Instruction_In_Loop
4195942 1 8
4195972 1 3
....... ... ...< br> 140513052566480 1 2
...... ... ...
Как я могу отследить определенный цикл в двоичном инструментировании с помощью инструмента булавки?
Ответы (1)
адрес инструкций менялся при каждом запуске, как я могу найти конкретную инструкцию или конкретный цикл, даже если они меняются при каждом запуске?
Вероятно, это связано с тем, что у вас включен ASLR (который включен по умолчанию в Ubuntu). Если вы хотите, чтобы анализируемая программа загружалась по одному и тому же адресу при каждом запуске, вы можете:
1) Отключить ASLR:
- Отключите его для всей системы:
sysctl -w kernel.randomize_va_space=0
как объяснено здесь. - Отключите его для каждого процесса:
$> setarch $(uname -m) -R /bin/bash
как объяснено здесь.
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])...
Наконец, хороший документ (уже старый, но все еще применимый) при обнаружении петли с помощью булавки, если это может вам помочь.