static RList *symbols(RBinFile *arch) { const char *coffname; size_t i; RList *ret = NULL; RBinSymbol *ptr = NULL; struct r_bin_coff_obj *obj = (struct r_bin_coff_obj*)arch->o->bin_obj; if (!(ret = r_list_new())) return ret; ret->free = free; if (obj->symbols) for (i = 0; i < obj->hdr.f_nsyms; i++) { if (!(ptr = R_NEW0 (RBinSymbol))) break; coffname = r_coff_symbol_name (obj, &obj->symbols[i]); if (!coffname) { free (ptr); break; } strncpy (ptr->name, coffname, R_BIN_SIZEOF_STRINGS); strncpy (ptr->forwarder, "NONE", R_BIN_SIZEOF_STRINGS); strncpy (ptr->bind, "", R_BIN_SIZEOF_STRINGS); switch (obj->symbols[i].n_sclass) { case COFF_SYM_CLASS_FUNCTION: strcpy (ptr->type, "FUNC"); break; case COFF_SYM_CLASS_FILE: strcpy (ptr->type, "FILE"); break; case COFF_SYM_CLASS_SECTION: strcpy (ptr->type, "SECTION"); break; case COFF_SYM_CLASS_EXTERNAL: strcpy (ptr->type, "EXTERNAL"); break; case COFF_SYM_CLASS_STATIC: strcpy (ptr->type, "STATIC"); break; default: snprintf (ptr->type, R_BIN_SIZEOF_STRINGS, "%i", obj->symbols[i].n_sclass); } if (obj->symbols[i].n_scnum < obj->hdr.f_nscns) { ptr->paddr = obj->scn_hdrs[obj->symbols[i].n_scnum].s_scnptr + obj->symbols[i].n_value; } ptr->size = 4; ptr->ordinal = 0; r_list_append (ret, ptr); i += obj->symbols[i].n_numaux; free (ptr); } return ret; }
static RList *sections(RBinFile *arch) { char *tmp, *coffname = NULL; size_t i; RList *ret = NULL; RBinSection *ptr = NULL; struct r_bin_coff_obj *obj = (struct r_bin_coff_obj*)arch->o->bin_obj; ret = r_list_newf (free); if (!ret) { return NULL; } if (obj && obj->scn_hdrs) { for (i = 0; i < obj->hdr.f_nscns; i++) { free (coffname); tmp = r_coff_symbol_name (obj, &obj->scn_hdrs[i]); if (!tmp) { r_list_free (ret); return NULL; } //IO does not like sections with the same name append idx //since it will update it coffname = r_str_newf ("%s-%d", tmp, i); free (tmp); ptr = R_NEW0 (RBinSection); if (!ptr) { free (coffname); return ret; } strncpy (ptr->name, coffname, R_BIN_SIZEOF_STRINGS); if (strstr (ptr->name, "data")) { ptr->is_data = true; } ptr->size = obj->scn_hdrs[i].s_size; ptr->vsize = obj->scn_hdrs[i].s_size; ptr->paddr = obj->scn_hdrs[i].s_scnptr; ptr->add = true; ptr->srwx = R_BIN_SCN_MAP; if (obj->scn_hdrs[i].s_flags & COFF_SCN_MEM_READ) { ptr->srwx |= R_BIN_SCN_READABLE; } if (obj->scn_hdrs[i].s_flags & COFF_SCN_MEM_WRITE) { ptr->srwx |= R_BIN_SCN_WRITABLE; } if (obj->scn_hdrs[i].s_flags & COFF_SCN_MEM_EXECUTE) { ptr->srwx |= R_BIN_SCN_EXECUTABLE; } r_list_append (ret, ptr); } } free (coffname); return ret; }
static bool _fill_bin_symbol(struct r_bin_coff_obj *bin, int idx, RBinSymbol **sym) { RBinSymbol *ptr = *sym; char * coffname = NULL; struct coff_symbol *s = NULL; if (idx < 0 || idx > bin->hdr.f_nsyms) { return false; } if (!bin->symbols) { return false; } s = &bin->symbols[idx]; coffname = r_coff_symbol_name (bin, s); if (!coffname) { return false; } ptr->name = strdup (coffname); free (coffname); ptr->forwarder = r_str_const ("NONE"); switch (s->n_sclass) { case COFF_SYM_CLASS_FUNCTION: ptr->type = r_str_const ("FUNC"); break; case COFF_SYM_CLASS_FILE: ptr->type = r_str_const ("FILE"); break; case COFF_SYM_CLASS_SECTION: ptr->type = r_str_const ("SECTION"); break; case COFF_SYM_CLASS_EXTERNAL: ptr->type = r_str_const ("EXTERNAL"); break; case COFF_SYM_CLASS_STATIC: ptr->type = r_str_const ("STATIC"); break; default: ptr->type = r_str_const (sdb_fmt (0, "%i", s->n_sclass)); break; } if (bin->symbols[idx].n_scnum < bin->hdr.f_nscns && bin->symbols[idx].n_scnum > 0) { //first index is 0 that is why -1 ptr->paddr = bin->scn_hdrs[s->n_scnum - 1].s_scnptr + s->n_value; } ptr->size = 4; ptr->ordinal = 0; return true; }
static RList *sections(RBinFile *arch) { const char *coffname; size_t i; RList *ret = NULL; RBinSection *ptr = NULL; struct r_bin_coff_obj *obj = (struct r_bin_coff_obj*)arch->o->bin_obj; ret = r_list_new(); if (!ret) return NULL; if (obj && obj->scn_hdrs) for (i = 0; i < obj->hdr.f_nscns; i++) { coffname = r_coff_symbol_name (obj, &obj->scn_hdrs[i]); if (!coffname) { r_list_free (ret); return NULL; } ptr = R_NEW0 (RBinSection); strncpy (ptr->name, coffname, R_BIN_SIZEOF_STRINGS); ptr->size = obj->scn_hdrs[i].s_size; ptr->vsize = obj->scn_hdrs[i].s_size; ptr->paddr = obj->scn_hdrs[i].s_scnptr; ptr->srwx = R_BIN_SCN_MAP; if (obj->scn_hdrs[i].s_flags&COFF_SCN_MEM_READ) ptr->srwx |= R_BIN_SCN_READABLE; if (obj->scn_hdrs[i].s_flags&COFF_SCN_MEM_WRITE) ptr->srwx |= R_BIN_SCN_WRITABLE; if (obj->scn_hdrs[i].s_flags&COFF_SCN_MEM_EXECUTE) ptr->srwx |= R_BIN_SCN_EXECUTABLE; r_list_append (ret, ptr); } return ret; }