コード例 #1
0
ファイル: context_utils.cpp プロジェクト: KurSh/stoke-release
void StoreContext(const CONTEXT * ctxt)
{
    vector<REG> regs = GetTestRegs();
    int numOfRegs = regs.size();
    for (int r = 0; r < numOfRegs; ++r)
    {
        REG reg = regs[r];
        PIN_GetContextRegval(ctxt, reg, GetRegval(reg));
    }
}
コード例 #2
0
// There is no verification on the validity of the ID.
uint128 PINContextHandler::getSSERegisterValue(uint64 TritRegID) const
{
  REG reg                 = safecast(PINConverter::convertTritonReg2DBIReg(TritRegID));
  uint128 value       = 0;
  PIN_REGISTER tmp;

  if (!REG_valid(reg) || !(TritRegID >= ID_XMM0 && TritRegID <= ID_XMM15))
    throw std::runtime_error("Error: getSSERegisterValue() - Invalid PIN register id.");

  PIN_GetContextRegval(this->_ctx, reg, reinterpret_cast<uint8 *>(&tmp));

  value = *reinterpret_cast<uint128*>(&tmp);

  return value;
}
コード例 #3
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();
}
コード例 #4
0
ファイル: type.cpp プロジェクト: Frky/scat
VOID add_val(unsigned int fid, CONTEXT *ctxt, unsigned int pid, UINT64 sp) {
    trace_enter();

    if (param_val[fid][pid]->size() >= MAX_VALS_TO_COLLECT) {
        trace_leave();
        return;
    }

    UINT64 val;
    if (pid < 1 + nb_param_int[fid]) {
        PIN_GetContextRegval(ctxt, param_reg(pid), (UINT8*) &val);
    }
    else {
        unsigned int sp_offset = pid - (1 + nb_param_int[fid]);
        UINT64* addr = (UINT64*) (sp + sp_offset * 8);
        val = *addr;
    }

    if (val != 0)
        param_val[fid][pid]->push_front(val);

    trace_leave();
}