Skip to content

Commit

Permalink
* r_bin
Browse files Browse the repository at this point in the history
  - Add field bits to RBinInfo
  - Make r_bin_*_get_arch compatible with r_asm
* rabin2
  - List sections before anything else
  - Add "e asm.bits x" to "rabin2 -ir" output
* r_flags
  - Remove r_flag_set_base
* r_io, r_core
  - Now r_io handles all the va related stuff
  - Execute rabin2 with the flag -v if io.va = true
  • Loading branch information
jroimartin committed Feb 21, 2010
1 parent d1d3dd0 commit 8d41729
Show file tree
Hide file tree
Showing 18 changed files with 87 additions and 67 deletions.
15 changes: 11 additions & 4 deletions libr/bin/format/elf/elf.c
Original file line number Diff line number Diff line change
Expand Up @@ -233,11 +233,8 @@ char* Elf_(r_bin_elf_get_arch)(struct Elf_(r_bin_elf_obj_t) *bin)
return r_str_dup_printf("powerpc");
case EM_68K:
return r_str_dup_printf("m68k");
case EM_IA_64:
case EM_X86_64:
return r_str_dup_printf("intel64");
default:
return r_str_dup_printf("intel");
return r_str_dup_printf("x86");
}
}
char* Elf_(r_bin_elf_get_machine_name)(struct Elf_(r_bin_elf_obj_t) *bin)
Expand Down Expand Up @@ -348,6 +345,16 @@ char* Elf_(r_bin_elf_get_elf_class)(struct Elf_(r_bin_elf_obj_t) *bin)
}
}

int Elf_(r_bin_elf_get_bits)(struct Elf_(r_bin_elf_obj_t) *bin)
{
switch (bin->ehdr.e_ident[EI_CLASS]) {
case ELFCLASSNONE: return 0;
case ELFCLASS32: return 32;
case ELFCLASS64: return 64;
default: return -1;
}
}

char* Elf_(r_bin_elf_get_osabi_name)(struct Elf_(r_bin_elf_obj_t) *bin)
{
switch (bin->ehdr.e_ident[EI_OSABI]) {
Expand Down
1 change: 1 addition & 0 deletions libr/bin/format/elf/elf.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ char* Elf_(r_bin_elf_get_arch)(struct Elf_(r_bin_elf_obj_t) *bin);
char* Elf_(r_bin_elf_get_machine_name)(struct Elf_(r_bin_elf_obj_t) *bin);
char* Elf_(r_bin_elf_get_file_type)(struct Elf_(r_bin_elf_obj_t) *bin);
char* Elf_(r_bin_elf_get_elf_class)(struct Elf_(r_bin_elf_obj_t) *bin);
int Elf_(r_bin_elf_get_bits)(struct Elf_(r_bin_elf_obj_t) *bin);
char* Elf_(r_bin_elf_get_osabi_name)(struct Elf_(r_bin_elf_obj_t) *bin);
int Elf_(r_bin_elf_is_big_endian)(struct Elf_(r_bin_elf_obj_t) *bin);
struct r_bin_elf_section_t* Elf_(r_bin_elf_get_sections)(struct Elf_(r_bin_elf_obj_t) *bin);
Expand Down
5 changes: 5 additions & 0 deletions libr/bin/format/java/java.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,11 @@ static int javasm_init(struct r_bin_java_obj_t *bin)
char buf[0x9999];
int i,j;

/* Initialize structs */
bin->cp_items = NULL;
bin->fields = NULL;
bin->methods = NULL;

/* Initialize cp_null_item */
cp_null_item.tag = -1;
strcpy(cp_null_item.name, "(null)");
Expand Down
23 changes: 18 additions & 5 deletions libr/bin/format/pe/pe.c
Original file line number Diff line number Diff line change
Expand Up @@ -255,12 +255,8 @@ char* PE_(r_bin_pe_get_arch)(struct PE_(r_bin_pe_obj_t)* bin)
case PE_IMAGE_FILE_MACHINE_POWERPCFP:
arch = strdup("ppc");
break;
case PE_IMAGE_FILE_MACHINE_AMD64:
case PE_IMAGE_FILE_MACHINE_IA64:
arch = strdup("intel64");
break;
default:
arch = strdup("intel");
arch = strdup("x86");
}
return arch;
}
Expand Down Expand Up @@ -580,6 +576,23 @@ char* PE_(r_bin_pe_get_class)(struct PE_(r_bin_pe_obj_t)* bin)
return class;
}

int PE_(r_bin_pe_get_bits)(struct PE_(r_bin_pe_obj_t)* bin)
{
int bits;

switch (bin->nt_headers->optional_header.Magic) {
case PE_IMAGE_FILE_TYPE_PE32:
bits = 32;
break;
case PE_IMAGE_FILE_TYPE_PE32PLUS:
bits = 64;
break;
default:
bits = -1;
}
return bits;
}

int PE_(r_bin_pe_get_section_alignment)(struct PE_(r_bin_pe_obj_t)* bin)
{
return bin->nt_headers->optional_header.SectionAlignment;
Expand Down
1 change: 1 addition & 0 deletions libr/bin/format/pe/pe.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ int PE_(r_bin_pe_get_image_size)(struct PE_(r_bin_pe_obj_t)* bin);
char* PE_(r_bin_pe_get_machine)(struct PE_(r_bin_pe_obj_t)* bin);
char* PE_(r_bin_pe_get_os)(struct PE_(r_bin_pe_obj_t)* bin);
char* PE_(r_bin_pe_get_class)(struct PE_(r_bin_pe_obj_t)* bin);
int PE_(r_bin_pe_get_bits)(struct PE_(r_bin_pe_obj_t)* bin);
int PE_(r_bin_pe_get_section_alignment)(struct PE_(r_bin_pe_obj_t)* bin);
struct r_bin_pe_section_t* PE_(r_bin_pe_get_sections)(struct PE_(r_bin_pe_obj_t)* bin);
char* PE_(r_bin_pe_get_subsystem)(struct PE_(r_bin_pe_obj_t)* bin);
Expand Down
1 change: 1 addition & 0 deletions libr/bin/p/bin_elf.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ static RBinInfo* info(RBin *bin)
strncpy (ret->arch, str, R_BIN_SIZEOF_STRINGS);
free (str);
strncpy (ret->rclass, "elf", R_BIN_SIZEOF_STRINGS);
ret->bits = Elf_(r_bin_elf_get_bits) (bin->bin_obj);
ret->big_endian=Elf_(r_bin_elf_is_big_endian) (bin->bin_obj);
ret->dbg_info = 0;
if (!Elf_(r_bin_elf_get_stripped) (bin->bin_obj)) {
Expand Down
3 changes: 2 additions & 1 deletion libr/bin/p/bin_java.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,8 @@ static RBinInfo* info(RBin *bin)
strncpy (ret->os, "any", R_BIN_SIZEOF_STRINGS);
strncpy (ret->subsystem, "any", R_BIN_SIZEOF_STRINGS);
strncpy (ret->machine, "Java VM", R_BIN_SIZEOF_STRINGS);
strncpy (ret->arch, "javavm", R_BIN_SIZEOF_STRINGS);
strncpy (ret->arch, "java", R_BIN_SIZEOF_STRINGS);
ret->bits = 32;
ret->big_endian= 0;
ret->dbg_info = 0x04 | 0x08; /* LineNums | Syms */
return ret;
Expand Down
1 change: 1 addition & 0 deletions libr/bin/p/bin_pe.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ static RBinInfo* info(RBin *bin)
if (PE_(r_bin_pe_is_dll) (bin->bin_obj))
strncpy (ret->type, "DLL (Dynamic Link Library)", R_BIN_SIZEOF_STRINGS);
else strncpy (ret->type, "EXEC (Executable file)", R_BIN_SIZEOF_STRINGS);
ret->bits = PE_(r_bin_pe_get_bits) (bin->bin_obj);
ret->big_endian = PE_(r_bin_pe_is_big_endian) (bin->bin_obj);
ret->dbg_info = 0;
if (!PE_(r_bin_pe_is_stripped_debug) (bin->bin_obj))
Expand Down
30 changes: 14 additions & 16 deletions libr/bin/t/rabin2.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,22 +234,19 @@ static int rabin_show_sections(ut64 at) {
} else {
if (rad) {
r_flag_name_filter (section->name);
printf ("f section.%s @ 0x%08llx\n",
section->name, va?baddr+section->rva:section->offset);
printf ("f section.%s_end @ 0x%08llx\n",
section->name,
va?baddr+section->rva+section->vsize:section->offset+section->size);
printf ("S 0x%08llx 0x%08llx 0x%08llx 0x%08llx %s\n",
section->offset, baddr+section->rva,
section->size, section->vsize, section->name);
printf ("f section.%s %lli 0x%08llx\n",
section->name, section->size, va?baddr+section->rva:section->offset);
printf ("CC [%02i] address=0x%08llx offset=0x%08llx size=%08lli vsize=%08lli"
"privileges=%c%c%c%c name=%s\n",
"privileges=%c%c%c%c name=%s @ 0x%08llx\n",
i, baddr+section->rva, section->offset, section->size, section->vsize,
R_BIN_SCN_SHAREABLE (section->characteristics)?'s':'-',
R_BIN_SCN_READABLE (section->characteristics)?'r':'-',
R_BIN_SCN_WRITABLE (section->characteristics)?'w':'-',
R_BIN_SCN_EXECUTABLE (section->characteristics)?'x':'-',
section->name);
printf ("S 0x%08llx 0x%08llx 0x%08llx 0x%08llx %s\n",
section->offset, baddr+section->rva,
section->size, section->vsize, section->name);
section->name,va?baddr+section->rva:section->offset);
} else printf ("idx=%02i address=0x%08llx offset=0x%08llx size=%08lli vsize=%08lli"
"privileges=%c%c%c%c name=%s\n",
i, baddr+section->rva, section->offset, section->size, section->vsize,
Expand Down Expand Up @@ -278,14 +275,15 @@ static int rabin_show_info() {
"e cfg.bigendian=%s\n"
"e asm.os=%s\n"
"e asm.arch=%s\n"
"e asm.bits=%i\n"
"e dbg.dwarf=%s\n",
info->rclass, info->big_endian?"True":"False", info->os, info->arch,
R_BIN_DBG_STRIPPED (info->dbg_info)?"False":"True");
info->rclass, info->big_endian?"true":"false", info->os, info->arch,
info->bits, R_BIN_DBG_STRIPPED (info->dbg_info)?"false":"true");
} else printf ("[File info]\n"
"File=%s\n"
"Type=%s\n"
"Class=%s\n"
"Arch=%s\n"
"Arch=%s %i\n"
"Machine=%s\n"
"OS=%s\n"
"Subsystem=%s\n"
Expand All @@ -296,7 +294,7 @@ static int rabin_show_info() {
"Local_syms=%s\n"
"Relocs=%s\n",
info->file, info->type, info->bclass,
info->arch, info->machine, info->os,
info->arch, info->bits, info->machine, info->os,
info->subsystem, info->big_endian?"True":"False",
R_BIN_DBG_STRIPPED (info->dbg_info)?"True":"False",
R_BIN_DBG_STATIC (info->dbg_info)?"True":"False",
Expand Down Expand Up @@ -541,14 +539,14 @@ int main(int argc, char **argv)
return R_FALSE;
}

if (action&ACTION_SECTIONS)
rabin_show_sections (at);
if (action&ACTION_ENTRIES)
rabin_show_entrypoints ();
if (action&ACTION_IMPORTS)
rabin_show_imports (at);
if (action&ACTION_SYMBOLS)
rabin_show_symbols (at);
if (action&ACTION_SECTIONS)
rabin_show_sections (at);
if (action&ACTION_STRINGS)
rabin_show_strings ();
if (action&ACTION_INFO)
Expand Down
18 changes: 7 additions & 11 deletions libr/core/cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -635,8 +635,8 @@ static int cmd_info(void *data, const char *input) {
case 'e':
case 'S':
case 'z':
snprintf (buf, sizeof (buf), "rabin2 -%c%s '%s'", input[0],
input[1]=='*'?"r":"", core->file->filename);
snprintf (buf, sizeof (buf), "rabin2 -%c%s%s '%s'", input[0],
input[1]=='*'?"r":"", core->io.va?"v":"", core->file->filename);
eprintf ("(%s)\n", buf);
r_sys_cmd (buf);
break;
Expand Down Expand Up @@ -832,9 +832,6 @@ static int cmd_flag(void *data, const char *input) {
case '-':
r_flag_unset (&core->flags, input+1);
break;
case 'b':
r_flag_set_base(&core->flags, r_num_math(&core->num, input+1));
break;
case 's':
if (input[1]==' ')
r_flag_space_set(&core->flags, input+2);
Expand All @@ -857,7 +854,6 @@ static int cmd_flag(void *data, const char *input) {
case '?':
r_cons_printf (
"Usage: f[ ] [flagname]\n"
" fb 0x8048000 ; set base address for flagging\n"
" f name 12 @ 33 ; set flag 'name' with size 12 at 33\n"
" f name 12 33 ; same as above\n"
" f+name 12 @ 33 ; like above but creates new one if doesnt exist\n"
Expand Down Expand Up @@ -1139,14 +1135,14 @@ static int __cb_hit(struct r_search_kw_t *kw, void *user, ut64 addr)
{
struct r_core_t *core = (struct r_core_t *)user;

r_cons_printf("f hit%d_%d %d 0x%08llx\n",
r_cons_printf ("f hit%d_%d %d 0x%08llx\n",
kw->kwidx, kw->count, kw->keyword_length, addr);

if (!strnull (cmdhit)) {
ut64 here = core->offset;
r_core_seek(core, addr, R_FALSE);
r_core_seek (core, addr, R_FALSE);
r_core_cmd(core, cmdhit, 0);
r_core_seek(core, here, R_TRUE);
r_core_seek (core, here, R_TRUE);
}

return R_TRUE;
Expand All @@ -1168,8 +1164,8 @@ static int cmd_search(void *data, const char *input)
r_search_free (core->search);
core->search = r_search_new (R_SEARCH_KEYWORD);
n32 = r_num_math (&core->num, input+1);
r_search_kw_add_bin(core->search, (const ut8*)&n32, 4, NULL, 0);
r_search_begin(core->search);
r_search_kw_add_bin (core->search, (const ut8*)&n32, 4, NULL, 0);
r_search_begin (core->search);
dosearch = 1;
break;
case ' ': /* search string */
Expand Down
8 changes: 4 additions & 4 deletions libr/core/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ static int config_scrhtml_callback(void *user, void *data) {
return R_TRUE;
}

static int config_cfgffio_callback(void *user, void *data) {
static int config_ioffio_callback(void *user, void *data) {
struct r_core_t *core = (struct r_core_t *) user;
struct r_config_node_t *node = (struct r_config_node_t *) data;
core->ffio = node->i_value;
return R_TRUE;
}

static int config_cfgva_callback(void *user, void *data) {
static int config_iova_callback(void *user, void *data) {
struct r_core_t *core = (struct r_core_t *) user;
struct r_config_node_t *node = (struct r_config_node_t *) data;
core->io.va = node->i_value;
Expand Down Expand Up @@ -112,8 +112,8 @@ R_API int r_core_config_init(struct r_core_t *core)
r_config_set (cfg, "scr.seek", "");
r_config_set_cb (cfg, "scr.html", "false", &config_scrhtml_callback);
r_config_set (cfg, "cfg.debug", "false");
r_config_set_cb (cfg, "cfg.ffio", "false", &config_cfgffio_callback);
r_config_set_cb (cfg, "cfg.va", "false", &config_cfgva_callback);
r_config_set_cb (cfg, "io.ffio", "false", &config_ioffio_callback);
r_config_set_cb (cfg, "io.va", "false", &config_iova_callback);
#if 0
node = config_set("asm.profile", "default");
// node->callback = &config_asm_profile;
Expand Down
1 change: 1 addition & 0 deletions libr/core/io.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ R_API int r_core_write_op(struct r_core_t *core, const char *arg, char op)
R_API int r_core_seek(struct r_core_t *core, ut64 addr, int rb)
{
ut64 old = core->offset;

/* XXX unnecesary call */
r_io_set_fd (&core->io, core->file->fd);
core->offset = r_io_seek (&core->io, addr, R_IO_SEEK_SET);
Expand Down
4 changes: 2 additions & 2 deletions libr/core/t/radare2.c
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,8 @@ int main(int argc, char **argv)

// Load the binary information from rabin2
{
char *cmd = r_str_concat (
strdup(".!rabin2 -reisS "), r.file->filename);
char *cmd = r_str_dup_printf (".!rabin2 -rSIeis%s %s",
r.io.va?"v":"", r.file->filename);
r_core_cmd (&r, cmd, 0);
r_str_free (cmd);
}
Expand Down
16 changes: 5 additions & 11 deletions libr/flags/flags.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include <r_flags.h>
#include <r_util.h>
#include <r_cons.h>
#include <stdio.h>

#if USE_BTREE
Expand Down Expand Up @@ -36,7 +37,6 @@ R_API int r_flag_init(struct r_flag_t *f)
INIT_LIST_HEAD(&f->flags);
f->space_idx = -1;
f->space_idx2 = -1;
f->base = 0LL;
#if USE_BTREE
btree_init(&f->tree);
btree_init(&f->ntree);
Expand All @@ -53,12 +53,6 @@ R_API struct r_flag_t * r_flag_new()
return f;
}

R_API int r_flag_set_base(struct r_flag_t *f, ut64 new_base)
{
f->base = new_base;
return 0;
}

R_API struct r_flag_item_t *r_flag_list(struct r_flag_t *f, int rad)
{
struct list_head *pos;
Expand Down Expand Up @@ -168,7 +162,7 @@ R_API int r_flag_set(struct r_flag_t *fo, const char *name, ut64 addr, ut32 size
if (flag->offset == addr)
return 1;
} else {
flag->offset = addr + fo->base;
flag->offset = addr;
flag->size = size; // XXX
flag->format = 0; // XXX
//eprintf("update '%s'\n", f->name);
Expand All @@ -190,7 +184,7 @@ R_API int r_flag_set(struct r_flag_t *fo, const char *name, ut64 addr, ut32 size
return 1;
} else {
flag = f;
f->offset = addr + fo->base;
f->offset = addr;
f->size = size; // XXX
f->format = 0; // XXX
//eprintf("update '%s'\n", f->name);
Expand All @@ -204,7 +198,7 @@ R_API int r_flag_set(struct r_flag_t *fo, const char *name, ut64 addr, ut32 size
/* MARK: entrypoint for flag addition */
flag = malloc(sizeof(struct r_flag_item_t));
memset(flag,'\0', sizeof(struct r_flag_item_t));
flag->offset = addr + fo->base;
flag->offset = addr;
strncpy(flag->name, name, R_FLAG_NAME_SIZE);
strncpy(flag->name, r_str_chop(flag->name), R_FLAG_NAME_SIZE);
flag->name[R_FLAG_NAME_SIZE-1]='\0';
Expand All @@ -219,7 +213,7 @@ R_API int r_flag_set(struct r_flag_t *fo, const char *name, ut64 addr, ut32 size
}

//eprintf("NAME(%s) HASH(%x)\n", flag->name, flag->namehash);
flag->offset = addr + fo->base;
flag->offset = addr;
flag->space = fo->space_idx;
flag->size = size; // XXX
flag->format = 0; // XXX
Expand Down
1 change: 1 addition & 0 deletions libr/include/r_bin.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ typedef struct r_bin_info_t {
char machine[R_BIN_SIZEOF_STRINGS];
char os[R_BIN_SIZEOF_STRINGS];
char subsystem[R_BIN_SIZEOF_STRINGS];
int bits;
int big_endian;
ut64 dbg_info;
} RBinInfo;
Expand Down
2 changes: 0 additions & 2 deletions libr/include/r_flags.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ typedef struct r_flag_item_t {
typedef struct r_flag_t {
int space_idx;
int space_idx2;
ut64 base;
const char *space[R_FLAG_SPACES_MAX];
#if USE_BTREE
struct btree_node *tree; /* index by offset */
Expand All @@ -41,7 +40,6 @@ typedef struct r_flag_t {
#ifdef R_API
R_API struct r_flag_t * r_flag_new();
R_API int r_flag_init(struct r_flag_t *f);
R_API int r_flag_set_base(struct r_flag_t *f, ut64 base);
R_API struct r_flag_item_t *r_flag_list(struct r_flag_t *f, int rad);
R_API struct r_flag_item_t *r_flag_get(struct r_flag_t *f, const char *name);
R_API struct r_flag_item_t *r_flag_get_i(struct r_flag_t *f, ut64 off);
Expand Down
Loading

0 comments on commit 8d41729

Please sign in to comment.