mirror of
https://github.com/radareorg/radare2.git
synced 2024-10-09 11:53:39 +00:00
Initial test exposing elf headers into Sdb and fix crash in bin-any
This commit is contained in:
parent
a62e8603f7
commit
4bcb57955f
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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",
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user