/* Write a single memory map line to the console */ static void print_debug_map_line(RDebug *dbg, RDebugMap *map, ut64 addr, const char *input) { if (input[0] == 'q') { // "dmq" char buf[128]; char *name = (map->name && *map->name) ? r_str_newf ("%s.%s", map->name, r_str_rwx_i (map->perm)) : r_str_newf ("%08"PFMT64x".%s", map->addr, r_str_rwx_i (map->perm)); r_name_filter (name, 0); dbg->cb_printf ("0x%016"PFMT64x" - 0x%016"PFMT64x" %6s %5s %s\n", map->addr, map->addr_end, r_num_units (buf, map->addr_end - map->addr), r_str_rwx_i (map->perm), name); free (name); } else { char sizebuf[128]; const char *fmtstr = dbg->bits & R_SYS_BITS_64 ? "0x%016"PFMT64x" - 0x%016"PFMT64x" %c %s %6s %c %s %s %s%s%s\n" : "0x%08"PFMT64x" - 0x%08"PFMT64x" %c %s %6s %c %s %s %s%s%s\n"; const char *type = map->shared? "sys": "usr"; const char *flagname = dbg->corebind.getName ? dbg->corebind.getName (dbg->corebind.core, map->addr) : NULL; if (!flagname) { flagname = ""; } else if (map->name) { char *filtered_name = strdup (map->name); r_name_filter (filtered_name, 0); if (!strncmp (flagname, "map.", 4) && \ !strcmp (flagname + 4, filtered_name)) { flagname = ""; } free (filtered_name); } dbg->cb_printf (fmtstr, map->addr, map->addr_end, (addr>=map->addr && addr<map->addr_end)?'*':'-', type, r_num_units (sizebuf, map->size), map->user?'u':'s', r_str_rwx_i (map->perm), map->name?map->name:"?", map->file?map->file:"?", *flagname? " ; ": "", flagname); } }
static void printmetaitem(RAnal *a, RAnalMetaItem *d, int rad) { char *pstr, *str = r_str_escape (d->str); if (str) { if (d->type=='s' && !*str) { free (str); return; } if (d->type != 'C') { r_name_filter (str, 0); pstr = str; } else pstr = d->str; // r_str_sanitize (str); switch (rad) { case 'j': a->printf ("{\"offset\":%"PFMT64d", \"type\":\"%s\", \"name\":\"%s\"}", d->from, r_meta_type_to_string (d->type), str); break; case 0: a->printf ("0x%08"PFMT64x" %s\n", d->from, str); case 1: case '*': default: if (d->type == 'C') { a->printf ("\"%s %s\" @ 0x%08"PFMT64x"\n", r_meta_type_to_string (d->type), pstr, d->from); } else { a->printf ("%s %d 0x%08"PFMT64x" # %s\n", r_meta_type_to_string (d->type), d->size, d->from, pstr); } break; } free (str); } }
R_API void r_debug_map_list(RDebug *dbg, ut64 addr, const char *input) { int i; bool notfirst = false; RListIter *iter; RDebugMap *map; if (!dbg) { return; } switch (input[0]) { case 'j': // "dmj" add JSON opening array brace dbg->cb_printf ("["); break; case '*': // "dm*" dont print a header for r2 commands output break; default: // TODO: Find a way to only print headers if output isn't being grepped print_debug_map_line_header (dbg, input); } for (i = 0; i < 2; i++) { // Iterate over dbg::maps and dbg::maps_user RList *maps = (i == 0) ? dbg->maps : dbg->maps_user; r_list_foreach (maps, iter, map) { switch (input[0]) { case 'j': // "dmj" print_debug_map_json (dbg, map, notfirst); notfirst = true; break; case '*': // "dm*" { char *name = (map->name && *map->name) ? r_str_newf ("%s.%s", map->name, r_str_rwx_i (map->perm)) : r_str_newf ("%08"PFMT64x".%s", map->addr, r_str_rwx_i (map->perm)); r_name_filter (name, 0); dbg->cb_printf ("f map.%s 0x%08"PFMT64x" 0x%08"PFMT64x"\n", name, map->addr_end - map->addr + 1, map->addr); free (name); } break; case 'q': // "dmq" if (input[1] == '.') { // "dmq." if (addr >= map->addr && addr < map->addr_end) { print_debug_map_line (dbg, map, addr, input); } break; } print_debug_map_line (dbg, map, addr, input); break; case '.': if (addr >= map->addr && addr < map->addr_end) { print_debug_map_line (dbg, map, addr, input); } break; default: print_debug_map_line (dbg, map, addr, input); break; } } } if (input[0] == 'j') { // "dmj" add JSON closing array brace dbg->cb_printf ("]\n"); } }
static int bin_strings(RCore *r, int mode, int va) { char *q, str[R_FLAG_NAME_SIZE]; RBinSection *section; int hasstr, minstr, maxstr, rawstr; RBinString *string; RListIter *iter; RList *list; RBin *bin = r->bin; RBinFile * binfile = r_core_bin_cur (r); RBinPlugin *plugin = r_bin_file_cur_plugin (binfile); if (!binfile) return false; minstr = r_config_get_i (r->config, "bin.minstr"); maxstr = r_config_get_i (r->config, "bin.maxstr"); rawstr = r_config_get_i (r->config, "bin.rawstr"); binfile->rawstr = rawstr; if (!(hasstr = r_config_get_i (r->config, "bin.strings"))) { return 0; } if (!plugin) return 0; if (plugin->info && plugin->name) { if (strcmp (plugin->name, "any") == 0 && !rawstr) { return false; } } bin->minstrlen = minstr; minstr = bin->minstrlen; if ((list = r_bin_get_strings (bin)) == NULL) return false; if (IS_MODE_JSON (mode)) r_cons_printf ("["); if (IS_MODE_RAD (mode)) r_cons_printf ("fs strings"); if (IS_MODE_SET (mode) && r_config_get_i (r->config, "bin.strings")) { r_flag_space_set (r->flags, "strings"); r_cons_break (NULL, NULL); } r_list_foreach (list, iter, string) { const char *section_name, *type_string; ut64 paddr = string->paddr; ut64 vaddr = r_bin_get_vaddr (bin, paddr, string->vaddr); ut64 addr = va ? vaddr : paddr; if (string->length < minstr) continue; if (maxstr && string->length > maxstr) continue; section = r_bin_get_section_at (r_bin_cur_object (bin), paddr, 0); section_name = section ? section->name : "unknown"; type_string = string->type == 'w' ? "wide" : "ascii"; if (IS_MODE_SET (mode)) { char *f_name; if (r_cons_singleton()->breaked) break; r_meta_add (r->anal, R_META_TYPE_STRING, addr, addr + string->size, string->string); f_name = strdup (string->string); r_name_filter (f_name, R_FLAG_NAME_SIZE); snprintf (str, R_FLAG_NAME_SIZE, "str.%s", f_name); r_flag_set (r->flags, str, addr, string->size, 0); free (f_name); } else if (IS_MODE_SIMPLE (mode)) { r_cons_printf ("0x%"PFMT64x" %d %d %s\n", addr, string->size, string->length, string->string); } else if (IS_MODE_JSON (mode)) { q = r_base64_encode_dyn (string->string, -1); r_cons_printf ("%s{\"vaddr\":%"PFMT64d ",\"paddr\":%"PFMT64d",\"ordinal\":%d" ",\"size\":%d,\"length\":%d,\"section\":\"%s\"," "\"type\":\"%s\",\"string\":\"%s\"}", iter->p ? ",": "", vaddr, paddr, string->ordinal, string->size, string->length, section_name, type_string, q); free (q); } else if (IS_MODE_RAD (mode)) { char *f_name; f_name = strdup (string->string); r_name_filter (f_name, R_FLAG_NAME_SIZE); snprintf (str, R_FLAG_NAME_SIZE, "str.%s", f_name); r_cons_printf ("f str.%s %"PFMT64d" @ 0x%08"PFMT64x"\n" "Cs %"PFMT64d" @ 0x%08"PFMT64x"\n", f_name, string->size, addr, string->size, addr); free (f_name); } else { r_cons_printf ("vaddr=0x%08"PFMT64x" paddr=0x%08" PFMT64x" ordinal=%03u sz=%u len=%u " "section=%s type=%s string=%s\n", vaddr, paddr, string->ordinal, string->size, string->length, section_name, type_string, string->string); } } if (IS_MODE_JSON (mode)) r_cons_printf ("]"); if (IS_MODE_SET (mode)) r_cons_break_end (); return true; }
static void printmetaitem(RAnal *a, RAnalMetaItem *d, int rad) { char *pstr, *str; //eprintf ("%d %d\n", d->space, a->meta_spaces.space_idx); if (a->meta_spaces.space_idx != -1) { if (a->meta_spaces.space_idx != d->space) { return; } } str = r_str_escape (d->str); if (str || d->type == 'd') { if (d->type=='s' && !*str) { free (str); return; } if (!str) { pstr = ""; } else if (d->type != 'C') { r_name_filter (str, 0); pstr = str; } else pstr = d->str; // r_str_sanitize (str); switch (rad) { case 'j': a->cb_printf ("{\"offset\":%"PFMT64d", \"type\":\"%s\", \"name\":\"%s\"}", d->from, r_meta_type_to_string (d->type), str); break; case 0: case 1: case '*': default: switch (d->type) { case 'C': { const char *type = r_meta_type_to_string (d->type); char *s = sdb_encode ((const ut8*)pstr, -1); if (!s) s = strdup (pstr); if (rad) { if (!strcmp (type, "CCu")) { a->cb_printf ("%s base64:%s @ 0x%08"PFMT64x"\n", type, s, d->from); } else { a->cb_printf ("%s %s @ 0x%08"PFMT64x"\n", type, pstr, d->from); } } else { if (!strcmp (type, "CCu")) { char *mys = r_str_escape (pstr); a->cb_printf ("0x%08"PFMT64x" %s \"%s\"\n", d->from, type, mys); free (mys); } else { a->cb_printf ("0x%08"PFMT64x" %s \"%s\"\n", d->from, type, pstr); } } free (s); } break; case 'h': /* hidden */ case 's': /* string */ if (rad) { a->cb_printf ("%s %d @ 0x%08"PFMT64x" # %s\n", r_meta_type_to_string (d->type), (int)d->size, d->from, pstr); } else { // TODO: use b64 here a->cb_printf ("0x%08"PFMT64x" string[%d] \"%s\"\n", d->from, (int)d->size, pstr); } break; case 'd': /* data */ if (rad) { a->cb_printf ("%s %d @ 0x%08"PFMT64x"\n", r_meta_type_to_string (d->type), (int)d->size, d->from); } else { a->cb_printf ("0x%08"PFMT64x" data %s %d\n", d->from, r_meta_type_to_string (d->type), (int)d->size); } break; case 'm': /* magic */ case 'f': /* formatted */ if (rad) { a->cb_printf ("%s %d %s @ 0x%08"PFMT64x"\n", r_meta_type_to_string (d->type), (int)d->size, pstr, d->from); } else { const char *dtype = d->type=='m'?"magic":"format"; a->cb_printf ("0x%08"PFMT64x" %s %d %s\n", d->from, dtype, (int)d->size, pstr); } break; default: if (rad) { a->cb_printf ("%s %d 0x%08"PFMT64x" # %s\n", r_meta_type_to_string (d->type), (int)d->size, d->from, pstr); } else { // TODO: use b64 here a->cb_printf ("0x%08"PFMT64x" array[%d] %s %s\n", d->from, (int)d->size, r_meta_type_to_string (d->type), pstr); } break; } break; } if (str) free (str); } }