VOID check_parameter_out(ADDRINT addr) { trace_enter(); if (call_stack.is_top_forgotten()) { trace_leave(); return; } FID fid = call_stack.top(); UINT64 sp = sp_stack.top(); if (sp + 1000 <= addr && addr < sp) { trace_leave(); return; } unsigned int param_val_size = 1 + nb_param_int[fid] + nb_param_int_stack[fid]; for (unsigned int pid = 1; pid < param_val_size; pid++) { if (param_val[fid][pid]->back() == addr) { nb_out[fid][pid]++; trace_leave(); return; } } trace_leave(); }
VOID fn_ret(CONTEXT *ctxt, UINT32 fid) { trace_enter(); counter += 1; if (!call_stack.is_top_forgotten()) { while (is_jump_stack.top()) { FID fid = call_stack.top(); if (is_instrumented[fid]) { param_t *new_ret = (param_t *) malloc(sizeof(param_t)); new_ret->fid = fid; new_ret->counter = counter; new_ret->val = val_from_reg(ctxt, 0); new_ret->is_addr = param_addr[fid][0]; param_out->push_front(new_ret); } call_stack.pop(); is_jump_stack.pop(); } FID fid = call_stack.top(); if (is_instrumented[fid]) { param_t *new_ret = (param_t *) malloc(sizeof(param_t)); new_ret->fid = fid; new_ret->counter = counter; new_ret->val = val_from_reg(ctxt, 0); new_ret->is_addr = param_addr[fid][0]; param_out->push_front(new_ret); } call_stack.pop(); is_jump_stack.pop(); } trace_leave(); return; }
VOID fn_ret(CONTEXT *ctxt) { trace_enter(); if (!call_stack.is_top_forgotten()) { FID fid = call_stack.top(); if (has_return[fid] == 1) { add_val(fid, ctxt, 0, 0); } } call_stack.pop(); sp_stack.pop(); trace_leave(); }
VOID fn_call(CONTEXT *ctxt, FID fid) { trace_enter(); call_stack.push(fid); UINT64 sp; PIN_GetContextRegval(ctxt, REG_RSP, (UINT8*) &sp); sp_stack.push(sp); nb_call[fid]++; unsigned int param_val_size = 1 + nb_param_int[fid] + nb_param_int_stack[fid]; for (unsigned int pid = 1; pid < param_val_size; pid++) { if (!param_is_not_addr[fid][pid]) add_val(fid, ctxt, pid, sp); } trace_leave(); }
VOID fn_call(CONTEXT *ctxt, FID fid, bool is_jump) { trace_enter(); call_stack.push(fid); is_jump_stack.push(is_jump); counter += 1; bool param_pushed = false; if (!is_instrumented[fid]) { trace_leave(); return; } for (unsigned int i = 1; i <= nb_p[fid]; i++) { if (!param_addr[fid][i]) continue; param_t *new_param = (param_t *) malloc(sizeof(param_t)); new_param->fid = fid; new_param->counter = counter; new_param->val = val_from_reg(ctxt, i); new_param->is_addr = param_addr[fid][i]; new_param->pos = i; param_in->push_front(new_param); param_pushed = true; } /* If the function is instrumented (ie for instance has an ADDR as a return value) AND was not logged yet, create a special entry to log the date of call */ if (!param_pushed) { param_t *new_addr = (param_t *) malloc(sizeof(param_t)); new_addr->fid = fid; new_addr->counter = counter; new_addr->val = 0; // val_from_reg(ctxt, i); new_addr->pos = 0; new_addr->is_addr = false; // true; param_in->push_front(new_addr); } trace_leave(); return; }