Intel Pin Изменение адресов команд - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь выполнить некоторый анализ команд исполняемого двоичного файла с использованием инструментария Intel Pin-tool.

После анализа выполненных инструкций в моем Pin-инструменте я наблюдаю, что адрес инструкции (счетчик программы) ) полученный диапазон значений сильно отличается от того, что я наблюдаю при анализе разборки скомпилированного кода с использованием objdump -d -S <binary>. Я тестирую его на стандартном Linux /bin/ls исполняемом бинарном файле.

Насколько я понимаю, Pin модифицирует исходный двоичный файл, чтобы поставить свои собственные "ловушки" для сбора информации, связанной с выполнением, которая вызывает обратные вызовы в нашем желаемом Pin-инструмент для анализа. Таким образом, это, естественно, должно привести к тому, что фактически исполняемый двоичный файл будет отличаться от исходного. К сожалению, я не знаю других скрытых вещей о Pin.

Мне было интересно, есть ли какой-нибудь способ сохранить оригинальную компоновку кода или получить некоторое соответствие между старыми двоичными и новыми двоичными адресами команд

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Современные дистрибутивы используют исполняемые файлы P IE, являющиеся общими объектами ELF, которые перемещаются во время выполнения. objdump показывает только ваши адреса относительно базы изображений. Что такое опция -fP IE для позиционно-независимых исполняемых файлов в g cc и ld? и 32-разрядные абсолютные адреса больше не разрешены в x86-64 Linux?

Вы можете отключить ASLR, как это делает GDB, поэтому он всегда перемещается в то же самое место, как 0x55555..., но все равно не будет соответствовать адресу objdump.

Вы можете, я думаю, использовать objdump --adjust-vma=offset для перемещения вашей разборки.

Или вы можете создавать не-P IE исполняемые файлы с gcc -no-pie -fno-pie -O3, чтобы objdump знал реальный запуск адрес каждой инструкции.

0 голосов
/ 21 марта 2020

Если я правильно понимаю, проблема заключается в размещении двоичных изображений (обратите внимание, что Pin инструкции анализа не изменяют поведение программы, видимое для пользователя, так агрессивно. Основные эффекты влияют на производительность и такие вещи, как кеширование). Например, ваше изображение glibc размещается по адресу, который отличается от адреса при запуске программы в Pin. Если это так, во-первых, вы должны добавить обратный вызов изображения , например:

...
VOID callbackFn(IMG img, VOID *v)
{...}
...
int main(int argc, char *argv[])
{
   ...
   IMG_AddInstrumentFunction(callbackFn, 0);
   ...
}
...

Функция обратного вызова (т. Е. callbackFn()) вызывается при каждом времени загрузки изображения. , В теле обратного вызова вы можете использовать IMG_LowAddress(img) для получения адреса загрузки каждого изображения во время выполнения. Есть также такие функции, как IMG_Name(img) и IMG_IsMainExecutable(img), которые могут быть полезны. Теперь вы знаете начальный адрес двоичного образа, который B.

. Вы хотите найти адрес функции foo() в образе во время выполнения. Предположим, что objdump говорит, что он находится по адресу A от начала двоичного изображения. Чтобы найти адрес времени выполнения foo(), вам нужно только добавить A к B. Другими словами, foo() находится в A + B во время выполнения.

PS: Будьте осторожны с символьными c ссылками при разборе имен изображений. Вы можете использовать эту функцию , чтобы решить проблему.

...