Я делаю небольшую программу, которая работает немного как strace, за исключением того, что я заставляю ее улавливать все вызовы, а также реты. Поскольку я не могу найти способ получить все вызовы и ret из-за косвенных вызовов, я хотел бы найти способ получить функцию, из которой возникает код op-кода. Есть ли у вас, ребята, есть какие-либо идеи о том, как сделать этоКак узнать начало кода операции ret при трассировке программы
ответ
Вы можете имитировать то, что ret
делает: Он смотрит в стек по адресу %esp
и устанавливает EIP
к этому значению. Инструкция перед адресом в текущем стеке будет содержать call
.
ok, но поскольку размер предыдущей инструкции не фиксирован, не трудно ли вернуться назад и перейти к началу этой инструкции? –
Да, это общее ограничение по всем кодовым архитектурам с переменным размером - вы не можете вернуться назад. Но вы знаете функцию вызова. Я не уверен, почему вы хотите получить «вызов» в первую очередь, но способ сделать это - это разобрать всю функцию из любой действующей точки, которую вы знаете, останавливаясь по адресу, считываемому 'ret' , – phihag
какой инструкция комплект это? –