Initial test exposing elf headers into Sdb and fix crash in bin-any

This commit is contained in:
pancake 2014-09-08 04:17:38 +02:00
parent a62e8603f7
commit 4bcb57955f
4 changed files with 59 additions and 9 deletions

View File

@ -548,9 +548,42 @@ int main(int argc, char **argv) {
}
if (query) {
if (!strcmp (query, "-")) {
__sdb_prompt (bin->cur->sdb);
} else sdb_query (bin->cur->sdb, query);
if (rad) {
// TODO: Should be moved into core, to load those flags and formats into r2
Sdb *db = sdb_ns (bin->cur->sdb, "info", 0);
char *flagname;
if (db) {
SdbListIter *iter;
SdbKv *kv;
// iterate over all keys
ls_foreach (db->ht->list, iter, kv) {
char *k = kv->key;
char *v = kv->value;
char *dup = strdup (k);
if ((flagname=strstr (dup, ".offset"))) {
*flagname = 0;
flagname = dup;
eprintf ("f %s @ %s\n", flagname, v);
}
if ((flagname=strstr (dup, ".format"))) {
*flagname = 0;
flagname = dup;
eprintf ("pf.%s %s\n", flagname, v);
}
free (dup);
}
}
//sdb_query (bin->cur->sdb, "info/*");
} else {
if (!strcmp (query, "-")) {
__sdb_prompt (bin->cur->sdb);
} else sdb_query (bin->cur->sdb, query);
}
r_core_fini (&core);
return 0;
}

View File

@ -112,6 +112,12 @@ R_API int r_anal_fcn_xref_add (RAnal *a, RAnalFunction *fcn, ut64 at, ut64 addr,
#endif
#if FCN_SDB
char key[1024];
#if 0
SETKEY ("fcn.0x%08"PFMT64x".name", fcn->addr);
sdb_add (DB, key, fcn->name, 0);
SETKEY ("fcn.name.%s", fcn->name);
sdb_num_add (DB, key, fcn->addr, 0);
#endif
SETKEY ("fcn.0x%08"PFMT64x".xrefs", fcn->addr);
sdb_array_add_num (DB, key, at, 0);
#endif

View File

@ -25,6 +25,8 @@ static int Elf_(r_bin_elf_init_ehdr)(struct Elf_(r_bin_elf_obj_t) *bin) {
eprintf ("Warning: read (magic)\n");
return R_FALSE;
}
sdb_num_set (bin->kv, "elf.header.offset", 0, 0);
sdb_set (bin->kv, "elf.header.format", "qqxxxx ident ident2 type machine version entry", 0);
bin->endian = (e_ident[EI_DATA] == ELFDATA2MSB)?
LIL_ENDIAN: !LIL_ENDIAN;
memset (&bin->ehdr, 0, sizeof (Elf_(Ehdr)));
@ -52,16 +54,17 @@ static int Elf_(r_bin_elf_init_phdr)(struct Elf_(r_bin_elf_obj_t) *bin) {
return R_FALSE;
if (bin->phdr) return R_TRUE;
if(!UT32_MUL(&phdr_size, bin->ehdr.e_phnum, sizeof(Elf_(Phdr))))
if (!UT32_MUL (&phdr_size, bin->ehdr.e_phnum, sizeof (Elf_(Phdr))))
return R_FALSE;
if(!phdr_size)
if (!phdr_size)
return R_FALSE;
if ((bin->phdr = malloc (phdr_size)) == NULL) {
if ((bin->phdr = calloc (phdr_size, 1)) == NULL) {
perror ("malloc (phdr)");
return R_FALSE;
}
//eprintf ("edhr.e_phoff", bin->ehdr.e_phoff);
len = r_buf_fread_at (bin->b, bin->ehdr.e_phoff, (ut8*)bin->phdr,
#if R_BIN_ELF64
bin->endian? "2I6L": "2i6l",
@ -75,6 +78,10 @@ static int Elf_(r_bin_elf_init_phdr)(struct Elf_(r_bin_elf_obj_t) *bin) {
return R_FALSE;
}
sdb_bool_set (bin->kv, "elf.relro", Elf_(r_bin_elf_has_relro)(bin), 0);
sdb_num_set (bin->kv, "elf.phdr.offset", bin->ehdr.e_phoff, 0);
sdb_set (bin->kv, "elf.phdr.format", "wxxxwwww type offset vaddr paddr filesz memsz flags align", 0);
// Usage example:
// > pf `k bin/cur/info/elf.phdr.format` @ `k bin/cur/info/elf.phdr.offset`
return R_TRUE;
}
@ -118,9 +125,9 @@ static int Elf_(r_bin_elf_init_strtab)(struct Elf_(r_bin_elf_obj_t) *bin) {
/* sh_size must be lower than UT32_MAX and not equal to zero, to avoid bugs
on malloc() */
if(bin->shdr[bin->ehdr.e_shstrndx].sh_size > UT32_MAX)
if (bin->shdr[bin->ehdr.e_shstrndx].sh_size > UT32_MAX)
return R_FALSE;
if(!bin->shdr[bin->ehdr.e_shstrndx].sh_size)
if (!bin->shdr[bin->ehdr.e_shstrndx].sh_size)
return R_FALSE;
bin->shstrtab_section =
@ -137,6 +144,9 @@ static int Elf_(r_bin_elf_init_strtab)(struct Elf_(r_bin_elf_obj_t) *bin) {
memset (bin->strtab, 0, bin->strtab_size);
bin->shstrtab = bin->strtab;
sdb_num_set (bin->kv, "elf.strtab.offset", bin->strtab_section->sh_offset, 0);
sdb_num_set (bin->kv, "elf.strtab.size", bin->strtab_section->sh_size, 0);
if (r_buf_read_at (bin->b, bin->strtab_section->sh_offset, (ut8*)bin->strtab,
bin->strtab_section->sh_size) == -1) {
eprintf ("Warning: read (strtab) at 0x%"PFMT64x"\n",

View File

@ -18,7 +18,8 @@ static void get_filetype (RBinFile *arch, char *res, int len) {
r_magic_load (ck, R_MAGIC_PATH);
r_buf_read_at (arch->buf, 0, test_buffer, 4096);
tmp = r_magic_buffer (ck, test_buffer, 4096);
strncpy (res, tmp, len-1);
if (tmp)
strncpy (res, tmp, len-1);
}
r_magic_free (ck);
}