* Fix configure-plugins sort function

* Now r_bin is only using r_buf/r_file for file handling
This commit is contained in:
Nibble 2010-01-24 12:40:48 +01:00
parent 1721bdfe79
commit 08d5afd5c5
11 changed files with 232 additions and 335 deletions

View File

@ -93,7 +93,7 @@ sub () {
}
dosort () {
( for a in $1 ; do echo $a ; done ) | sort
( for a in $1 ; do echo $a ; done ) | sort -t. --key=1,1d
}
sort_vars () {

View File

@ -12,6 +12,7 @@
#include <string.h>
#include <r_types.h>
#include <r_util.h>
#include <r_lib.h>
#include <r_bin.h>
#include "../config.h"
@ -28,34 +29,34 @@ extern struct r_bin_handle_t r_bin_plugin_dummy;
static struct r_bin_handle_t *bin_static_plugins[] =
{ R_BIN_STATIC_PLUGINS };
static int r_bin_init(struct r_bin_t *bin)
{
int i;
bin->cur = bin->user = NULL;
bin->file = NULL;
bin->size = 0;
INIT_LIST_HEAD(&bin->bins);
for(i=0;bin_static_plugins[i];i++)
r_bin_add(bin, bin_static_plugins[i]);
return R_TRUE;
}
static struct r_bin_string_t *get_strings(struct r_bin_t *bin, int min)
{
struct r_bin_string_t *ret = NULL;
ut8 *buf = NULL;
ut64 len, max_str = 0;
int i, matches = 0, ctr = 0;
char str[R_BIN_SIZEOF_STRINGS];
int i, matches = 0, ctr = 0, max_str = 0;
len = lseek(bin->fd, 0, SEEK_END);
max_str = (ut64)(len/min);
max_str = (int)(bin->size/min);
ret = malloc(max_str*sizeof(struct r_bin_string_t));
if (ret == NULL) {
fprintf(stderr, "Error allocating file\n");
return NULL;
}
buf = malloc(len);
if (buf == NULL) {
fprintf(stderr, "Error allocating file\n");
return NULL;
}
lseek(bin->fd, 0, SEEK_SET);
read(bin->fd, buf, len);
for(i = 0; i < len && ctr < max_str; i++) {
if ((IS_PRINTABLE(buf[i]))) {
str[matches] = buf[i];
for(i = 0; i < bin->size && ctr < max_str; i++) {
if ((IS_PRINTABLE(bin->buf->buf[i]))) {
str[matches] = bin->buf->buf[i];
if (matches < sizeof(str))
matches++;
} else {
@ -74,63 +75,9 @@ static struct r_bin_string_t *get_strings(struct r_bin_t *bin, int min)
}
}
ret[ctr].last = 1;
free(buf);
return ret;
}
R_API struct r_bin_t *r_bin_new()
{
struct r_bin_t *bin = MALLOC_STRUCT(struct r_bin_t);
if (bin != NULL)
r_bin_init(bin);
return bin;
}
R_API struct r_bin_t *r_bin_free(struct r_bin_t *bin)
{
free(bin);
return NULL;
}
static int r_bin_io_read_at(struct r_io_t *io, ut64 addr, ut8 *buf, int size)
{
// TODO: Implement this
return size;
}
static int r_bin_io_write_at(struct r_io_bind_t *io, ut64 addr, const ut8 *buf, int size)
{
// TODO: Implement this
return size;
}
static void r_bin_io_init(struct r_bin_t *bin)
{
bin->iob.init = R_TRUE;
bin->iob.io = NULL;
bin->iob.read_at = r_bin_io_read_at;
bin->iob.write_at = (void*)r_bin_io_write_at;
}
R_API int r_bin_init(struct r_bin_t *bin)
{
int i;
bin->rw = 0;
bin->cur = bin->user = NULL;
bin->file = NULL;
INIT_LIST_HEAD(&bin->bins);
for(i=0;bin_static_plugins[i];i++)
r_bin_add(bin, bin_static_plugins[i]);
r_bin_io_init(bin);
return R_TRUE;
}
// TODO: why the hell do we need user ptr here??
R_API void r_bin_set_user_ptr(struct r_bin_t *bin, void *user)
{
bin->user = user;
}
R_API int r_bin_add(struct r_bin_t *bin, struct r_bin_handle_t *foo)
{
struct list_head *pos;
@ -146,53 +93,41 @@ R_API int r_bin_add(struct r_bin_t *bin, struct r_bin_handle_t *foo)
return R_TRUE;
}
R_API void* r_bin_free(struct r_bin_t *bin)
{
if (!bin)
return NULL;
if (bin->cur && bin->cur->free)
bin->cur->free(bin);
free(bin);
return NULL;
}
R_API int r_bin_list(struct r_bin_t *bin)
{
struct list_head *pos;
int init = bin?0:1;
if (init) {
if (!(bin = MALLOC_STRUCT(struct r_bin_t)))
return 0;
r_bin_init(bin);
}
list_for_each_prev(pos, &bin->bins) {
struct r_bin_handle_t *h = list_entry(pos, struct r_bin_handle_t, list);
printf("bin %s\t%s\n", h->name, h->desc);
printf("bin %-10s %s\n", h->name, h->desc);
}
if (init)
r_bin_free(bin);
return R_FALSE;
}
R_API struct r_bin_object_t *r_bin_load(struct r_bin_t *bin, const char *file, const char *plugin_name)
{
int fd = r_bin_open (bin, file, R_FALSE, plugin_name);
if (fd == -1)
return NULL;
/* TODO: allocate and fill r_bin_object */
r_bin_close (bin);
return NULL;
}
R_API int r_bin_open(struct r_bin_t *bin, const char *file, int rw, const char *plugin_name)
{
struct list_head *pos;
if (bin == NULL || file == NULL)
return -1;
bin->file = file;
bin->rw = rw;
list_for_each_prev(pos, &bin->bins) {
struct r_bin_handle_t *h = list_entry(pos, struct r_bin_handle_t, list);
if ((plugin_name && !strcmp(h->name, plugin_name)) ||
(h->check && h->check(bin)))
bin->cur = h;
}
if (bin->cur && bin->cur->open)
return bin->cur->open(bin);
if (plugin_name && !strcmp(plugin_name, "dummy"))
return -1;
return r_bin_open(bin, file, rw, "dummy");
}
R_API int r_bin_close(struct r_bin_t *bin)
{
if (bin->cur && bin->cur->close)
return bin->cur->close(bin);
return -1;
}
R_API ut64 r_bin_get_baddr(struct r_bin_t *bin)
{
@ -201,7 +136,6 @@ R_API ut64 r_bin_get_baddr(struct r_bin_t *bin)
return UT64_MAX;
}
/* XXX : a binary can contain more than one entrypoint */
R_API struct r_bin_entry_t* r_bin_get_entry(struct r_bin_t *bin)
{
if (bin->cur && bin->cur->entry)
@ -209,41 +143,6 @@ R_API struct r_bin_entry_t* r_bin_get_entry(struct r_bin_t *bin)
return NULL;
}
R_API struct r_bin_section_t* r_bin_get_sections(struct r_bin_t *bin)
{
if (bin->cur && bin->cur->sections)
return bin->cur->sections(bin);
return NULL;
}
R_API struct r_bin_symbol_t* r_bin_get_symbols(struct r_bin_t *bin)
{
if (bin->cur && bin->cur->symbols)
return bin->cur->symbols(bin);
return NULL;
}
R_API struct r_bin_import_t* r_bin_get_imports(struct r_bin_t *bin)
{
if (bin->cur && bin->cur->imports)
return bin->cur->imports(bin);
return NULL;
}
R_API struct r_bin_string_t* r_bin_get_strings(struct r_bin_t *bin)
{
if (bin->cur && bin->cur->strings)
return bin->cur->strings(bin);
return get_strings(bin, 5);
}
R_API struct r_bin_info_t* r_bin_get_info(struct r_bin_t *bin)
{
if (bin->cur && bin->cur->info)
return bin->cur->info(bin);
return NULL;
}
R_API struct r_bin_field_t* r_bin_get_fields(struct r_bin_t *bin)
{
if (bin->cur && bin->cur->fields)
@ -251,61 +150,39 @@ R_API struct r_bin_field_t* r_bin_get_fields(struct r_bin_t *bin)
return NULL;
}
// why not just return a single instance of the Section struct?
R_API ut64 r_bin_get_section_offset(struct r_bin_t *bin, const char *name)
R_API struct r_bin_import_t* r_bin_get_imports(struct r_bin_t *bin)
{
struct r_bin_section_t *sections;
ut64 ret = UT64_MAX;
int i;
sections = r_bin_get_sections(bin);
if (sections) {
for (i = 0; !sections[i].last; i++)
if (!strcmp(sections[i].name, name)) {
ret = sections[i].offset;
break;
}
free(sections);
}
return ret;
if (bin->cur && bin->cur->imports)
return bin->cur->imports(bin);
return NULL;
}
R_API ut64 r_bin_get_section_rva(struct r_bin_t *bin, const char *name)
R_API struct r_bin_info_t* r_bin_get_info(struct r_bin_t *bin)
{
struct r_bin_section_t *sections;
ut64 ret = UT64_MAX;
int i;
sections = r_bin_get_sections(bin);
if (sections) {
for (i=0; !sections[i].last; i++) {
if (!strcmp(sections[i].name, name)) {
ret = sections[i].rva;
break;
}
}
free(sections);
}
return ret;
if (bin->cur && bin->cur->info)
return bin->cur->info(bin);
return NULL;
}
R_API ut64 r_bin_get_section_size(struct r_bin_t *bin, const char *name)
R_API struct r_bin_section_t* r_bin_get_sections(struct r_bin_t *bin)
{
struct r_bin_section_t *sections;
ut64 ret = UT64_MAX;
int i;
if (bin->cur && bin->cur->sections)
return bin->cur->sections(bin);
return NULL;
}
sections = r_bin_get_sections(bin);
if (sections) {
for (i=0; !sections[i].last; i++) {
if (!strcmp(sections[i].name, name)) {
ret = sections[i].size;
break;
}
}
free(sections);
}
return ret;
R_API struct r_bin_string_t* r_bin_get_strings(struct r_bin_t *bin)
{
if (bin->cur && bin->cur->strings)
return bin->cur->strings(bin);
return get_strings(bin, 5);
}
R_API struct r_bin_symbol_t* r_bin_get_symbols(struct r_bin_t *bin)
{
if (bin->cur && bin->cur->symbols)
return bin->cur->symbols(bin);
return NULL;
}
#if 0
@ -314,3 +191,31 @@ int r_bin_get_libs()
}
#endif
R_API struct r_bin_t* r_bin_new(const char *file, const char *plugin_name)
{
struct r_bin_t *bin;
struct list_head *pos;
if (!file)
return NULL;
if (!(bin = MALLOC_STRUCT(struct r_bin_t)))
return NULL;
r_bin_init(bin);
bin->file = file;
list_for_each_prev(pos, &bin->bins) {
struct r_bin_handle_t *h = list_entry(pos, struct r_bin_handle_t, list);
if ((plugin_name && !strcmp(h->name, plugin_name)) ||
(h->check && h->check(bin)))
bin->cur = h;
}
if (bin->cur && bin->cur->new)
bin->cur->new(bin);
else return r_bin_free(bin);
return bin;
}
R_API void r_bin_set_user_ptr(struct r_bin_t *bin, void *user)
{
bin->user = user;
}

View File

@ -1,21 +1,33 @@
/* radare - GPL3 - Copyright 2009 nibble<.ds@gmail.com> */
#include <r_types.h>
#include <r_util.h>
#include <r_lib.h>
#include <r_bin.h>
#include "java/java.h"
static int bopen(struct r_bin_t *bin)
static int pnew(struct r_bin_t *bin)
{
if ((bin->fd = open(bin->file, 0)) == -1) {
fprintf(stderr, "Cannot open file\n");
ut8* buf;
if (!(buf = (ut8*)r_file_slurp(bin->file, &bin->size)))
return R_FALSE;
} else return bin->fd;
bin->buf = r_buf_new();
if (!r_buf_set_bytes(bin->buf, buf, bin->size))
return R_FALSE;
free (buf);
return R_TRUE;
}
static int bclose(struct r_bin_t *bin)
static int pfree(struct r_bin_t *bin)
{
return close(bin->fd);
r_buf_free(bin->buf);
return R_TRUE;
}
static ut64 baddr(struct r_bin_t *bin)
{
return 0LL;
}
struct r_bin_handle_t r_bin_plugin_dummy = {
@ -23,10 +35,10 @@ struct r_bin_handle_t r_bin_plugin_dummy = {
.desc = "dummy bin plugin",
.init = NULL,
.fini = NULL,
.open = &bopen,
.close = &bclose,
.new = &pnew,
.free = &pfree,
.check = NULL,
.baddr = NULL,
.baddr = &baddr,
.entry = NULL,
.sections = NULL,
.symbols = NULL,

View File

@ -1,19 +1,21 @@
/* radare - GPL3 - Copyright 2009 nibble<.ds@gmail.com> */
#include <r_types.h>
#include <r_util.h>
#include <r_lib.h>
#include <r_bin.h>
#include "elf/elf.h"
static int bopen(struct r_bin_t *bin)
static int pnew(struct r_bin_t *bin)
{
if(!(bin->bin_obj = Elf_(r_bin_elf_new)(bin->file)))
return -1;
bin->fd = 1;
return bin->fd;
return R_FALSE;
bin->size = ((struct Elf_(r_bin_elf_obj_t)*)(bin->bin_obj))->size;
bin->buf = ((struct Elf_(r_bin_elf_obj_t)*)(bin->bin_obj))->b;
return R_TRUE;
}
static int bclose(struct r_bin_t *bin)
static int pfree(struct r_bin_t *bin)
{
Elf_(r_bin_elf_free)((struct Elf_(r_bin_elf_obj_t)*)bin->bin_obj);
return R_TRUE;
@ -199,17 +201,15 @@ static struct r_bin_field_t* fields(struct r_bin_t *bin)
#if !R_BIN_ELF64
static int check(struct r_bin_t *bin)
{
ut8 *buf;
int ret = R_FALSE;
ut8 buf[8];
if ((bin->fd = open(bin->file, 0)) != -1) {
lseek(bin->fd, 0, SEEK_SET);
read(bin->fd, buf, 8);
close(bin->fd);
/* buf[EI_CLASS] == ELFCLASS32 */
if (!memcmp(buf, "\x7F\x45\x4c\x46\x01", 5))
ret = R_TRUE;
}
if (!(buf = (ut8*)r_file_slurp_range(bin->file, 0, 5)))
return R_FALSE;
/* buf[EI_CLASS] == ELFCLASS32 */
if (!memcmp(buf, "\x7F\x45\x4c\x46\x01", 5))
ret = R_TRUE;
free(buf);
return ret;
}
@ -218,8 +218,8 @@ struct r_bin_handle_t r_bin_plugin_elf = {
.desc = "ELF format r_bin plugin",
.init = NULL,
.fini = NULL,
.open = &bopen,
.close = &bclose,
.new = &pnew,
.free = &pfree,
.check = &check,
.baddr = &baddr,
.entry = &entry,

View File

@ -5,19 +5,16 @@
static int check(struct r_bin_t *bin)
{
ut8 buf[1024];
ut8 *buf;
int ret = R_FALSE;
if ((bin->fd = open(bin->file, 0)) == -1)
if (!(buf = (ut8*)r_file_slurp_range(bin->file, 0, 5)))
return R_FALSE;
lseek(bin->fd, 0, SEEK_SET);
read(bin->fd, buf, 1024);
close(bin->fd);
if (!memcmp(buf, "\x7F\x45\x4c\x46", 4) &&
buf[4] == 2) /* buf[EI_CLASS] == ELFCLASS64 */
return R_TRUE;
return R_FALSE;
/* buf[EI_CLASS] == ELFCLASS64 */
if (!memcmp(buf, "\x7F\x45\x4c\x46\x02", 4))
ret = R_TRUE;
free(buf);
return ret;
}
struct r_bin_handle_t r_bin_plugin_elf64 = {
@ -25,8 +22,8 @@ struct r_bin_handle_t r_bin_plugin_elf64 = {
.desc = "elf64 bin plugin",
.init = NULL,
.fini = NULL,
.open = &bopen,
.close = &bclose,
.new = &pnew,
.free = &pfree,
.check = &check,
.baddr = &baddr,
.entry = &entry,

View File

@ -1,19 +1,21 @@
/* radare - GPL3 - Copyright 2009 nibble<.ds@gmail.com> */
#include <r_types.h>
#include <r_util.h>
#include <r_lib.h>
#include <r_bin.h>
#include "java/java.h"
static int bopen(struct r_bin_t *bin)
static int pnew(struct r_bin_t *bin)
{
if(!(bin->bin_obj = r_bin_java_new(bin->file)))
return -1;
bin->fd = 1;
return bin->fd;
return R_FALSE;
bin->size = ((struct r_bin_java_obj_t*)(bin->bin_obj))->size;
bin->buf = ((struct r_bin_java_obj_t*)(bin->bin_obj))->b;
return R_TRUE;
}
static int bclose(struct r_bin_t *bin)
static int pfree(struct r_bin_t *bin)
{
r_bin_java_free((struct r_bin_java_obj_t*)bin->bin_obj);
return R_TRUE;
@ -115,18 +117,15 @@ static struct r_bin_info_t* info(struct r_bin_t *bin)
static int check(struct r_bin_t *bin)
{
ut8 buf[1024];
ut8 *buf;
int ret = R_FALSE;
if ((bin->fd = open(bin->file, 0)) == -1)
if (!(buf = (ut8*)r_file_slurp_range(bin->file, 0, 4)))
return R_FALSE;
lseek(bin->fd, 0, SEEK_SET);
read(bin->fd, buf, 1024);
close(bin->fd);
if (!memcmp(buf, "\xca\xfe\xba\xbe", 4))
return R_TRUE;
return R_FALSE;
ret = R_TRUE;
free(buf);
return ret;
}
struct r_bin_handle_t r_bin_plugin_java = {
@ -134,8 +133,8 @@ struct r_bin_handle_t r_bin_plugin_java = {
.desc = "java bin plugin",
.init = NULL,
.fini = NULL,
.open = &bopen,
.close = &bclose,
.new = &pnew,
.free = &pfree,
.check = &check,
.baddr = &baddr,
.entry = &entry,

View File

@ -1,19 +1,21 @@
/* radare - GPL3 - Copyright 2009 pancake<@nopcode.org> */
#include <r_types.h>
#include <r_util.h>
#include <r_lib.h>
#include <r_bin.h>
#include "mach0/mach0.h"
static int bopen(struct r_bin_t *bin)
static int pnew(struct r_bin_t *bin)
{
if(!(bin->bin_obj = r_bin_mach0_new(bin->file)))
return -1;
bin->fd = 1;
return bin->fd;
return R_FALSE;
bin->size = ((struct r_bin_mach0_obj_t*)(bin->bin_obj))->size;
bin->buf = ((struct r_bin_mach0_obj_t*)(bin->bin_obj))->b;
return R_TRUE;
}
static int bclose(struct r_bin_t *bin)
static int pfree(struct r_bin_t *bin)
{
r_bin_mach0_free((struct r_bin_mach0_obj_t*)bin->bin_obj);
return R_TRUE;
@ -26,17 +28,15 @@ static ut64 baddr(struct r_bin_t *bin)
static int check(struct r_bin_t *bin)
{
ut8 *buf;
int ret = R_FALSE;
ut8 buf[4];
if ((bin->fd = open(bin->file, 0)) != -1) {
lseek(bin->fd, 0, SEEK_SET);
read(bin->fd, buf, 4);
close(bin->fd);
if (!memcmp(buf, "\xce\xfa\xed\xfa", 4) ||
!memcmp(buf, "\xfe\xed\xfa\xce", 4))
ret = R_TRUE;
}
if (!(buf = (ut8*)r_file_slurp_range(bin->file, 0, 4)))
return R_FALSE;
if (!memcmp(buf, "\xce\xfa\xed\xfa", 4) ||
!memcmp(buf, "\xfe\xed\xfa\xce", 4))
ret = R_TRUE;
free(buf);
return ret;
}
@ -135,8 +135,8 @@ struct r_bin_handle_t r_bin_plugin_mach0 = {
.desc = "mach0 bin plugin",
.init = NULL,
.fini = NULL,
.open = &bopen,
.close = &bclose,
.new = &pnew,
.free = &pfree,
.check = &check,
.baddr = &baddr,
.sections = &sections,

View File

@ -1,19 +1,21 @@
/* radare - GPL3 - Copyright 2009 nibble<.ds@gmail.com> */
#include <r_types.h>
#include <r_util.h>
#include <r_lib.h>
#include <r_bin.h>
#include "pe/pe.h"
static int bopen(struct r_bin_t *bin)
static int pnew(struct r_bin_t *bin)
{
if(!(bin->bin_obj = PE_(r_bin_pe_new)(bin->file)))
return -1;
bin->fd = 1;
return bin->fd;
return R_FALSE;
bin->size = ((struct PE_(r_bin_pe_obj_t)*)(bin->bin_obj))->size;
bin->buf = ((struct PE_(r_bin_pe_obj_t)*)(bin->bin_obj))->b;
return R_TRUE;
}
static int bclose(struct r_bin_t *bin)
static int pfree(struct r_bin_t *bin)
{
PE_(r_bin_pe_free)((struct PE_(r_bin_pe_obj_t)*)bin->bin_obj);
return R_TRUE;
@ -178,20 +180,17 @@ static struct r_bin_info_t* info(struct r_bin_t *bin)
#if !R_BIN_PE64
static int check(struct r_bin_t *bin)
{
ut8 buf[1024];
ut8 *buf;
int ret = R_FALSE;
if ((bin->fd = open(bin->file, 0)) == -1)
if (!(buf = (ut8*)r_file_slurp_range(bin->file, 0, 1024)))
return R_FALSE;
lseek(bin->fd, 0, SEEK_SET);
read(bin->fd, buf, 1024);
close(bin->fd);
if (!memcmp(buf, "\x4d\x5a", 2) &&
!memcmp(buf+(buf[0x3c]|(buf[0x3d]<<8)), "\x50\x45", 2) &&
!memcmp(buf+(buf[0x3c]|buf[0x3d]<<8)+0x18, "\x0b\x01", 2))
return R_TRUE;
return R_FALSE;
ret = R_TRUE;
free(buf);
return ret;
}
struct r_bin_handle_t r_bin_plugin_pe = {
@ -199,8 +198,8 @@ struct r_bin_handle_t r_bin_plugin_pe = {
.desc = "PE bin plugin",
.init = NULL,
.fini = NULL,
.open = &bopen,
.close = &bclose,
.new = &pnew,
.free = &pfree,
.check = &check,
.baddr = &baddr,
.entry = &entry,

View File

@ -5,29 +5,26 @@
static int check(struct r_bin_t *bin)
{
ut8 buf[1024];
ut8 *buf;
int ret = R_FALSE;
if ((bin->fd = open(bin->file, 0)) == -1)
if (!(buf = (ut8*)r_file_slurp_range(bin->file, 0, 1024)))
return R_FALSE;
lseek(bin->fd, 0, SEEK_SET);
read(bin->fd, buf, 1024);
close(bin->fd);
if (!memcmp(buf, "\x4d\x5a", 2) &&
!memcmp(buf+(buf[0x3c]|(buf[0x3d]<<8)), "\x50\x45", 2) &&
!memcmp(buf+(buf[0x3c]|buf[0x3d]<<8)+0x18, "\x0b\x02", 2))
return R_TRUE;
return R_FALSE;
}
ret = R_TRUE;
free(buf);
return ret;
}
struct r_bin_handle_t r_bin_plugin_pe64 = {
.name = "pe64",
.desc = "PE64 (PE32+) bin plugin",
.init = NULL,
.fini = NULL,
.open = &bopen,
.close = &bclose,
.new = &pnew,
.free = &pfree,
.check = &check,
.baddr = &baddr,
.entry = &entry,

View File

@ -28,7 +28,7 @@
#define ACTION_FIELDS 0x0100
static struct r_lib_t l;
static struct r_bin_t bin;
static struct r_bin_t *bin;
static int verbose = 0;
static int rad = R_FALSE;
static int rw = R_FALSE;
@ -56,8 +56,8 @@ static int rabin_show_help() {
static int rabin_show_entrypoint() {
struct r_bin_entry_t *entry;
char *env;
ut64 baddr = r_bin_get_baddr(&bin);
if ((entry = r_bin_get_entry(&bin)) == NULL)
ut64 baddr = r_bin_get_baddr(bin);
if ((entry = r_bin_get_entry(bin)) == NULL)
return R_FALSE;
if (rad) {
env = getenv("DEBUG");
@ -80,9 +80,9 @@ static int rabin_show_imports() {
ut64 baddr;
int i;
baddr = r_bin_get_baddr(&bin);
baddr = r_bin_get_baddr(bin);
if ((imports = r_bin_get_imports(&bin)) == NULL)
if ((imports = r_bin_get_imports(bin)) == NULL)
return R_FALSE;
if (rad)
@ -112,9 +112,9 @@ static int rabin_show_symbols() {
ut64 baddr;
int i;
baddr = r_bin_get_baddr(&bin);
baddr = r_bin_get_baddr(bin);
if ((symbols = r_bin_get_symbols(&bin)) == NULL)
if ((symbols = r_bin_get_symbols(bin)) == NULL)
return R_FALSE;
if (rad) printf("fs symbols\n");
@ -156,9 +156,9 @@ static int rabin_show_strings() {
ut64 baddr;
int i;
baddr = r_bin_get_baddr(&bin);
baddr = r_bin_get_baddr(bin);
if ((strings = r_bin_get_strings(&bin)) == NULL)
if ((strings = r_bin_get_strings(bin)) == NULL)
return R_FALSE;
if (rad) printf("fs strings\n");
@ -188,9 +188,9 @@ static int rabin_show_sections() {
ut64 baddr;
int i;
baddr = r_bin_get_baddr(&bin);
baddr = r_bin_get_baddr(bin);
if ((sections = r_bin_get_sections(&bin)) == NULL)
if ((sections = r_bin_get_sections(bin)) == NULL)
return R_FALSE;
if (rad) printf("fs sections\n");
@ -229,7 +229,7 @@ static int rabin_show_sections() {
static int rabin_show_info() {
struct r_bin_info_t *info;
if ((info = r_bin_get_info(&bin)) == NULL)
if ((info = r_bin_get_info(bin)) == NULL)
return R_FALSE;
if (rad) {
@ -269,9 +269,9 @@ static int rabin_show_fields() {
ut64 baddr;
int i;
baddr = r_bin_get_baddr(&bin);
baddr = r_bin_get_baddr(bin);
if ((fields = r_bin_get_fields(&bin)) == NULL)
if ((fields = r_bin_get_fields(bin)) == NULL)
return R_FALSE;
if (rad) printf("fs header\n");
@ -299,7 +299,7 @@ static int rabin_dump_symbols(int len) {
char *ret;
int olen = len, i;
if ((symbols = r_bin_get_symbols(&bin)) == NULL)
if ((symbols = r_bin_get_symbols(bin)) == NULL)
return R_FALSE;
for (i = 0; !symbols[i].last; i++) {
@ -312,8 +312,7 @@ static int rabin_dump_symbols(int len) {
if (!(buf = malloc(len)) ||
!(ret = malloc(len*2+1)))
return R_FALSE;
lseek(bin.fd, symbols[i].offset, SEEK_SET);
read(bin.fd, buf, len);
r_buf_read_at(bin->buf, symbols[i].offset, buf, len);
r_hex_bin2str(buf, len, ret);
printf("%s %s\n", symbols[i].name, ret);
free(buf);
@ -330,7 +329,7 @@ static int rabin_dump_sections(char *name) {
char *ret;
int i;
if ((sections = r_bin_get_sections(&bin)) == NULL)
if ((sections = r_bin_get_sections(bin)) == NULL)
return R_FALSE;
for (i = 0; !sections[i].last; i++)
@ -338,8 +337,7 @@ static int rabin_dump_sections(char *name) {
if (!(buf = malloc(sections[i].size)) ||
!(ret = malloc(sections[i].size*2+1)))
return R_FALSE;
lseek(bin.fd, sections[i].offset, SEEK_SET);
read(bin.fd, buf, sections[i].size);
r_buf_read_at(bin->buf, sections[i].offset, buf, sections[i].size);
r_hex_bin2str(buf, sections[i].size, ret);
printf("%s\n", ret);
free(buf);
@ -403,7 +401,7 @@ static int rabin_do_operation(const char *op) {
static int __lib_bin_cb(struct r_lib_plugin_t *pl, void *user, void *data) {
struct r_bin_handle_t *hand = (struct r_bin_handle_t *)data;
//printf(" * Added (dis)assembly handler\n");
r_bin_add(&bin, hand);
r_bin_add(bin, hand);
return R_TRUE;
}
@ -418,7 +416,6 @@ int main(int argc, char **argv)
const char *format = NULL, *op = NULL;
const char *plugin_name = NULL;
r_bin_init(&bin);
r_lib_init(&l, "radare_plugin");
r_lib_add_handler(&l, R_LIB_TYPE_BIN, "bin plugins",
&__lib_bin_cb, &__lib_bin_dt, NULL);
@ -471,7 +468,7 @@ int main(int argc, char **argv)
verbose++;
break;
case 'L':
r_bin_list(&bin);
r_bin_list(bin);
exit(1);
case 'V':
printf("rabin2 v"VERSION"\n");
@ -489,7 +486,8 @@ int main(int argc, char **argv)
if (format)
plugin_name = format;
if (r_bin_open(&bin, file, rw, plugin_name) == -1) {
if (!(bin = r_bin_new(file, plugin_name)) &&
!(bin = r_bin_new(file, "dummy"))) {
ERR("r_bin: Cannot open '%s'\n", file);
return R_FALSE;
}
@ -511,6 +509,6 @@ int main(int argc, char **argv)
if (op != NULL && action&ACTION_OPERATION)
rabin_do_operation(op);
r_bin_close(&bin);
r_bin_free(bin);
return R_FALSE;
}

View File

@ -4,7 +4,6 @@
#define _INCLUDE_R_BIN_H_
#include <r_types.h>
#include <r_io.h>
#include <r_array.h>
#include <r_list.h>
#include <list.h>
@ -25,11 +24,10 @@
/* types */
typedef struct r_bin_t {
const char *file;
int fd;
int rw;
int size;
void *bin_obj;
void *user;
struct r_io_bind_t iob;
struct r_buf_t *buf;
struct r_bin_handle_t *cur;
struct list_head bins;
} rBin;
@ -39,8 +37,8 @@ typedef struct r_bin_handle_t {
char *desc;
int (*init)(void *user);
int (*fini)(void *user);
int (*open)(struct r_bin_t *bin);
int (*close)(struct r_bin_t *bin);
int (*new)(struct r_bin_t *bin);
int (*free)(struct r_bin_t *bin);
int (*check)(struct r_bin_t *bin);
ut64 (*baddr)(struct r_bin_t *bin);
struct r_bin_entry_t* (*entry)(struct r_bin_t *bin);
@ -50,7 +48,6 @@ typedef struct r_bin_handle_t {
struct r_bin_string_t* (*strings)(struct r_bin_t *bin);
struct r_bin_info_t* (*info)(struct r_bin_t *bin);
struct r_bin_field_t* (*fields)(struct r_bin_t *bin);
ut64 (*resize_section)(struct r_bin_t *bin, char *name, ut64 size);
struct list_head list;
} rBinHandle;
@ -121,7 +118,7 @@ typedef struct r_bin_field_t {
int last;
} rBinField;
typedef struct r_bin_object_t {
typedef struct r_bin_obj_t {
rArray entrys;
rArray sections;
rArray symbols;
@ -132,27 +129,20 @@ typedef struct r_bin_object_t {
} rBinObject;
#ifdef R_API
R_API struct r_bin_object_t *r_bin_load (rBin *bin, const char *path, const char *plugin_name);
/* bin.c */
R_API struct r_bin_t *r_bin_new();
R_API struct r_bin_t *r_bin_free(struct r_bin_t *bin);
R_API int r_bin_init(struct r_bin_t *bin);
R_API void r_bin_set_user_ptr(struct r_bin_t *bin, void *user);
R_API int r_bin_add(struct r_bin_t *bin, struct r_bin_handle_t *foo);
R_API void* r_bin_free(struct r_bin_t *bin);
R_API int r_bin_list(struct r_bin_t *bin);
R_API int r_bin_open(struct r_bin_t *bin, const char *file, int rw, const char *plugin_name);
R_API int r_bin_close(struct r_bin_t *bin);
R_API struct r_bin_object_t* r_bin_load(struct r_bin_t *bin, const char *file, const char *plugin_name);
R_API ut64 r_bin_get_baddr(struct r_bin_t *bin);
R_API struct r_bin_entry_t* r_bin_get_entry(struct r_bin_t *bin);
R_API struct r_bin_section_t* r_bin_get_sections(struct r_bin_t *bin);
R_API struct r_bin_symbol_t* r_bin_get_symbols(struct r_bin_t *bin);
R_API struct r_bin_import_t* r_bin_get_imports(struct r_bin_t *bin);
R_API struct r_bin_string_t* r_bin_get_strings(struct r_bin_t *bin);
R_API struct r_bin_info_t* r_bin_get_info(struct r_bin_t *bin);
R_API struct r_bin_field_t* r_bin_get_fields(struct r_bin_t *bin);
R_API ut64 r_bin_get_section_offset(struct r_bin_t *bin, const char *name);
R_API ut64 r_bin_get_section_rva(struct r_bin_t *bin, const char *name);
R_API ut64 r_bin_get_section_size(struct r_bin_t *bin, const char *name);
R_API struct r_bin_import_t* r_bin_get_imports(struct r_bin_t *bin);
R_API struct r_bin_info_t* r_bin_get_info(struct r_bin_t *bin);
R_API struct r_bin_section_t* r_bin_get_sections(struct r_bin_t *bin);
R_API struct r_bin_string_t* r_bin_get_strings(struct r_bin_t *bin);
R_API struct r_bin_symbol_t* r_bin_get_symbols(struct r_bin_t *bin);
R_API struct r_bin_t* r_bin_new(const char *file, const char *plugin_name);
R_API void r_bin_set_user_ptr(struct r_bin_t *bin, void *user);
#endif
#endif