Как получить макет адресного пространства от Intel Pin в Linux?

Я хочу получить макет адресного пространства от Intel Pin в Linux.

Сначала я пытаюсь прочитать файл - /proc/PID/maps и получить схему адресного пространства. Но когда вы выполняете такую ​​часть кода?

Если вы поместите его перед PIN_StartProgram, файл карт не будет содержать некоторые регионы, например heap;

Если вы поместите его в Fini и подключите к PIN_AddFiniFunction(Fini, 0);, это должно быть хорошо. Однако, когда вы просто отслеживаете одно выполнение ls, вы не можете увидеть какую-либо структуру адресного пространства, связанную с выходными данными. Это проводной.


person 慕冬亮    schedule 18.09.2017    source источник
comment
Что вы имеете в виду, когда говорите о макете адресного пространства, связанном с выводом?   -  person nitzanms    schedule 19.09.2017


Ответы (2)


Возможно, не лучшее решение, но мне помогло. Основная проблема в том, что при запуске инструмента адресное пространство еще не подготовлено. Вы можете дождаться загрузки всех изображений, а затем прочитать содержимое procfs.

Таким образом, вы должны добавить функцию инструментирования для каждого изображения. Например, добавьте следующий оператор в функцию main:

IMG_AddInstrumentFunction(Image, 0);

Затем вы должны читать procfs каждый раз, когда загружается изображение. Это потому, что вы не знаете, какое изображение загружено последним (конечно, если вы знаете, какое изображение является последним, вы можете просто прочитать файл только один раз, после того, как это изображение загружено):

VOID Image(IMG img, VOID *v)
{
    ...
    /* open /proc/PID/maps and read its contents */
    ...
}

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

person TheAhmad    schedule 15.12.2017

Pin имеет более детальный подход к структуре адресного пространства. Вы можете получить обратные вызовы для загрузки изображений с помощью IMG_AddInstrumentFunction() и получить обратные вызовы для выделения кучи путем инструментирования вызовов malloc() и free() с помощью RTN_Replace() или даже инструментирования mmap(), brk() и других системных вызовов для выделения кучи с помощью PIN_AddSyscallEntryFunction().

Вы можете найти примеры использования этих API-интерфейсов в учебнике Pin и примеры в наборе Pin.

person nitzanms    schedule 19.09.2017