R_API RList *r_core_asm_bwdisassemble (RCore *core, ut64 addr, int n, int len) { RList *hits = r_core_asm_hit_list_new(); RAsmOp op; // len = n * 32; // if (n > core->blocksize) n = core->blocksize; ut8 *buf; ut64 instrlen = 0, at = 0; ut32 idx = 0, hit_count = 0; int numinstr, asmlen, ii; RAsmCode *c; if (len<1) return NULL; buf = (ut8 *)malloc (len); if (hits == NULL || buf == NULL ){ if (hits) { r_list_free (hits); } free (buf); return NULL; } if (r_io_read_at (core->io, addr-len, buf, len) != len) { if (hits) { r_list_free (hits); } free (buf); return NULL; } for (idx = 1; idx < len; ++idx) { if (r_cons_singleton ()->breaked) break; at = addr - idx; hit_count = 0; c = r_asm_mdisassemble (core->assembler, buf+(len-idx), idx); if (strstr(c->buf_asm, "invalid") || strstr(c->buf_asm, ".byte")) { r_asm_code_free(c); continue; } numinstr = 0; asmlen = strlen(c->buf_asm); for(ii = 0; ii < asmlen; ++ii) { if (c->buf_asm[ii] == '\n') ++numinstr; } r_asm_code_free(c); if (numinstr >= n || idx > 32 * n) { break; } } at = addr - idx; hit_count = 0; r_asm_set_pc (core->assembler, at); at = addr-idx; for ( hit_count = 0; hit_count < n; hit_count++) { instrlen = r_asm_disassemble (core->assembler, &op, buf+(len-(addr-at)), addr-at); add_hit_to_hits(hits, at, instrlen, true); at += instrlen; } free (buf); return hits; }
R_API RList *r_core_asm_bwdisassemble (RCore *core, ut64 addr, int n, int len) { RList *hits = r_core_asm_hit_list_new(); RAsmOp op; ut8 *buf; ut64 buf_addr, instrlen = 0, at = 0; ut32 idx = 0, hit_count = 0, buf_len = 0; int numinstr, ii; RAsmCode *c; if (!hits) return NULL; buf_addr = addr - len; buf_len = len; buf = (ut8 *)malloc (buf_len); if (!buf) { r_list_free (hits); return NULL; } if (r_io_read_at (core->io, buf_addr, buf, buf_len) != buf_len) { r_list_free (hits); free (buf); return NULL; } if (!memcmp (buf, "\xff\xff\xff\xff", R_MIN (4, buf_len))) { eprintf ("error reading at 0x%08"PFMT64x"\n", buf_addr); r_list_free (hits); free (buf); return NULL; } if (n<0) n = -n; for (idx = 1; idx < len; idx++) { if (r_cons_singleton ()->breaked) break; at = addr - idx; hit_count = 0; r_asm_set_pc (core->assembler, at); // XXX: the disassemble errors are because of this line. mdisasm must not be used here //c = r_asm_mdisassemble (core->assembler, buf+idx, buf_len-idx); //+buf_len-idx, idx); c = r_asm_mdisassemble (core->assembler, buf+buf_len-idx, idx); // XXX: relaying on string contents in the buf_asm is a bad idea if (strstr (c->buf_asm, "invalid") || strstr (c->buf_asm, ".byte")) { r_asm_code_free (c); continue; } //eprintf ("-->(%x)(%s)\n", at, c->buf_asm); for (numinstr = ii = 0; c->buf_asm[ii] ; ii++) { if (c->buf_asm[ii] == '\n') numinstr++; } //eprintf ("mdisasm worked! for 0x%llx with %d\n", addr-len+idx, numinstr); r_asm_code_free (c); if (numinstr >= n || idx > 32 * n) { //eprintf ("idx = %d len = %d ninst = %d n = %d\n", idx, len, numinstr, n); break; } //eprintf ("idx = %d len = %d\n", idx, len); } at = addr - idx; hit_count = 0; for (hit_count = 0; hit_count < n; hit_count++) { if (r_cons_singleton ()->breaked) break; r_asm_set_pc (core->assembler, at); instrlen = r_asm_disassemble (core->assembler, &op, buf+buf_len-(addr-at), addr-at); //addr-at); // eprintf ("INST LEN = %d\n", instrlen); if (instrlen<1) { eprintf ("dissasm failed at %llx\n", at); instrlen = 1; // break; } add_hit_to_hits (hits, at, instrlen, R_TRUE); at += instrlen; } free (buf); return hits; }
R_API RList *r_core_asm_bwdisassemble(RCore *core, ut64 addr, int n, int len) { RAsmOp op; // len = n * 32; // if (n > core->blocksize) n = core->blocksize; ut8 *buf; ut64 at; ut32 idx = 0, hit_count; int numinstr, asmlen, ii; int addrbytes = core->assembler->addrbytes; RAsmCode *c; RList *hits = r_core_asm_hit_list_new(); if (!hits) return NULL; len = R_MIN (len - len % addrbytes, addrbytes * addr); if (len < 1) { r_list_free (hits); return NULL; } buf = (ut8 *)malloc (len); if (!buf) { if (hits) { r_list_free (hits); } return NULL; } else if (!hits) { free (buf); return NULL; } len = len > addr ? addr : len; if (!r_io_read_at (core->io, addr - len, buf, len)) { r_list_free (hits); free (buf); return NULL; } for (idx = addrbytes; idx < len; idx += addrbytes) { if (r_cons_singleton ()->breaked) break; c = r_asm_mdisassemble (core->assembler, buf+(len-idx), idx); if (strstr (c->buf_asm, "invalid") || strstr (c->buf_asm, ".byte")) { r_asm_code_free(c); continue; } numinstr = 0; asmlen = strlen (c->buf_asm); for(ii = 0; ii < asmlen; ++ii) { if (c->buf_asm[ii] == '\n') ++numinstr; } r_asm_code_free(c); if (numinstr >= n || idx > 16 * n) { // assume average instruction length <= 16 break; } } at = addr - idx / addrbytes; r_asm_set_pc (core->assembler, at); for (hit_count = 0; hit_count < n; hit_count++) { int instrlen = r_asm_disassemble (core->assembler, &op, buf + len - addrbytes*(addr-at), addrbytes * (addr-at)); add_hit_to_hits (hits, at, instrlen, true); at += instrlen; } free (buf); return hits; }
static int cb(RDiff *d, void *user, RDiffOp *op) { int i; //, diffmode = (int)(size_t)user; char s[256]; if (showcount) { count++; return 1; } switch (diffmode) { case 'U': // 'U' in theory never handled here case 'u': if (op->a_len > 0) { readstr (s, sizeof (s), op->a_buf, op->a_len); if (*s) { if (!quiet) printf (Color_RED); if (r_mem_is_printable ((const ut8*)s, R_MIN (strlen (s), 5))) { printf ("- %s\n", s); } else { printf ("-:"); int len = op->a_len; //R_MIN (op->a_len, strlen (op->a_buf)); for (i = 0; i < len; i++) { printf ("%02x", op->a_buf[i]); } printf (" \"%s\"\n", op->a_buf); } if (!quiet) printf (Color_RESET); } } if (op->b_len > 0) { readstr (s, sizeof (s), op->b_buf, op->b_len); if (*s) { if (!quiet) printf (Color_GREEN); if (r_mem_is_printable ((const ut8*)s, R_MIN (strlen (s), 5))) { printf ("+ %s\n", s); } else { printf ("+:"); for (i = 0; i < op->b_len; i++) { printf ("%02x", op->b_buf[i]); } printf (" \"%s\"\n", op->b_buf); } if (!quiet) printf (Color_RESET); } } break; case 'r': if (disasm) { eprintf ("r2cmds (-r) + disasm (-D) not yet implemented\n"); } if (op->a_len == op->b_len) { printf ("wx "); for (i = 0; i < op->b_len; i++) { printf ("%02x", op->b_buf[i]); } printf (" @ 0x%08"PFMT64x"\n", op->b_off); } else { if (op->a_len > 0) { printf ("r-%d @ 0x%08"PFMT64x"\n", op->a_len, op->a_off + delta); } if (op->b_len > 0) { printf ("r+%d @ 0x%08"PFMT64x"\n", op->b_len, op->b_off + delta); printf ("wx "); for (i = 0; i < op->b_len; i++) { printf ("%02x", op->b_buf[i]); } printf (" @ 0x%08"PFMT64x"\n", op->b_off+delta); } delta += (op->b_off - op->a_off); } return 1; case 'j': if (disasm) { eprintf ("JSON (-j) + disasm (-D) not yet implemented\n"); } if (json_started) { printf (",\n"); } json_started = 1; printf ("{\"offset\":%"PFMT64d",", op->a_off); printf("\"from\":\""); for (i = 0; i < op->a_len; i++) { printf ("%02x", op->a_buf[i]); } printf ("\", \"to\":\""); for (i = 0; i < op->b_len; i++) { printf ("%02x", op->b_buf[i]); } printf ("\"}"); //,\n"); return 1; case 0: default: if (disasm) { printf ("--- 0x%08"PFMT64x"\n", op->a_off); if (!core) { core = opencore (file); if (arch) { r_config_set (core->config, "asm.arch", arch); } if (bits) { r_config_set_i (core->config, "asm.bits", bits); } } if (core) { RAsmCode *ac = r_asm_mdisassemble (core->assembler, op->a_buf, op->a_len); printf ("%s\n", ac->buf_asm); //r_asm_code_free (ac); } } else { printf ("0x%08"PFMT64x" ", op->a_off); for (i = 0; i < op->a_len; i++) { printf ("%02x", op->a_buf[i]); } } if (disasm) { printf ("+++ 0x%08"PFMT64x"\n", op->b_off); if (!core) { core = opencore (NULL); } if (core) { RAsmCode *ac = r_asm_mdisassemble (core->assembler, op->b_buf, op->b_len); printf ("%s\n", ac->buf_asm); //r_asm_code_free (ac); } } else { printf (" => "); for (i = 0; i < op->b_len; i++) { printf ("%02x", op->b_buf[i]); } printf (" 0x%08"PFMT64x"\n", op->b_off); } return 1; } return 0; }
static int cb(RDiff *d, void *user, RDiffOp *op) { int i; //, diffmode = (int)(size_t)user; if (showcount) { count++; return 1; } switch (diffmode) { case 'r': if (disasm) { eprintf ("r2cmds (-r) + disasm (-D) not yet implemented\n"); } if (op->a_len == op->b_len) { printf ("wx "); for (i=0; i<op->b_len; i++) printf ("%02x", op->b_buf[i]); printf (" @ 0x%08"PFMT64x"\n", op->b_off); } else { if ((op->a_len)>0) printf ("r-%d @ 0x%08"PFMT64x"\n", op->a_len, op->a_off+delta); if (op->b_len> 0) { printf ("r+%d @ 0x%08"PFMT64x"\n", op->b_len, op->b_off+delta); printf ("wx "); for (i=0; i<op->b_len; i++) printf ("%02x", op->b_buf[i]); printf (" @ 0x%08"PFMT64x"\n", op->b_off+delta); } delta += (op->b_off - op->a_off); } return 1; case 'j': if (disasm) { eprintf ("JSON (-j) + disasm (-D) not yet implemented\n"); } if (json_started) printf(",\n"); json_started = 1; printf ("{\"offset\":%"PFMT64d",", op->a_off); printf("\"from\":\""); for (i = 0;i<op->a_len;i++) printf ("%02x", op->a_buf[i]); printf ("\", \"to\":\""); for (i=0; i<op->b_len; i++) printf ("%02x", op->b_buf[i]); printf ("\"}"); //,\n"); return 1; case 0: default: if (disasm) { printf ("--- 0x%08"PFMT64x"\n", op->a_off); if (!core) { core = opencore (file); if (arch) { r_config_set (core->config, "asm.arch", arch); } if (bits) { r_config_set_i (core->config, "asm.bits", bits); } } if (core) { RAsmCode *ac = r_asm_mdisassemble (core->assembler, op->a_buf, op->a_len); printf ("%s\n", ac->buf_asm); //r_asm_code_free (ac); } } else { printf ("0x%08"PFMT64x" ", op->a_off); for (i = 0; i < op->a_len; i++) printf ("%02x", op->a_buf[i]); } if (disasm) { printf ("+++ 0x%08"PFMT64x"\n", op->b_off); if (!core) { core = opencore (NULL); } if (core) { RAsmCode *ac = r_asm_mdisassemble (core->assembler, op->b_buf, op->b_len); printf ("%s\n", ac->buf_asm); //r_asm_code_free (ac); } } else { printf (" => "); for (i=0; i < op->b_len; i++) printf ("%02x", op->b_buf[i]); printf (" 0x%08"PFMT64x"\n", op->b_off); } return 1; } }