Exemple #1
0
bool MC_ReadBuffer (MemoryCache *mc, address adr, SIZE_T size, BYTE* outbuf)
{
	SIZE_T i;
	// FIXME: это временное решение. и тормозное, конечно
	for (i=0; i<size; i++)
		if (MC_ReadByte (mc, adr+i, &outbuf[i])==false)
			return false;
	return true;
};
Exemple #2
0
void handle_BPM(process *p, thread *t, int bp_no, CONTEXT *ctx, MemoryCache *mc)
{
    BP *bp=breakpoints[bp_no];
    BPM *bpm=bp->u.bpm;

    address a=bp->a->abs_address;
    bool b;
    REG val;
    const char* v_type;

    switch (bpm->width)
    {
        case 1:
            {
                v_type="BYTE"; 
                byte tmp;
                b=MC_ReadByte (mc, a, &tmp);
                oassert(b);
                val=tmp;
            };
            break;

        case 2:
            {
                v_type="WORD"; 
                wyde tmp;
                b=MC_ReadWyde (mc, a, &tmp);
                oassert(b);
                val=tmp;
            };
            break;

        case 4:
            {
                v_type="DWORD"; 
                DWORD tmp;
                b=MC_ReadTetrabyte (mc, a, &tmp);
                oassert(b);
                val=tmp;
            };
            break;

        case 8:
            {
#ifdef _WIN64
                v_type="QWORD"; 
                DWORD64 tmp;
                b=MC_ReadOctabyte (mc, a, &tmp);
                oassert(b);
                val=tmp;
#else
                oassert (0);
#endif
            };
            break;

        default:
            oassert(0);
            fatal_error();
    };

    strbuf sb_sym=STRBUF_INIT, sb_bp_adr=STRBUF_INIT;
    address PC=CONTEXT_get_PC(ctx);
    process_get_sym (p, PC, true, true, &sb_sym);
    address_to_string(bp->a, &sb_bp_adr);

    dump_PID_if_need(p); dump_TID_if_need(p, t);
    L ("(%d) some code at %s (0x" PRI_ADR_HEX ") %s %s variable at %s (it contain 0x" PRI_REG_HEX 
            " after execution of that instruction)\n",
            bp_no, sb_sym.buf, PC, bpm->t==BPM_type_RW ? "reading or writting" : "writting", 
            v_type, sb_bp_adr.buf, val);

    //MC_WriteOctabyte(mc, bp->a->abs_address, 0); // can be option?
    
    strbuf_deinit(&sb_bp_adr);
    strbuf_deinit(&sb_sym);
};
Exemple #3
0
bool Da_op_get_value_of_op (struct Da_op *op, address * rt_adr, const CONTEXT * ctx, struct MemoryCache *mem, 
        const char *fname, unsigned fileline, obj *result, unsigned ins_prefixes, address FS)
{
    bool b;

    if (op->type==DA_OP_TYPE_REGISTER)
    {
        oassert (op->reg != R_ABSENT);
        // get from ctx
        X86_register_get_value (op->reg, ctx, result);
        return true;
    };

    if (op->type==DA_OP_TYPE_VALUE)
    {
        obj_copy2 (result, &op->val._v);
        return true;
    };

    if (op->type==DA_OP_TYPE_VALUE_IN_MEMORY)
    {
        *rt_adr=(REG)Da_op_calc_adr_of_op (op, ctx, mem, ins_prefixes, FS);
                                      
	//if ((*rt_adr)&(~0x7fffff0f000) == 0x7fffffd0000+2)
        if(0)
	{
		printf ("%s() line %d adr=0x"PRI_REG_HEX"\n", __FUNCTION__, __LINE__, *rt_adr);
	};

        switch (op->value_width_in_bits)
        {
        case 8:
            {
                BYTE out;
                b=MC_ReadByte (mem, *rt_adr, &out);
                if (b)
                {
                    obj_byte2((uint8_t)out, result);
                    return true;
                }
                else
                    return false;
            };
        case 16:
            {
                WORD out;
                b=MC_ReadWyde (mem, *rt_adr, &out);
                if (b)
                {
                    obj_wyde2((uint16_t)out, result);
                    return true;
                }
                else
                    return false;
            };
        case 32:
            {
                DWORD out;
                b=MC_ReadTetrabyte (mem, *rt_adr, &out);
                if (b)
                {
                    obj_tetra2((uint32_t)out, result);
                    return true;
                }
                else
                    return false;
            };
        case 64:
            {
                DWORD64 out;
                b=MC_ReadOctabyte (mem, *rt_adr, &out);
                if (b)
                {
                    obj_octa2((uint64_t)out, result);
                    return true;
                }
                else
                    return false;
            };
        case 128:
            {
                M128A xmm;
                if (MC_ReadBuffer (mem, *rt_adr, sizeof (M128A), (BYTE*)&xmm)==false)
                    return false;
                obj_xmm2 ((uint8_t*)&xmm, result);
                return true;
            };
        default:
            oassert(!"unknown value_width_in_bits");
            fatal_error();
            break;
        };

        oassert(0);
    };

#if 0
	L ("%s(): type=%d!\n", __FUNCTION__, type);
#endif
	oassert(0); // should not be here
    fatal_error();
};