Implement rabin -Vj for ELF files (#9345)

This commit is contained in:
Giuseppe 2018-02-08 11:19:45 +01:00 committed by radare
parent b04fddc260
commit 66569c5c7e

View File

@ -2984,7 +2984,7 @@ static void bin_pe_versioninfo(RCore *r) {
} while (sdb);
}
static void bin_elf_versioninfo(RCore *r) {
static void bin_elf_versioninfo(RCore *r, int mode) {
const char *format = "bin/cur/info/versioninfo/%s%d";
char path[256] = {0};
int num_versym = 0;
@ -2992,6 +2992,8 @@ static void bin_elf_versioninfo(RCore *r) {
int num_version = 0;
Sdb *sdb = NULL;
const char *oValue = NULL;
bool firstit_for_versym = true;
if (IS_MODE_JSON (mode)) { r_cons_printf ("{\"versym\":["); }
for (;; num_versym++) {
snprintf (path, sizeof (path), format, "versym", num_versym);
if (!(sdb = sdb_ns_path (r->sdb, path, 0))) {
@ -3004,9 +3006,17 @@ static void bin_elf_versioninfo(RCore *r) {
const char *section_name = sdb_const_get (sdb, "section_name", 0);
const char *link_section_name = sdb_const_get (sdb, "link_section_name", 0);
r_cons_printf ("Version symbols section '%s' contains %"PFMT64u" entries:\n", section_name, num_entries);
r_cons_printf (" Addr: 0x%08"PFMT64x" Offset: 0x%08"PFMT64x" Link: %x (%s)\n",
(ut64)addr, (ut64)offset, (ut32)link, link_section_name);
if (IS_MODE_JSON (mode)) {
if (!firstit_for_versym) { r_cons_printf (","); }
r_cons_printf ("{\"section_name\":\"%s\",\"address\":%"PFMT64u",\"offset\":%"PFMT64u",",
section_name, (ut64)addr, (ut64)offset);
r_cons_printf ("\"link\":%"PFMT64u",\"link_section_name\":\"%s\",\"entries\":[",
(ut32)link, link_section_name);
} else {
r_cons_printf ("Version symbols section '%s' contains %"PFMT64u" entries:\n", section_name, num_entries);
r_cons_printf (" Addr: 0x%08"PFMT64x" Offset: 0x%08"PFMT64x" Link: %x (%s)\n",
(ut64)addr, (ut64)offset, (ut32)link, link_section_name);
}
int i;
for (i = 0; i < num_entries; i++) {
char key[32] = R_EMPTY;
@ -3016,14 +3026,29 @@ static void bin_elf_versioninfo(RCore *r) {
if (oValue && !strcmp (value, oValue)) {
continue;
}
r_cons_printf (" 0x%08"PFMT64x": ", (ut64) i);
r_cons_printf ("%s\n", value);
if (IS_MODE_JSON (mode)) {
if (i > 0) { r_cons_printf (","); }
char *escaped_value = r_str_escape (value);
r_cons_printf ("{\"idx\":%"PFMT64u",\"value\":\"%s\"}",
(ut64) i, escaped_value);
free (escaped_value);
} else {
r_cons_printf (" 0x%08"PFMT64x": ", (ut64) i);
r_cons_printf ("%s\n", value);
}
oValue = value;
}
}
r_cons_println ("\n");
if (IS_MODE_JSON (mode)) {
r_cons_printf ("]}");
} else {
r_cons_printf ("\n\n");
}
firstit_for_versym = false;
}
if (IS_MODE_JSON (mode)) { r_cons_printf ("],\"verneed\":["); }
bool firstit_dowhile_verneed = true;
do {
char path_version[256] = R_EMPTY;
snprintf (path, sizeof (path), format, "verneed", num_verneed++);
@ -3031,14 +3056,23 @@ static void bin_elf_versioninfo(RCore *r) {
break;
}
r_cons_printf ("Version need section '%s' contains %d entries:\n",
sdb_const_get (sdb, "section_name", 0), (int)sdb_num_get (sdb, "num_entries", 0));
if (IS_MODE_JSON (mode)) {
if (!firstit_dowhile_verneed) { r_cons_printf (","); }
r_cons_printf ("{\"section_name\":\"%s\",\"address\":%"PFMT64u",\"offset\":%"PFMT64u",",
sdb_const_get (sdb, "section_name", 0), sdb_num_get (sdb, "addr", 0), sdb_num_get (sdb, "offset", 0));
r_cons_printf ("\"link\":%"PFMT64u",\"link_section_name\":\"%s\",\"entries\":[",
sdb_num_get (sdb, "link", 0), sdb_const_get (sdb, "link_section_name", 0));
} else {
r_cons_printf ("Version need section '%s' contains %d entries:\n",
sdb_const_get (sdb, "section_name", 0), (int)sdb_num_get (sdb, "num_entries", 0));
r_cons_printf (" Addr: 0x%08"PFMT64x, sdb_num_get (sdb, "addr", 0));
r_cons_printf (" Addr: 0x%08"PFMT64x, sdb_num_get (sdb, "addr", 0));
r_cons_printf (" Offset: 0x%08"PFMT64x" Link to section: %"PFMT64d" (%s)\n",
sdb_num_get (sdb, "offset", 0), sdb_num_get (sdb, "link", 0),
sdb_const_get (sdb, "link_section_name", 0));
r_cons_printf (" Offset: 0x%08"PFMT64x" Link to section: %"PFMT64d" (%s)\n",
sdb_num_get (sdb, "offset", 0), sdb_num_get (sdb, "link", 0),
sdb_const_get (sdb, "link_section_name", 0));
}
bool firstit_for_verneed = true;
for (num_version = 0;; num_version++) {
snprintf (path_version, sizeof (path_version), "%s/version%d", path, num_version);
const char *filename = NULL;
@ -3047,26 +3081,60 @@ static void bin_elf_versioninfo(RCore *r) {
if (!(sdb = sdb_ns_path (r->sdb, path_version, 0))) {
break;
}
r_cons_printf (" 0x%08"PFMT64x": Version: %d",
sdb_num_get (sdb, "idx", 0), (int)sdb_num_get (sdb, "vn_version", 0));
if (IS_MODE_JSON (mode)) {
if (!firstit_for_verneed) { r_cons_printf (","); }
r_cons_printf ("{\"idx\":%"PFMT64u",\"vn_version\":%d,",
sdb_num_get (sdb, "idx", 0), (int)sdb_num_get (sdb, "vn_version", 0));
} else {
r_cons_printf (" 0x%08"PFMT64x": Version: %d",
sdb_num_get (sdb, "idx", 0), (int)sdb_num_get (sdb, "vn_version", 0));
}
if ((filename = sdb_const_get (sdb, "file_name", 0))) {
r_cons_printf (" File: %s", filename);
if (IS_MODE_JSON (mode)) {
char *escaped_filename = r_str_escape (filename);
r_cons_printf ("\"file_name\":\"%s\",", escaped_filename);
free (escaped_filename);
} else {
r_cons_printf (" File: %s", filename);
}
}
r_cons_printf (" Cnt: %d\n", (int)sdb_num_get (sdb, "cnt", 0));
if (IS_MODE_JSON (mode)) {
r_cons_printf ("\"cnt\":%d,", (int)sdb_num_get (sdb, "cnt", 0));
} else {
r_cons_printf (" Cnt: %d\n", (int)sdb_num_get (sdb, "cnt", 0));
}
if (IS_MODE_JSON (mode)) {
r_cons_printf ("\"vernaux\":[");
}
bool firstit_dowhile_vernaux = true;
do {
snprintf (path_vernaux, sizeof (path_vernaux), "%s/vernaux%d",
path_version, num_vernaux++);
if (!(sdb = sdb_ns_path (r->sdb, path_vernaux, 0))) {
break;
}
r_cons_printf (" 0x%08"PFMT64x": Name: %s",
sdb_num_get (sdb, "idx", 0), sdb_const_get (sdb, "name", 0));
r_cons_printf (" Flags: %s Version: %d\n",
sdb_const_get (sdb, "flags", 0), (int)sdb_num_get (sdb, "version", 0));
if (IS_MODE_JSON (mode)) {
if (!firstit_dowhile_vernaux) { r_cons_printf (","); }
r_cons_printf ("{\"idx\":%"PFMT64x",\"name\":\"%s\",",
sdb_num_get (sdb, "idx", 0), sdb_const_get (sdb, "name", 0));
r_cons_printf ("\"flags\":\"%s\",\"version\":%d}",
sdb_const_get (sdb, "flags", 0), (int)sdb_num_get (sdb, "version", 0));
} else {
r_cons_printf (" 0x%08"PFMT64x": Name: %s",
sdb_num_get (sdb, "idx", 0), sdb_const_get (sdb, "name", 0));
r_cons_printf (" Flags: %s Version: %d\n",
sdb_const_get (sdb, "flags", 0), (int)sdb_num_get (sdb, "version", 0));
}
firstit_dowhile_vernaux = false;
} while (sdb);
if (IS_MODE_JSON (mode)) { r_cons_printf ("]}"); };
firstit_for_verneed = false;
}
if (IS_MODE_JSON (mode)) { r_cons_printf ("]}"); };
firstit_dowhile_verneed = false;
} while (sdb);
if (IS_MODE_JSON (mode)) { r_cons_printf ("]}"); }
}
static void bin_mach0_versioninfo(RCore *r) {
@ -3166,7 +3234,7 @@ static int bin_versioninfo(RCore *r, int mode) {
if (!strncmp ("pe", info->rclass, 2)) {
bin_pe_versioninfo (r);
} else if (!strncmp ("elf", info->rclass, 3)) {
bin_elf_versioninfo (r);
bin_elf_versioninfo (r, mode);
} else if (!strncmp ("mach0", info->rclass, 5)) {
bin_mach0_versioninfo (r);
} else {