* r_bin_pe

- Fixed exports bug
  - Little refactoring
This commit is contained in:
Nibble 2009-03-19 23:22:14 +01:00
parent 7e5f8de7eb
commit a18996b41f
3 changed files with 21 additions and 102 deletions

View file

@ -29,6 +29,7 @@ static PE_DWord PE_(r_bin_pe_aux_rva_to_offset)(PE_(r_bin_pe_obj) *bin, PE_DWord
return 0;
}
#if 0
static PE_DWord PE_(r_bin_pe_aux_offset_to_rva)(PE_(r_bin_pe_obj) *bin, PE_DWord offset)
{
PE_(image_section_header) *shdrp;
@ -45,6 +46,7 @@ static PE_DWord PE_(r_bin_pe_aux_offset_to_rva)(PE_(r_bin_pe_obj) *bin, PE_DWord
return 0;
}
#endif
static int PE_(r_bin_pe_do_checks)(PE_(r_bin_pe_obj) *bin)
{
@ -240,7 +242,7 @@ int PE_(r_bin_pe_get_entrypoint)(PE_(r_bin_pe_obj) *bin, PE_(r_bin_pe_entrypoint
int PE_(r_bin_pe_get_exports)(PE_(r_bin_pe_obj) *bin, PE_(r_bin_pe_export) *export)
{
PE_DWord functions_offset, names_offset, ordinals_offset, function_rva, name_rva, name_offset;
PE_CWord functions_offset, names_offset, ordinals_offset, function_rva, name_rva, name_offset;
PE_Word function_ordinal;
PE_(r_bin_pe_export) *exportp;
char function_name[PE_NAME_LENGTH], forwarder_name[PE_NAME_LENGTH];
@ -248,7 +250,7 @@ int PE_(r_bin_pe_get_exports)(PE_(r_bin_pe_obj) *bin, PE_(r_bin_pe_export) *expo
int i;
PE_(image_data_directory) *data_dir_export =
&bin->nt_headers->optional_header.DataDirectory[PE_IMAGE_DIRECTORY_ENTRY_EXPORT];
PE_DWord export_dir_rva = data_dir_export->VirtualAddress;
PE_CWord export_dir_rva = data_dir_export->VirtualAddress;
int export_dir_size = data_dir_export->Size;
if (PE_(r_bin_pe_init_exports)(bin) == -1)
@ -263,12 +265,12 @@ int PE_(r_bin_pe_get_exports)(PE_(r_bin_pe_obj) *bin, PE_(r_bin_pe_export) *expo
exportp = export;
for (i = 0; i < bin->export_directory->NumberOfNames; i++, exportp++) {
lseek(bin->fd, functions_offset + i * sizeof(PE_DWord), SEEK_SET);
read(bin->fd, &function_rva, sizeof(PE_DWord));
lseek(bin->fd, functions_offset + i * sizeof(PE_CWord), SEEK_SET);
read(bin->fd, &function_rva, sizeof(PE_CWord));
lseek(bin->fd, ordinals_offset + i * sizeof(PE_Word), SEEK_SET);
read(bin->fd, &function_ordinal, sizeof(PE_Word));
lseek(bin->fd, names_offset + i * sizeof(PE_DWord), SEEK_SET);
read(bin->fd, &name_rva, sizeof(PE_DWord));
lseek(bin->fd, names_offset + i * sizeof(PE_CWord), SEEK_SET);
read(bin->fd, &name_rva, sizeof(PE_CWord));
name_offset = PE_(r_bin_pe_aux_rva_to_offset)(bin, name_rva);
if (name_offset) {
@ -312,9 +314,9 @@ int PE_(r_bin_pe_get_file_alignment)(PE_(r_bin_pe_obj) *bin)
return bin->nt_headers->optional_header.FileAlignment;
}
PE_DWord PE_(r_bin_pe_get_image_base)(PE_(r_bin_pe_obj) *bin)
u64 PE_(r_bin_pe_get_image_base)(PE_(r_bin_pe_obj) *bin)
{
return bin->nt_headers->optional_header.ImageBase;
return(u64)bin->nt_headers->optional_header.ImageBase;
}
int PE_(r_bin_pe_get_imports)(PE_(r_bin_pe_obj) *bin, PE_(r_bin_pe_import) *import)

View file

@ -70,7 +70,7 @@ int PE_(r_bin_pe_get_entrypoint)(PE_(r_bin_pe_obj)*, PE_(r_bin_pe_entrypoint)*);
int PE_(r_bin_pe_get_exports)(PE_(r_bin_pe_obj)*, PE_(r_bin_pe_export)*);
int PE_(r_bin_pe_get_exports_count)(PE_(r_bin_pe_obj)*);
int PE_(r_bin_pe_get_file_alignment)(PE_(r_bin_pe_obj)*);
PE_DWord PE_(r_bin_pe_get_image_base)(PE_(r_bin_pe_obj)*);
u64 PE_(r_bin_pe_get_image_base)(PE_(r_bin_pe_obj)*);
int PE_(r_bin_pe_get_image_size)(PE_(r_bin_pe_obj)*);
int PE_(r_bin_pe_get_imports)(PE_(r_bin_pe_obj)*, PE_(r_bin_pe_import)*);
int PE_(r_bin_pe_get_imports_count)(PE_(r_bin_pe_obj)*);

View file

@ -5,6 +5,7 @@
#undef ILT_MASK2
#undef PE_Word
#undef PE_DWord
#undef PE_CWord
#ifdef R_BIN_PE64
#define PE_(name) Pe64_##name
@ -12,12 +13,14 @@
#define ILT_MASK2 0x7fffffffffffffffLL
#define PE_Word u16
#define PE_DWord u64
#define PE_CWord u32
#else
#define PE_(name) Pe32_##name
#define ILT_MASK1 0x80000000
#define ILT_MASK2 0x7fffffff
#define PE_Word u16
#define PE_DWord u32
#define PE_CWord u32
#endif
#ifndef _INCLUDE_R_BIN_PE_SPECS_H_
@ -46,29 +49,7 @@ typedef struct {
u16 e_oeminfo; /* 26: OEM information; e_oemid specific */
u16 e_res2[10]; /* 28: Reserved words */
u32 e_lfanew; /* 3c: Offset to extended header */
} Pe32_image_dos_header;
typedef struct {
u16 e_magic; /* 00: MZ Header signature */
u16 e_cblp; /* 02: Bytes on last page of file */
u16 e_cp; /* 04: Pages in file */
u16 e_crlc; /* 06: Relocations */
u16 e_cparhdr; /* 08: Size of header in paragraphs */
u16 e_minalloc; /* 0a: Minimum extra paragraphs needed */
u16 e_maxalloc; /* 0c: Maximum extra paragraphs needed */
u16 e_ss; /* 0e: Initial (relative) SS value */
u16 e_sp; /* 10: Initial SP value */
u16 e_csum; /* 12: Checksum */
u16 e_ip; /* 14: Initial IP value */
u16 e_cs; /* 16: Initial (relative) CS value */
u16 e_lfarlc; /* 18: File address of relocation table */
u16 e_ovno; /* 1a: Overlay number */
u16 e_res[4]; /* 1c: Reserved words */
u16 e_oemid; /* 24: OEM identifier (for e_oeminfo) */
u16 e_oeminfo; /* 26: OEM information; e_oemid specific */
u16 e_res2[10]; /* 28: Reserved words */
u32 e_lfanew; /* 3c: Offset to extended header */
} Pe64_image_dos_header;
} Pe32_image_dos_header, Pe64_image_dos_header;
#define PE_IMAGE_FILE_TYPE_PE32 0x10b
#define PE_IMAGE_FILE_TYPE_PE32PLUS 0x20b
@ -129,17 +110,7 @@ typedef struct {
u32 NumberOfSymbols;
u16 SizeOfOptionalHeader;
u16 Characteristics;
} Pe32_image_file_header;
typedef struct {
u16 Machine;
u16 NumberOfSections;
u32 TimeDateStamp;
u32 PointerToSymbolTable;
u32 NumberOfSymbols;
u16 SizeOfOptionalHeader;
u16 Characteristics;
} Pe64_image_file_header;
} Pe32_image_file_header, Pe64_image_file_header;
#define PE_IMAGE_DIRECTORY_ENTRIES 16
#define PE_IMAGE_DIRECTORY_ENTRY_EXPORT 0
@ -174,12 +145,7 @@ typedef struct {
typedef struct {
u32 VirtualAddress;
u32 Size;
} Pe32_image_data_directory;
typedef struct {
u32 VirtualAddress;
u32 Size;
} Pe64_image_data_directory;
} Pe32_image_data_directory, Pe64_image_data_directory;
typedef struct {
/* Standard fields */
@ -273,23 +239,7 @@ typedef struct {
u16 NumberOfRelocations;
u16 NumberOfLinenumbers;
u32 Characteristics;
} Pe32_image_section_header;
typedef struct {
u8 Name[PE_IMAGE_SIZEOF_SHORT_NAME];
union {
u32 PhysicalAddress;
u32 VirtualSize;
} Misc;
u32 VirtualAddress;
u32 SizeOfRawData;
u32 PointerToRawData;
u32 PointerToRelocations;
u32 PointerToLinenumbers;
u16 NumberOfRelocations;
u16 NumberOfLinenumbers;
u32 Characteristics;
} Pe64_image_section_header;
} Pe32_image_section_header, Pe64_image_section_header;
typedef struct {
u32 Characteristics;
@ -303,21 +253,7 @@ typedef struct {
u32 AddressOfFunctions;
u32 AddressOfNames;
u32 AddressOfOrdinals;
} Pe32_image_export_directory;
typedef struct {
u32 Characteristics;
u32 TimeDateStamp;
u16 MajorVersion;
u16 MinorVersion;
u32 Name;
u32 Base;
u32 NumberOfFunctions;
u32 NumberOfNames;
u32 AddressOfFunctions;
u32 AddressOfNames;
u32 AddressOfOrdinals;
} Pe64_image_export_directory;
} Pe32_image_export_directory, Pe64_image_export_directory;
typedef struct {
u32 Characteristics;
@ -325,15 +261,7 @@ typedef struct {
u32 ForwarderChain;
u32 Name;
u32 FirstThunk;
} Pe32_image_import_directory;
typedef struct {
u32 Characteristics;
u32 TimeDateStamp;
u32 ForwarderChain;
u32 Name;
u32 FirstThunk;
} Pe64_image_import_directory;
} Pe32_image_import_directory, Pe64_image_import_directory;
typedef struct {
u32 Attributes;
@ -344,18 +272,7 @@ typedef struct {
u32 BoundDelayImportTable;
u32 UnloadDelayImportTable;
u32 TimeStamp;
} Pe32_image_delay_import_directory;
typedef struct {
u32 Attributes;
u32 Name;
u32 ModuleHandle;
u32 DelayImportAddressTable;
u32 DelayImportNameTable;
u32 BoundDelayImportTable;
u32 UnloadDelayImportTable;
u32 TimeStamp;
} Pe64_image_delay_import_directory;
} Pe32_image_delay_import_directory, Pe64_image_delay_import_directory;
typedef struct {
u32 Signature;