struct r_bin_te_section_t* r_bin_te_get_sections(struct r_bin_te_obj_t* bin) { struct r_bin_te_section_t *sections = NULL; TE_image_section_header *shdr; int i, sections_count; if (!bin) return NULL; shdr = bin->section_header; sections_count = bin->header->NumberOfSections; if ((sections = calloc((sections_count + 1), sizeof(struct r_bin_te_section_t))) == NULL) { perror ("malloc (sections)"); return NULL; } for (i = 0; i < sections_count; i++) { memcpy (sections[i].name, shdr[i].Name, TE_IMAGE_SIZEOF_NAME); // not a null terminated string if len==buflen //sections[i].name[TE_IMAGE_SIZEOF_NAME] = '\0'; sections[i].vaddr = shdr[i].VirtualAddress - r_bin_te_get_stripped_delta(bin); sections[i].size = shdr[i].SizeOfRawData; sections[i].vsize = shdr[i].VirtualSize; sections[i].paddr = shdr[i].PointerToRawData - r_bin_te_get_stripped_delta(bin); sections[i].flags = shdr[i].Characteristics; sections[i].last = 0; } sections[i].last = 1; return sections; }
struct r_bin_te_addr_t* r_bin_te_get_entrypoint(struct r_bin_te_obj_t* bin) { struct r_bin_te_addr_t *entry = NULL; if ((entry = malloc(sizeof(struct r_bin_te_addr_t))) == NULL) { perror("malloc (entrypoint)"); return NULL; } entry->rva = bin->header->AddressOfEntryPoint - r_bin_te_get_stripped_delta(bin); if (entry->rva == 0) // in TE if EP = 0 then EP = baddr entry->rva = bin->header->ImageBase; entry->offset = r_bin_te_rva_to_offset(bin, entry->rva); return entry; }
RBinAddr* r_bin_te_get_entrypoint(struct r_bin_te_obj_t* bin) { RBinAddr *entry = NULL; if (!bin || !bin->header) return NULL; if ((entry = malloc(sizeof(RBinAddr))) == NULL) { perror("malloc (entrypoint)"); return NULL; } entry->vaddr = bin->header->AddressOfEntryPoint - r_bin_te_get_stripped_delta(bin); if (entry->vaddr == 0) // in TE if EP = 0 then EP = baddr entry->vaddr = bin->header->ImageBase; entry->paddr = r_bin_te_vaddr_to_paddr(bin, entry->vaddr); return entry; }