인텔 PIN을 사용하여 응용 프로그램의 지침을 수정하고 있습니다. 나는 참고로이 링크에서 Safecopy() 예를 사용하고 -PIN의 응용 프로그램 수정 수정
https://software.intel.com/sites/landingpage/pintool/docs/81205/Pin/html/index.html#SafeCopy
I 다음 샘플 C의 프로그램 -
int main()
{
asm(".byte 0x16");
return 0;
}
0 * 16는 x86_64의에서 불법하고 난 실행 파일을 실행할 때 그것은 예상대로 다음과 같은 오류 표시 -
Illegal instruction (core dumped)
을 내가 입력으로 위의 실행 파일을 받아 불법 난을 수정하는 pintool이 nstruction 0x16 다른 것을하기 위해.
#include "pin.H"
#include <iostream>
#include <fstream>
using namespace std;
KNOB<string> KnobOutputFile(KNOB_MODE_WRITEONCE, "pintool", "o", "test.out","This pin tool simulates ULI");
FILE * op;
//====================================================================
// Analysis Routines
//====================================================================
VOID analysis_routine(VOID *ip, UINT32 size)
{
fprintf(op,"16 came to analysis routine\n\n");
}
//====================================================================
// 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)
{
fprintf(op,"\n16 came to instrumentation routine\n");
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)analysis_routine, IARG_INST_PTR, IARG_UINT64, INS_Size(ins) , IARG_END);
INS_Delete(ins);
}
}
}
VOID Fini(INT32 code, VOID *v)
{
}
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();
INS_AddInstrumentFunction(Instruction, 0);
PIN_AddFiniFunction(Fini, 0);
PIN_StartProgram();
return 0;
}
을 계측 루틴 명령은 매번 실행되는 새로운 지시가 발생하고 명령은 다음과 같이 실행되기 전에 내 코드에 따라, 분석 루틴이 호출 내 이해에 따르면 - 다음과 같이
내 Pintool입니다 내 계측 함수에서 IPOINT_BEFORE 인수를 사용하여 분석 루틴을 호출합니다. 따라서 내 opcode를 확인하고 0x16이면 분석 루틴을 호출하고 원래 명령을 삭제합니다. 설치가 불법이고 삭제 되었기 때문에 아무런 문제없이 내 추적이 더 진행되어야합니다.
그러나이 논리를 사용하더라도 내 불법적 인 명령이 실행되고 내 프로그램이 충돌하고 잘못된 명령 오류가 발생하는 것으로 보입니다. 실행하기 전에 명령을 삭제하는 것처럼 보이고 Pin 자습서에서 같은 예제를 사용하고 있으므로이 문제를 이해할 수 없습니다.
내가 잘못 생각하면 어떤 아이디어가 있습니까? 또한 내가 위의 어느 곳에서든지 틀린 경우에 또한 나를 정정하십시오. 내 이해에 따라 계측 루틴은 명령이 실행되기 전에 호출되므로 해당 시간에도 명령을 수정할 수 있습니다. 내가 틀렸다면 나를 바로 잡아주세요.
올바른 주소로 올바른 바이트를 바꾸시겠습니까? 문제의 원인이되는 1 바이트 만 바꾸는 것이 확실합니까? 해당 단일 바이트를 다른 바이트 패턴으로 만 바꾸고 있습니까? 0x16은 자체적으로 법적 명령이 아닐 수도 있지만 더 큰 명령의 일부로 해석되지 않는 것을 어떻게 확인합니까? – nitzanms