R_API int r_core_bin_set_by_fd (RCore *core, ut64 bin_fd) { if (r_bin_file_set_cur_by_fd (core->bin, bin_fd)) { r_core_bin_set_cur (core, r_core_bin_cur(core)); return R_TRUE; } return R_FALSE; }
R_API int r_core_bin_set_by_name(RCore *core, const char * name) { if (r_bin_file_set_cur_by_name (core->bin, name)) { r_core_bin_set_cur (core, r_core_bin_cur (core)); return true; } return false; }
R_API int r_core_bin_set_by_name (RCore *core, const char * name) { if (r_bin_file_set_cur_by_name (core->bin, name)) { r_core_bin_set_cur (core, r_core_bin_cur (core)); return R_TRUE; } return R_FALSE; }
R_API int r_core_bin_set_by_fd(RCore *core, ut64 bin_fd) { if (r_bin_file_set_cur_by_fd (core->bin, bin_fd)) { r_core_bin_set_cur (core, r_core_bin_cur(core)); return true; } return false; }
static int bin_strings (RCore *r, int mode, ut64 baddr, int va) { char *p, *q, str[R_FLAG_NAME_SIZE]; RBinSection *section; int hasstr, minstr, 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 R_FALSE; minstr = r_config_get_i (r->config, "bin.minstr"); 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) { if (!rawstr) { eprintf ("WARN: Use '-e bin.rawstr=true' or 'rabin2 -zz'" " to find strings on unknown file types\n"); return R_FALSE; } } if (bin->minstrlen == 0) bin->minstrlen = plugin->minstrlen? plugin->minstrlen: 4; if (minstr > 0 || bin->minstrlen <= 0) bin->minstrlen = R_MIN (minstr, 4); if ((list = r_bin_get_strings (bin)) == NULL) return R_FALSE; if ((mode & R_CORE_BIN_JSON)) { r_cons_printf ("["); r_list_foreach (list, iter, string) { ut64 vaddr = r_bin_get_vaddr (bin, baddr, string->vaddr, string->paddr); ut64 paddr = string->paddr; q = strdup (string->string); for (p=q; *p; p++) { if (*p=='"') *p = '\''; if (*p=='\\') *p = '/'; } r_cons_printf ("%s{\"vaddr\":%"PFMT64d ",\"paddr\":%"PFMT64d ",\"length\":%d,\"size\":%d," "\"type\":\"%s\",\"string\":\"%s\"}", iter->p? ",": "", vaddr, paddr, string->length, string->size, string->type=='w'?"wide":"ascii", q); free (q); }
static int bin_dwarf(RCore *core, int mode) { RBinDwarfRow *row; RListIter *iter; RList *list = NULL; RBinFile *binfile = r_core_bin_cur (core); RBinPlugin * plugin = r_bin_file_cur_plugin (binfile); if (!binfile) return false; if (plugin && plugin->lines) { list = plugin->lines (binfile); } else if (core->bin) { // TODO: complete and speed-up support for dwarf if (r_config_get_i (core->config, "bin.dwarf")) { RBinDwarfDebugAbbrev *da = NULL; da = r_bin_dwarf_parse_abbrev (core->bin, mode); r_bin_dwarf_parse_info (da, core->bin, mode); r_bin_dwarf_parse_aranges (core->bin, mode); list = r_bin_dwarf_parse_line (core->bin, mode); r_bin_dwarf_free_debug_abbrev (da); free (da); } } if (!list) return false; r_cons_break (NULL, NULL); r_list_foreach (list, iter, row) { if (r_cons_singleton()->breaked) break; if (mode) { // TODO: use 'Cl' instead of CC const char *path = row->file; char *line = r_file_slurp_line (path, row->line-1, 0); if (line) { r_str_filter (line, strlen (line)); line = r_str_replace (line, "\"", "\\\"", 1); line = r_str_replace (line, "\\\\", "\\", 1); } // TODO: implement internal : if ((mode & R_CORE_BIN_SET)) if ((mode & R_CORE_BIN_SET)) { char *cmt = r_str_newf ("%s:%d %s", row->file, row->line, line?line:""); r_meta_set_string (core->anal, R_META_TYPE_COMMENT, row->address, cmt); free (cmt); } else { r_cons_printf ("\"CC %s:%d %s\"@0x%"PFMT64x"\n", row->file, row->line, line?line:"", row->address); } free (line); } else { r_cons_printf ("0x%08"PFMT64x"\t%s\t%d\n", row->address, row->file, row->line); } } r_cons_break_end (); r_list_free (list); return true; }
static int bin_info(RCore *r, int mode) { int i, j; char str[R_FLAG_NAME_SIZE]; char size_str[32]; char baddr_str[32]; RBinInfo *info = r_bin_get_info (r->bin); RBinFile *binfile = r_core_bin_cur (r); const char *compiled = NULL; if (!binfile || !info) { if (mode & R_CORE_BIN_JSON) r_cons_printf ("{}"); return false; } compiled = get_compile_time (binfile->sdb); snprintf (size_str, sizeof (size_str), "%"PFMT64d, r_bin_get_size (r->bin)); snprintf (baddr_str, sizeof (baddr_str), "%"PFMT64d, info->baddr); if (IS_MODE_SET (mode)) { r_config_set (r->config, "file.type", info->rclass); r_config_set (r->config, "cfg.bigendian", info->big_endian ? "true" : "false"); if (info->rclass && !strcmp (info->rclass, "fs")) { r_config_set (r->config, "asm.arch", info->arch); r_core_cmdf (r, "m /root %s 0", info->arch); } else { if (info->lang) { r_config_set (r->config, "bin.lang", info->lang); } r_config_set (r->config, "asm.os", info->os); r_config_set (r->config, "asm.arch", info->arch); r_config_set (r->config, "anal.arch", info->arch); snprintf (str, R_FLAG_NAME_SIZE, "%i", info->bits); r_config_set (r->config, "asm.bits", str); r_config_set (r->config, "asm.dwarf", (R_BIN_DBG_STRIPPED &info->dbg_info) ? "false" : "true"); } } else if (IS_MODE_SIMPLE (mode)) { r_cons_printf ("arch %s\n", info->arch); r_cons_printf ("bits %d\n", info->bits); r_cons_printf ("os %s\n", info->os); r_cons_printf ("endian %s\n", info->big_endian? "big": "little"); } else if (IS_MODE_RAD (mode)) { if (info->type && !strcmp (info->type, "fs")) { r_cons_printf ("e file.type=fs\n"); r_cons_printf ("m /root %s 0\n", info->arch); } else { r_cons_printf ("e cfg.bigendian=%s\n" "e asm.bits=%i\n" "e asm.dwarf=%s\n", r_str_bool (info->big_endian), info->bits, r_str_bool (R_BIN_DBG_STRIPPED &info->dbg_info)); if (info->lang && *info->lang) { r_cons_printf ("e bin.lang=%s\n", info->lang); } if (info->rclass && *info->rclass) { r_cons_printf ("e file.type=%s\n", info->rclass); } if (info->os) { r_cons_printf ("e asm.os=%s\n", info->os); } if (info->arch) { r_cons_printf ("e asm.arch=%s\n", info->arch); } } } else { // XXX: if type is 'fs' show something different? if (IS_MODE_JSON (mode)) r_cons_printf ("{"); pair_bool ("pic", info->has_pi, mode, false); pair_bool ("canary", info->has_canary, mode, false); pair_bool ("nx", info->has_nx, mode, false); pair_bool ("crypto", info->has_crypto, mode, false); pair_bool ("va", info->has_va, mode, false); pair_str ("bintype", info->rclass, mode, false); pair_str ("class", info->bclass, mode, false); pair_str ("lang", info->lang, mode, false); pair_str ("arch", info->arch, mode, false); pair_int ("bits", info->bits, mode, false); pair_str ("machine", info->machine, mode, false); pair_str ("os", info->os, mode, false); pair_str ("subsys", info->subsystem, mode, false); pair_str ("endian", info->big_endian ? "big" : "little", mode, false); pair_bool ("stripped", R_BIN_DBG_STRIPPED & info->dbg_info, mode, false); pair_bool ("static", r_bin_is_static (r->bin), mode, false); pair_bool ("linenum", R_BIN_DBG_LINENUMS & info->dbg_info, mode, false); pair_bool ("lsyms", R_BIN_DBG_SYMS & info->dbg_info, mode, false); pair_bool ("relocs", R_BIN_DBG_RELOCS & info->dbg_info, mode, false); pair_str ("rpath", info->rpath, mode, false); pair_str ("binsz", size_str, mode, false); pair_str ("compiled", compiled, mode, false); pair_str ("guid", info->guid, mode, false); pair_str ("dbg_file", info->debug_file_name, mode, true); for (i = 0; info->sum[i].type; i++) { int len; RBinHash *h = &info->sum[i]; ut64 hash = r_hash_name_to_bits (h->type); RHash *rh = r_hash_new (true, hash); len = r_hash_calculate (rh, hash, (const ut8*) binfile->buf->buf+h->from, h->to); if (len < 1) eprintf ("Invaild wtf\n"); r_hash_free (rh); r_cons_printf ("%s\t%d-%dc\t", h->type, h->from, h->to+h->from); for (j = 0; j < h->len; j++) { r_cons_printf ("%02x", h->buf[j]); } r_cons_newline (); } if (IS_MODE_JSON (mode)) r_cons_printf ("}"); } return true; }
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 r_core_file_info (RCore *core, int mode) { const char *fn = NULL; int dbg = r_config_get_i (core->config, "cfg.debug"); RBinInfo *info = r_bin_get_info (core->bin); RBinFile *binfile = r_core_bin_cur (core); RCoreFile *cf = core->file; RBinPlugin *plugin = r_bin_file_cur_plugin (binfile); if (mode == R_CORE_BIN_JSON) r_cons_printf ("{"); if (mode == R_CORE_BIN_RADARE) return; if (info) { fn = info->file; switch (mode) { case R_CORE_BIN_JSON: r_cons_printf ("\"type\":\"%s\"," "\"os\":\"%s\"," "\"arch\":\"%s\"," "\"bits\":%d," "\"endian\":\"%s\"," , STR(info->type) , STR(info->os) , STR(info->machine) , info->bits , info->big_endian? "big": "little"); break; default: r_cons_printf ("type\t%s\n" "os\t%s\n" "arch\t%s\n" "bits\t%d\n" "endian\t%s\n" , STR(info->type) , STR(info->os) , STR(info->machine) , info->bits , info->big_endian? "big": "little"); break; } } else fn = (cf && cf->desc) ? cf->desc->name : NULL; if (cf && mode == R_CORE_BIN_JSON) { r_cons_printf ("\"file\":\"%s\"", fn); if (dbg) dbg = R_IO_WRITE | R_IO_EXEC; if (cf->desc) r_cons_printf (",\"fd\":%d", cf->desc->fd); r_cons_printf (",\"size\":%d", cf->size); r_cons_printf (",\"mode\":\"%s\"", r_str_rwx_i ( cf->rwx | dbg)); r_cons_printf (",\"block\":%d", core->blocksize); r_cons_printf (",\"uri\":\"%s\"", cf->uri); if (binfile) { if (binfile->curxtr) r_cons_printf (",\"packet\":\"%s\"", binfile->curxtr->name); if (plugin) r_cons_printf (",\"format\":\"%s\"", plugin->name); } r_cons_printf ("}"); } else if (cf) { //r_cons_printf ("# Core file info\n"); r_cons_printf ("file\t%s\n", fn); if (dbg) dbg = R_IO_WRITE | R_IO_EXEC; r_cons_printf ("fd\t%d\n", cf->desc->fd); r_cons_printf ("size\t0x%x\n", cf->size); r_cons_printf ("mode\t%s\n", r_str_rwx_i (cf->rwx | dbg)); r_cons_printf ("block\t0x%x\n", core->blocksize); r_cons_printf ("uri\t%s\n", cf->uri); if (binfile && binfile->curxtr) r_cons_printf ("packet\t%s\n", binfile->curxtr->name); if (plugin) r_cons_printf ("format\t%s\n", plugin->name); } }
static int bin_strings (RCore *r, int mode, ut64 baddr, 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 R_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")) { if (!rawstr) { #if 0 eprintf ("NOTE: Use '-e bin.rawstr=true' or 'r2 -zz' or '.!rabin2 -zz $FILE'" " to find strings on unknown file types\n"); #endif return R_FALSE; } } } #if 0 if (bin->minstrlen == 0) bin->minstrlen = minstr; else plugin->minstrlen? plugin->minstrlen: 4; #endif bin->minstrlen = minstr; #if 0 if (bin->minstrlen <= 0) bin->minstrlen = R_MIN (minstr, 4); #endif minstr = bin->minstrlen; if ((list = r_bin_get_strings (bin)) == NULL) return R_FALSE; if ((mode & R_CORE_BIN_JSON)) { r_cons_printf ("["); r_list_foreach (list, iter, string) { ut64 vaddr = r_bin_get_vaddr (bin, baddr, string->vaddr, string->paddr); ut64 paddr = string->paddr; if (maxstr && string->length>maxstr) continue; q = r_base64_encode_dyn (string->string, 0); if (string->length>minstr) { r_cons_printf ("%s{\"vaddr\":%"PFMT64d ",\"paddr\":%"PFMT64d ",\"length\":%d,\"size\":%d," "\"type\":\"%s\",\"string\":\"%s\"}", iter->p? ",": "", vaddr, paddr, string->length, string->size, string->type=='w'?"wide":"ascii", q); } free (q); }