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