使用PIN删除指令

时间:2017-10-08 03:16:18

标签: c++ c assembly intel-pin

我正在使用英特尔PIN工具模拟一些新指令并检查相应的结果。为此,我使用x86_64的非法操作码来表示我的指令。例如,操作码0x16,0x17在x86_64中是非法的。它代表我的指令操作码。我正在使用C程序生成可执行文件,然后将其传递给Pintool。我正在使用的C程序就是这个 -

#include <stdio.h>

int main()
{
    asm(".byte 0x16");
    asm(".byte 0x17");
    return 0;
}

因此,如果我们看到指令跟踪0x16和0x17将显示为错误的指令,并且如果我们尝试运行可执行文件,我们得到 -

Illegal instruction (core dumped)

预期为0x16,0x17在x86_64中是非法的,因此可执行文件不应通过。我使用这个可执行文件作为我的Pintool的输入,它检查指令跟踪,因此在跟踪中会遇到0x16和0x17。

我正在使用的Pintool就是这个 -

#include "pin.H"
#include <iostream>
#include <fstream>
#include <cstdint>

UINT64 icount = 0;

using namespace std;

KNOB<string> KnobOutputFile(KNOB_MODE_WRITEONCE, "pintool", "o", "test.out","This pin tool simulates ULI");

FILE * op;
//====================================================================
// Analysis Routines
//====================================================================

VOID simulate_ins(VOID *ip, UINT32 size) { 
    fprintf(op,"Wrong instruction encountered here\n");
    // Do something based on the instruction
}

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

VOID Instruction(INS ins, void *v) {

    UINT8 opcodeBytes[15];
    UINT64 fetched = PIN_SafeCopy(&opcodeBytes[0],(void *)INS_Address(ins),INS_Size(ins));

    if (fetched != INS_Size(ins))
        fprintf(op,"\nBad\n");

    else {

        if(opcodeBytes[0]==0x16 || opcodeBytes[0]==0x17) {
            INS_InsertCall( ins, IPOINT_BEFORE, (AFUNPTR)simulate_ins, IARG_INST_PTR, IARG_UINT64, INS_Size(ins) , IARG_END);
            INS_Delete(ins);
        }

}

VOID Fini(INT32 code, VOID *v) {
    //Display some end result
}

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

int main(int argc, char *argv[]) 
{

    op = fopen("test.out", "w");

    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;
}

所以我正在提取我的汇编操作码,如果第一个字节是0x16或0x17,我将指令发送到我的分析例程,然后删除指令。但是,当我在可执行文件上运行此Pintool时,仍然会收到Illegal指令(核心转储)错误,并且我的代码无法运行。我的理解是每次在跟踪中遇到新指令时调用Instrumentation例程,并且在执行指令之前调用分析例程。在这里,我正在检查操作码,并根据结果将代码发送到分析例程并删除指令。我将在分析例程中模拟我的新指令,因此,我只需删除旧指令,让程序继续进行,并确保它再次给出非法指令错误。

我做错了什么?

0 个答案:

没有答案