* Add get_main() for mach0 (32,64)

* Proper use of arch/bits. debugger works fine now for osx-32/64
This commit is contained in:
pancake 2011-09-22 09:52:00 +02:00
parent 0217c146ef
commit 677a499440
9 changed files with 69 additions and 15 deletions

View File

@ -414,7 +414,7 @@ struct r_bin_mach0_symbol_t* MACH0_(r_bin_mach0_get_symbols)(struct MACH0_(r_bin
if (!bin->symtab || !bin->symstr)
return NULL;
if (!(symbols = malloc((bin->dysymtab.nextdefsym + bin->dysymtab.nlocalsym + 1) * sizeof(struct r_bin_mach0_symbol_t))))
if (!(symbols = malloc ((bin->dysymtab.nextdefsym + bin->dysymtab.nlocalsym + 1) * sizeof(struct r_bin_mach0_symbol_t))))
return NULL;
for (s = j = 0; s < 2; s++) {
if (s == 0) {
@ -764,3 +764,19 @@ char* MACH0_(r_bin_mach0_get_filetype)(struct MACH0_(r_bin_mach0_obj_t)* bin) {
default: return r_str_dup_printf ("Unknown");
}
}
ut64 MACH0_(r_bin_mach0_get_main)(struct MACH0_(r_bin_mach0_obj_t)* bin) {
ut64 addr = 0LL;
struct r_bin_mach0_symbol_t *symbols;
int i;
if (!(symbols = MACH0_(r_bin_mach0_get_symbols) (bin)))
return 0;
for (i = 0; !symbols[i].last; i++)
if (!strcmp (symbols[i].name, "_main")) {
addr = symbols[i].addr;
break;
}
free (symbols);
return addr;
}

View File

@ -105,6 +105,7 @@ int MACH0_(r_bin_mach0_is_big_endian)(struct MACH0_(r_bin_mach0_obj_t)* bin);
char* MACH0_(r_bin_mach0_get_cputype)(struct MACH0_(r_bin_mach0_obj_t)* bin);
char* MACH0_(r_bin_mach0_get_cpusubtype)(struct MACH0_(r_bin_mach0_obj_t)* bin);
char* MACH0_(r_bin_mach0_get_filetype)(struct MACH0_(r_bin_mach0_obj_t)* bin);
ut64 MACH0_(r_bin_mach0_get_main)(struct MACH0_(r_bin_mach0_obj_t)* bin);
#if 0
int r_bin_mach0_get_file_alignment(r_bin_mach0_obj*);

View File

@ -358,6 +358,19 @@ static RBuffer* create(RBin* bin, const ut8 *code, int codelen, const ut8 *data,
return buf;
}
static RBinAddr* binsym(RBinArch *arch, int sym) {
RBinAddr *ret = NULL;
switch (sym) {
case R_BIN_SYM_MAIN:
if (!(ret = R_NEW (RBinAddr)))
return NULL;
memset (ret, '\0', sizeof (RBinAddr));
ret->offset = ret->rva = MACH0_(r_bin_mach0_get_main) (arch->bin_obj);
break;
}
return ret;
}
struct r_bin_plugin_t r_bin_plugin_mach0 = {
.name = "mach0",
.desc = "mach0 bin plugin",
@ -367,7 +380,7 @@ struct r_bin_plugin_t r_bin_plugin_mach0 = {
.destroy = &destroy,
.check = &check,
.baddr = &baddr,
.binsym = NULL,
.binsym = &binsym,
.entries = &entries,
.sections = &sections,
.symbols = &symbols,

View File

@ -165,6 +165,19 @@ D(0x80000003); // unknown subtype issue
return buf;
}
static RBinAddr* binsym(RBinArch *arch, int sym) {
RBinAddr *ret = NULL;
switch (sym) {
case R_BIN_SYM_MAIN:
if (!(ret = R_NEW (RBinAddr)))
return NULL;
memset (ret, '\0', sizeof (RBinAddr));
ret->offset = ret->rva = MACH0_(r_bin_mach0_get_main) (arch->bin_obj);
break;
}
return ret;
}
struct r_bin_plugin_t r_bin_plugin_mach064 = {
.name = "mach064",
.desc = "mach064 bin plugin",
@ -174,7 +187,7 @@ struct r_bin_plugin_t r_bin_plugin_mach064 = {
.destroy = &destroy,
.check = &check,
.baddr = &baddr,
.binsym = NULL,
.binsym = binsym,
.entries = &entries,
.sections = &sections,
.symbols = &symbols,

View File

@ -350,7 +350,8 @@ static int config_asmbits_callback(void *user, void *data) {
}
if (!r_anal_set_bits (core->anal, node->i_value))
eprintf ("asm.arch: Cannot setup '%i' bits analysis engine\n", (int)node->i_value);
// TODO: change debugger backend bit profile here
if (core->dbg && core->anal && core->anal->cur)
r_debug_set_arch (core->dbg, core->anal->cur->arch, node->i_value);
return ret;
}

View File

@ -118,7 +118,7 @@ R_API int r_core_bin_load(RCore *r, const char *file) {
// M -> Main
r_flag_space_set (r->flags, "symbols");
if ((binmain = r_bin_get_sym (r->bin, R_BIN_SYM_MAIN)) != NULL)
r_flag_set (r->flags, "main", va?baddr+binmain->rva:binmain->offset,
r_flag_set (r->flags, "main", va? baddr+binmain->rva: binmain->offset,
r->blocksize, 0);
// e -> Entrypoints
@ -126,12 +126,12 @@ R_API int r_core_bin_load(RCore *r, const char *file) {
if ((list = r_bin_get_entries (r->bin)) != NULL) {
r_list_foreach (list, iter, entry) {
snprintf (str, R_FLAG_NAME_SIZE, "entry%i", i++);
r_flag_set (r->flags, str, va?baddr+entry->rva:entry->offset,
r_flag_set (r->flags, str, va? baddr+entry->rva: entry->offset,
r->blocksize, 0);
}
/* Seek to the last entry point */
if (entry)
r_core_seek (r, va?baddr+entry->rva:entry->offset, 0);
r_core_seek (r, va? baddr+entry->rva: entry->offset, 0);
}
// s -> Symbols
@ -143,13 +143,15 @@ R_API int r_core_bin_load(RCore *r, const char *file) {
r_name_filter (name, 80);
snprintf (str, R_FLAG_NAME_SIZE, "sym.%s", name);
if (!strncmp (symbol->type,"OBJECT", 6))
r_meta_add (r->anal->meta, R_META_TYPE_DATA, va?baddr+symbol->rva:symbol->offset,
(va?baddr+symbol->rva:symbol->offset)+symbol->size, name);
r_flag_set (r->flags, str, va?baddr+symbol->rva:symbol->offset,
r_meta_add (r->anal->meta, R_META_TYPE_DATA,
va? baddr+symbol->rva: symbol->offset,
(va? baddr+symbol->rva: symbol->offset)+symbol->size, name);
r_flag_set (r->flags, str, va? baddr+symbol->rva: symbol->offset,
symbol->size, 0);
dname = r_bin_demangle (r->bin, symbol->name);
if (dname) {
r_meta_add (r->anal->meta, R_META_TYPE_COMMENT, va?baddr+symbol->rva:symbol->offset,
r_meta_add (r->anal->meta, R_META_TYPE_COMMENT,
va? baddr+symbol->rva: symbol->offset,
symbol->size, dname);
free (dname);
}

View File

@ -88,12 +88,20 @@ R_API int r_debug_set_arch(RDebug *dbg, int arch, int bits) {
if (dbg && dbg->h) {
if (arch & dbg->h->arch) {
//eprintf ("arch supported by debug backend (%x)\n", arch);
switch (bits) {
case 32:
dbg->bits = R_SYS_BITS_32;
break;
case 64:
dbg->bits = R_SYS_BITS_64;
break;
}
dbg->arch = arch;
return R_TRUE;
}
eprintf ("arch (%s) not supported by debug backend (%s)\n",
r_sys_arch_str (arch), dbg->h);
}
eprintf ("arch (%s) not supported by debug backend (%s)\n",
r_sys_arch_str (arch), dbg->h->name);
return R_FALSE;
}

View File

@ -32,7 +32,7 @@ R_API int r_debug_use(RDebug *dbg, const char *str) {
if (h->name && !strcmp (str, h->name)) {
dbg->h = h;
if (dbg->anal && dbg->anal->cur)
r_debug_set_arch (dbg, dbg->anal->cur->arch, dbg->anal->cur->bits);
r_debug_set_arch (dbg, dbg->anal->cur->arch, dbg->bits);
dbg->bp->breakpoint = dbg->h->breakpoint;
dbg->bp->user = dbg;
}

View File

@ -142,7 +142,7 @@ static int debug_attach(int pid) {
task_t task = pid_to_task (pid);
if (task == -1)
return -1;
eprintf ("; pid = %d\ntask= %d\n", pid, task);
eprintf ("pid: %d\ntask: %d\n", pid, task);
#if 0
// TODO : move this code into debug
if (task_threads (task, &inferior_threads, &inferior_thread_count)