gpt4 book ai didi

c++ - 跟踪英特尔 PIN 中的 native 指令

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:08:02 27 4
gpt4 key购买 nike

<分区>

我正在使用 Intel PIN 工具对 C 程序的汇编指令进行一些分析。我有一个简单的 C 程序,它打印“Hello World”,我已经编译并生成了一个可执行文件。我有像这样从 gdb 生成的汇编指令跟踪-

Dump of assembler code for function main:
0x0000000000400526 <+0>: push %rbp
0x0000000000400527 <+1>: mov %rsp,%rbp
=> 0x000000000040052a <+4>: mov $0x4005c4,%edi
0x000000000040052f <+9>: mov $0x0,%eax
0x0000000000400534 <+14>: callq 0x400400 <printf@plt>
0x0000000000400539 <+19>: mov $0x0,%eax
0x000000000040053e <+24>: pop %rbp
0x000000000040053f <+25>: retq
End of assembler dump.

我运行了一个 pintool,将可执行文件作为输入,我正在执行指令跟踪并打印指令数。我希望跟踪来 self 的 C 程序的指令,并可能获取机器操作码并进行某种分析。我正在使用 C++ PIN 工具来计算指令数-

#include "pin.H"
#include <iostream>
#include <stdio.h>

UINT64 icount = 0;
using namespace std;

//====================================================================
// Analysis Routines
//====================================================================

void docount(THREADID tid) {
icount++;
}

//====================================================================
// Instrumentation Routines
//====================================================================

VOID Instruction(INS ins, void *v) {
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)docount, IARG_THREAD_ID, IARG_END);
}

VOID Fini(INT32 code, VOID *v) {
printf("count = %ld\n",(long)icount);
}

INT32 Usage() {
PIN_ERROR("This Pintool failed\n"
+ KNOB_BASE::StringKnobSummary() + "\n");
return -1;
}

int main(int argc, char *argv[]) {
if (PIN_Init(argc, argv)) return Usage();

PIN_InitSymbols();
PIN_AddInternalExceptionHandler(ExceptionHandler,NULL);
INS_AddInstrumentFunction(Instruction, 0);
PIN_AddFiniFunction(Fini, 0);
PIN_StartProgram();

return 0;
}

当我用这个工具运行我的hello world程序时,我得到icount = 81563。我知道PIN添加了自己的分析指令,但我不明白它是如何添加这么多指令的,而我没有我的 C 程序中有 10 多条指令。还有一种方法可以识别来 self 的代码和 PIN 生成的汇编指令。我似乎无法区分 PIN 生成的指令和来 self 的程序的指令。请帮忙!

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com