示例#1
0
文件: type.cpp 项目: Frky/scat
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();
}
示例#2
0
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;
}
示例#3
0
文件: type.cpp 项目: Frky/scat
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();
}
示例#4
0
文件: type.cpp 项目: Frky/scat
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();
}
示例#5
0
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;
}