본문 바로가기
pintool

RDTSC

by sonysame 2018. 10. 17.
#include <stdio.h>
#include "pin.H"

FILE *trace;


bool flag = false;
unsigned int EAX;
VOID change_eax_for_RDTSC(ADDRINT insAddr, CONTEXT *ctx, ADDRINT * pEAX) {
   if (flag == false) {
      EAX = *pEAX;
      flag = true;
   }
   else {
      *pEAX = EAX + 10;
   }
}

VOID ImageLoad(IMG img, VOID *v)
{
   if (IMG_IsMainExecutable(img)) {
      for (SEC sec = IMG_SecHead(img); SEC_Valid(sec); sec = SEC_Next(sec)) {
         for (RTN rtn = SEC_RtnHead(sec); RTN_Valid(rtn); rtn = RTN_Next(rtn)) {
            RTN_Open(rtn);
            for (INS ins = RTN_InsHead(rtn); INS_Valid(ins); ins = INS_Next(ins)) {
               if (INS_Opcode(ins) == XED_ICLASS_RDTSC) {
                  INS_InsertPredicatedCall(ins, IPOINT_AFTER, (AFUNPTR)change_eax_for_RDTSC,
                     IARG_ADDRINT, "change_eax_for_RDTSC",
                     IARG_CONTEXT,
                     IARG_REG_REFERENCE, REG_EAX,
                     IARG_END);
               }
            }
            RTN_Close(rtn);
         }
      }
   }
}



VOID Fini(INT32 code, VOID *v)
{
   fprintf(trace, "#eof\n");
   fclose(trace);
}
/* ===================================================================== */
/* Main                                                                  */
/* ===================================================================== */

int main(int argc, char * argv[])
{
   trace = fopen("itrace.out", "w");
   if (PIN_Init(argc, argv)) return -1;
   IMG_AddInstrumentFunction(ImageLoad, 0);
   PIN_AddFiniFunction(Fini, 0);
   PIN_StartProgram();
   return 0;
}

'pintool' 카테고리의 다른 글

ex  (0) 2018.10.17
memory break_inline  (0) 2018.10.17
내장함수의 리턴값 바꾸기  (1) 2018.10.17
helloworld출력 프로그램에서 출력하는 문자열 바꾸기  (0) 2018.10.15
Find executable img, section, code  (0) 2018.10.12