Ejemplo n.º 1
0
	r_list_foreach (bpargs, iter, var) {
                char *tmpf = NULL;
                if (var->delta < 10) {
                        tmpf = "%d(%s)";
                } else if (var->delta > 0) {
                        tmpf = "0x%x(%s)";
                } else {
                        tmpf = "-0x%x(%s)";
                }
                oldstr = r_str_newf (tmpf, r_num_abs (var->delta),
			anal->reg->name[R_REG_NAME_BP]);
                if (ucase) {
                        char *comma = strchr (oldstr, ',');
                        if (comma) {
                                *comma = 0;
                                r_str_case (oldstr, true);
                                *comma = ',';
                        }
                }
                if (strstr (tstr, oldstr)) {
                        char *newstr = (p->localvar_only) ? r_str_newf ("(%s)", var->name):
				r_str_newf ("%s%s(%s)", var->delta > 0 ? "" : "-",
						var->name, anal->reg->name[R_REG_NAME_SP]);
                        tstr = r_str_replace (tstr, oldstr, newstr, 1);
                        free (newstr);
                        free (oldstr);
                        break;
                }
                free (oldstr);
	}
Ejemplo n.º 2
0
Archivo: io.c Proyecto: Rogunix/radare2
/* moves bytes up (+) or down (-) within the specified range */
R_API int r_io_shift(RIO *io, ut64 start, ut64 end, st64 move) {
	ut8 *buf;
	ut64 chunksize = 0x10000;
	ut64 rest, src, shiftsize = r_num_abs (move);
	if (!shiftsize || (end-start) <= shiftsize) return R_FALSE;
	rest = (end-start) - shiftsize;

	if (!(buf = malloc (chunksize))) return R_FALSE;

	if (move>0) src = end-shiftsize;
	else src = start+shiftsize;

	while (rest>0) {
		if (chunksize>rest) chunksize=rest;
		if (move>0) src -= chunksize;

		r_io_read_at (io, src, buf, chunksize);
		r_io_write_at (io, src+move, buf, chunksize);

		if (move<0) src += chunksize;
		rest -= chunksize;
	}
	free (buf);
	return R_TRUE;
}
Ejemplo n.º 3
0
static bool varsub(RParse *p, RAnalFunction *f, ut64 addr, int oplen, char *data, char *str, int len) {
	RAnalVar *var;
	RListIter *iter;
	char *oldstr;
	char *tstr = strdup (data);
	RAnal *anal = p->analb.anal;

	if (!p->varlist) {
		free (tstr);
		return false;
	}
	RList *bpargs = p->varlist (anal, f, 'b');
	RList *spargs = p->varlist (anal, f, 's');
	const bool ucase = IS_UPPER (*tstr);
	r_list_foreach (spargs, iter, var) {
		char *tmpf;
		//TODO: honor asm pseudo
		if (var->delta < 10) {
			tmpf = "%d(%s)";
		} else if (var->delta > 0) {
			tmpf = "0x%x(%s)";
		} else {
			tmpf = "-0x%x(%s)";
		}
		oldstr = r_str_newf (tmpf, r_num_abs(var->delta), anal->reg->name[R_REG_NAME_SP]);
		if (ucase) {
			char *comma = strchr (oldstr, ',');
                        if (comma) {
                                *comma = 0;
                                r_str_case (oldstr, true);
                                *comma = ',';
                        }
                }
		if (strstr (tstr, oldstr)) {
			char *newstr = (p->localvar_only) ? r_str_newf ("(%s)", var->name):
				r_str_newf ("%s%s(%s)", var->delta > 0 ? "" : "-",
						var->name, anal->reg->name[R_REG_NAME_SP]);
			tstr = r_str_replace (tstr, oldstr, newstr, 1);
			free (newstr);
			free (oldstr);
			break;
		}
		free (oldstr);
	}