使用英特尔 pintool 记录所有指令
Posted
技术标签:
【中文标题】使用英特尔 pintool 记录所有指令【英文标题】:Log all instruction with intel pintool 【发布时间】:2018-12-30 21:12:30 【问题描述】:我已经写了这个pintool:
#include "pin.H"
#include <iostream>
#include <fstream>
VOID Instruction(INS ins, VOID *v)
cout << INS_Disassemble(ins) << endl;
VOID Fini(INT32 code, VOID *v)
cout << "Fin" << endl;
int main(int argc, char *argv[])
if( PIN_Init(argc,argv) )
cout << "Erreur PIN_Init" << endl;
return 0;
INS_AddInstrumentFunction(Instruction, 0);
PIN_AddFiniFunction(Fini, 0);
PIN_StartProgram();
return 0;
我正在打印所有说明。 我现在要做的是显示指令地址(EIP)
我该怎么做?
谢谢
【问题讨论】:
【参考方案1】:#include "pin.H"
#include <iostream>
#include <fstream>
#include <string>
VOID DisplayInstruction(ADDRINT instructionAddress,string assemblyCode)
cout<<std::hex<<instructionAddress<<":"<<std::dec<<assemblyCode<<"\n";
VOID Instruction(INS ins, VOID *v)
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)DisplayInstruction,
IARG_INST_PTR, IARG_REG_VALUE,new string(INS_Assemble(ins)), IARG_END);
VOID Fini(INT32 code, VOID *v)
cout << "Fin" << endl;
int main(int argc, char *argv[])
if( PIN_Init(argc,argv) )
cout << "Erreur PIN_Init" << endl;
return 0;
INS_AddInstrumentFunction(Instruction, 0);
PIN_AddFiniFunction(Fini, 0);
PIN_StartProgram();
return 0;
【讨论】:
谢谢 有没有办法过滤共享库中的指令? PIN_LockClient(); IMG 图像=IMG_FindByAddress(INS_Address(ins)); PIN_UnlockClient(); if (IMG_Valid(image) && IMG_IsMainExecutable(image)) // 把你的代码放在这里 有些奇怪:我试过你的代码:它似乎工作。但是如果我的目标程序包含一个循环,我只会看到一次迭代的指令。我想要做的是跟踪每个指令...... 您的要求是执行动态分析。我向您展示的是静态分析,它仅在检测时使用一次。【参考方案2】:您需要添加一个分析例程,并将 IARG_REG_VALUE 传递给该例程。
VOID your_analysis_function(VOID * ip)
out << "ip:" << ip << endl;
VOID Instruction(INS ins, VOID *v)
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)your_analysis_function,
IARG_INST_PTR, IARG_REG_VALUE, IARG_END);
【讨论】:
谢谢。事实上,我真的不明白二进制文件是否真的启动了,或者 pintools 是否只是计算符号执行。如果我的二进制文件是 PIE,地址会怎样? 我不确定您所说的“二进制文件已启动”是什么意思。检测功能发生在 Pin jitting 期间,而分析功能发生在代码在 Pin 下执行时。如果您在输出中看到“ip:”,那么您的二进制文件实际上正在运行(在 Pin 下)。 换句话说,有没有办法让二进制文件检测仪器? Pin 是一个 dynamic 二进制检测引擎 - 这意味着它实际上启动并运行二进制。至于检测,虽然 Pin 创建了一个符合二进制预期的执行环境,但它不会伪装自己,因此很容易被检测到。 @Bob5421 你可以在这里找到详细的研究:re.public.polimi.it/retrieve/handle/11311/1030092/266288/…以上是关于使用英特尔 pintool 记录所有指令的主要内容,如果未能解决你的问题,请参考以下文章