* Fix configure-plugins sort function
* Now r_bin is only using r_buf/r_file for file handling
This commit is contained in:
parent
1721bdfe79
commit
08d5afd5c5
|
@ -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 () {
|
||||
|
|
279
libr/bin/bin.c
279
libr/bin/bin.c
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 = §ions,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue