Я пытаюсь использовать Intel Pintool для мониторинга CALL
а также RET
инструкции на компьютере с архитектурой x86-64 (Mac Pro). Я прохожу IARG_INST_PTR
(упоминается ниже) docount
функция и с помощью указателя инструкции я выводить инструкцию, проверяя код операции (CALL
0xe8 и RET
0xc3 от Intel x86-64 инструкция. Тем не менее, кажется, что эта проверка не совсем точна, так как я замечаю больше числа RET
чем CALL
для любого двоичного файла, оснащенного этой логикой.
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)docount, IARG_CONTEXT,
IARG_INST_PTR, IARG_END);
Может ли кто-нибудь дать мне несколько советов о том, что я делаю неправильно?
Я позаимствовал шаблон из /tools/ManualExamples/inscount0.cpp
, Чтобы найти его, найдите имя файла Вот.
Существуют различные версии CALL
с различными кодами операций, поэтому вы не можете просто проверить 0xE8. Полный список можно найти в руководстве Intel, раздел процедуры вызова:
E8 cw
E8 cd
FF /2
FF /2
FF /2
9A cd
9A cp
FF /3
FF /3
REX.W + FF /3
То же самое, чтобы RET
C3
CB
C2 iw
CA iw
Между командами call и ret не всегда есть совпадение просто потому, что функции могут быть прерваны исключениями, оператором goto-like, longjump, сигналами и т. Д. Так что, если вы хотите повторно согласовать вызовы и ret, вы можете захотеть взять в соображениях все это.
Это обсуждалось уже несколько раз, особенно Вот