Несоответствие числа вызовов и повторных инструкций при использовании Intel Pin (на x86)

Я пытаюсь использовать 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, Чтобы найти его, найдите имя файла Вот.

2

Решение

Существуют различные версии 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
0

Другие решения

Между командами call и ret не всегда есть совпадение просто потому, что функции могут быть прерваны исключениями, оператором goto-like, longjump, сигналами и т. Д. Так что, если вы хотите повторно согласовать вызовы и ret, вы можете захотеть взять в соображениях все это.

Это обсуждалось уже несколько раз, особенно Вот

0

По вопросам рекламы [email protected]