Я пытаюсь распечатать стек в различных подпрограммах, используя инструмент булавки. Я в состоянии получить все подпрограммы, но я немного запутался, как получить адреса, хранящиеся в регистрах в стеке этой подпрограммы.
Что у меня есть это:
VOID SETRTN_CONTEXT(CONTEXT * ctxt)
{
ADDRINT reg_address;
PIN_SaveContext(ctxt, &m_ctxt);
reg_address = PIN_GetContextReg(&m_ctxt, REG_STACK_PTR);
}
и в другой функции у меня есть этот кусок кода, который вызывает эту функцию:
for(rtn = SEC_RtnHead(sec); RTN_Valid(rtn); rtn = RTN_Next(rtn) )
{
RTN_Open(rtn);
RTN_InsertCall(rtn, IPOINT_BEFORE, (AFUNPTR)SETRTN_CONTEXT,
IARG_CONST_CONTEXT, IARG_THREAD_ID, IARG_END);
RTN_Close(rtn);
}
Я немного запутался, когда подпрограмма вызывает эту функцию, так как я получаю только один результат, и я получаю его после подключения с помощью Pin и ожидания пары секунд.
Какие-нибудь булавки, которые могли бы помочь мне в этом? Я понимаю, что мне нужен контекст из подпрограммы для получения регистров, но я не могу найти функцию, которая возвращает контекст как объект …
В свой RTN_InsertCall вы добавляете идентификатор потока, а в объявлении функции SETRTN_CONTEXT вы не получаете идентификатор потока … возможно, вы захотите это исправить.
Кроме того, в вашей процедуре анализа SETRTN_CONTEXT вы фактически не сохраняете ничего внешнего для приложения. Я могу ошибаться, если m_ctxt — это глобальная переменная, которой вы манипулируете в другом месте. Как это может звучать, если вы не делали это каждый раз, когда выполнялась процедура анализа и потокобезопасным способом?
Понятно, что вы хотите записать информацию в какой-нибудь файл или вывод. Я рекомендую использовать какой-нибудь инструмент xml; это облегчает синтаксический анализ, и если вы пишете свои pintools аккуратно, вы можете обмениваться форматом вывода, выполняя некоторый контракт интерфейса.
Также, чтобы прояснить вашу путаницу, вы пытаетесь вставить процедуру анализа для запуска перед каждой отдельной функцией в определенном изображении; каждый раз, когда эта функция вызывается в этом образе, запускается ваш SETRTN_CONTEXT.
Других решений пока нет …