/* XXX Implement r__bin_wr_scn_{ set, del } instead */ R_API ut64 r_bin_wr_scn_resize(RBin *bin, const char *name, ut64 size) { RBinFile *binfile = r_bin_cur (bin); RBinPlugin *plugin = r_bin_file_cur_plugin (binfile); if (plugin && plugin->write && plugin->write->scn_resize) { return plugin->write->scn_resize (bin->cur, name, size); } return false; }
R_API bool r_bin_wr_entry(RBin *bin, ut64 addr) { RBinFile *binfile = r_bin_cur (bin); RBinPlugin *plugin = r_bin_file_cur_plugin (binfile); if (plugin && plugin->write && plugin->write->entry) { return plugin->write->entry (bin->cur, addr); } return false; }
R_API bool r_bin_wr_addlib(RBin *bin, const char *lib) { RBinFile *binfile = r_bin_cur (bin); RBinPlugin *plugin = r_bin_file_cur_plugin (binfile); if (plugin && plugin->write && plugin->write->addlib) { return plugin->write->addlib (bin->cur, lib); } return false; }
R_API bool r_bin_wr_scn_perms(RBin *bin, const char *name, int perms) { RBinFile *binfile = r_bin_cur (bin); RBinPlugin *plugin = r_bin_file_cur_plugin (binfile); if (plugin && plugin->write && plugin->write->scn_perms) { return plugin->write->scn_perms (bin->cur, name, perms); } return false; }
R_API bool r_bin_wr_rpath_del(RBin *bin) { RBinFile *binfile = r_bin_cur (bin); RBinPlugin *plugin = r_bin_file_cur_plugin (binfile); if (plugin && plugin->write && plugin->write->rpath_del) { return plugin->write->rpath_del (bin->cur); } 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_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); }