Я пытаюсь написать трассировщик вызова функции с помощью Pin. Он может печатать каждый вызов функции, а также значение каждого аргумента.
Сложность состоит в том, чтобы получить все аргументы функции. Используя RTN_InsertCall, вы можете передать аргументы функции в свой код инструментария:
Intel Pin RTN_InsertCall несколько аргументов функции
Однако вам нужно знать количество аргументов текущей процедуры. Есть способ сделать это?
Спасибо!
Вы должны предоставить важную информацию о том, есть ли у вас отладочные символы для рассматриваемого двоичного файла или нет. Если у вас есть доступные символы отладки, то это просто. Существуют стандартные библиотеки для их анализа.
Если у вас нет символов отладки, то это может быть очень сложно, и вам лучше использовать визуальный инструмент исследования, такой как IDA Pro. Было проведено некоторое исследование по автоматическому поиску сигнатур функций для очищенных двоичных файлов (например, ftp://ftp.cs.wisc.edu/paradyn/papers/Jacobson11Unstrip.pdf), но тема по-прежнему актуальна, и какой бы инструмент вы ни использовали, ожидайте, что он в какой-то момент потерпит неудачу, потому что проблема в конечном счете неразрешима, и все инструменты просто прибегают к эвристике для восстановления этой информации. Свободно доступная глава 12 книги Криса Игла (http://www.tinker.tv/download/idaPro_ch12.pdf) описывает способ, которым это делает МАР.
В C информация о типе не сохраняется в двоичном виде.
В C ++ вы можете попытаться использовать искаженное имя функции, чтобы выяснить типы аргументов. Однако искажение имен не является стандартным и обычно несовместимо между различными компиляторами. Очевидно, здесь нет никаких гарантий.
Смотрите также:
Можно ли программно получить подпись функции в общей библиотеке?