Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions pe/cert.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,15 @@ func readCertTable(f *File, r io.ReadSeeker) ([]byte, error) {

var certTableOffset, certTableSize uint32

switch f.FileHeader.Machine {
case IMAGE_FILE_MACHINE_I386:
certTableOffset = f.OptionalHeader.(*OptionalHeader32).DataDirectory[CERTIFICATE_TABLE].VirtualAddress
certTableSize = f.OptionalHeader.(*OptionalHeader32).DataDirectory[CERTIFICATE_TABLE].Size
case IMAGE_FILE_MACHINE_AMD64:
certTableOffset = f.OptionalHeader.(*OptionalHeader64).DataDirectory[CERTIFICATE_TABLE].VirtualAddress
certTableSize = f.OptionalHeader.(*OptionalHeader64).DataDirectory[CERTIFICATE_TABLE].Size
switch oh := f.OptionalHeader.(type) {
case *OptionalHeader32:
certTableOffset = oh.DataDirectory[CERTIFICATE_TABLE].VirtualAddress
certTableSize = oh.DataDirectory[CERTIFICATE_TABLE].Size
case *OptionalHeader64:
certTableOffset = oh.DataDirectory[CERTIFICATE_TABLE].VirtualAddress
certTableSize = oh.DataDirectory[CERTIFICATE_TABLE].Size
default:
return nil, errors.New("architecture not supported")
return nil, errors.New("unsupported optional header type")
}

// check if certificate table exists
Expand Down
2 changes: 1 addition & 1 deletion pe/exports.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ type Export struct {

// Exports - gets exports
func (f *File) Exports() ([]Export, error) {
pe64 := f.Machine == IMAGE_FILE_MACHINE_AMD64
pe64 := f.is64()

// grab the number of data directory entries
var ddLength uint32
Expand Down
8 changes: 7 additions & 1 deletion pe/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ func newFileInternal(r io.ReaderAt, memoryMode bool) (*File, error) {
return nil, err
}
switch f.FileHeader.Machine {
case IMAGE_FILE_MACHINE_UNKNOWN, IMAGE_FILE_MACHINE_ARMNT, IMAGE_FILE_MACHINE_AMD64, IMAGE_FILE_MACHINE_I386:
case IMAGE_FILE_MACHINE_UNKNOWN, IMAGE_FILE_MACHINE_ARMNT, IMAGE_FILE_MACHINE_ARM64, IMAGE_FILE_MACHINE_AMD64, IMAGE_FILE_MACHINE_I386:
default:
return nil, fmt.Errorf("Unrecognised COFF file header machine value of 0x%x", f.FileHeader.Machine)
}
Expand Down Expand Up @@ -442,6 +442,12 @@ func (e *FormatError) Error() string {
}

// RVAToFileOffset Converts a Relative offset to the actual offset in the file.
// is64 reports whether the file has a PE32+ optional header.
func (f *File) is64() bool {
_, ok := f.OptionalHeader.(*OptionalHeader64)
return ok
}

func (f *File) RVAToFileOffset(rva uint32) uint32 {
var offset uint32
for _, section := range f.Sections {
Expand Down
4 changes: 2 additions & 2 deletions pe/imports.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ func (f *File) ImportDirectoryTable() ([]ImportDirectory, *Section, *[]byte, err
// satisfied by other libraries at dynamic load time.
// It does not return weak symbols.
func (f *File) ImportedSymbols() ([]string, error) {
pe64 := f.Machine == IMAGE_FILE_MACHINE_AMD64
pe64 := f.is64()

ida, ds, sectionData, err := f.ImportDirectoryTable()
if err != nil {
Expand Down Expand Up @@ -142,7 +142,7 @@ func (f *File) ImportedLibraries() ([]string, error) {
}

func (f File) sectionFromDirectoryEntry(directory uint32) (*Section, DataDirectory) {
pe64 := f.Machine == IMAGE_FILE_MACHINE_AMD64
pe64 := f.is64()

// grab the number of data directory entries
var ddLength uint32
Expand Down
4 changes: 2 additions & 2 deletions pe/reloc.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ func (f *File) readBaseRelocationTable() (*[]RelocationTableEntry, error) {
}

var dd DataDirectory
if f.Machine == IMAGE_FILE_MACHINE_AMD64 {
if f.is64() {
dd = f.OptionalHeader.(*OptionalHeader64).DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]
} else {
dd = f.OptionalHeader.(*OptionalHeader32).DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]
Expand Down Expand Up @@ -111,7 +111,7 @@ func (f *File) readBaseRelocationTable() (*[]RelocationTableEntry, error) {
// Relocate - performs base relocations on this image to the given offset
func (f *File) Relocate(baseAddr uint64, image *[]byte) {
var imageBase uint64
pe64 := f.Machine == IMAGE_FILE_MACHINE_AMD64
pe64 := f.is64()
if pe64 {
imageBase = f.OptionalHeader.(*OptionalHeader64).ImageBase
} else {
Expand Down
12 changes: 5 additions & 7 deletions pe/write.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,25 +48,23 @@ func (peFile *File) Bytes() ([]byte, error) {
oldCertTableOffset, oldCertTableSize uint32
)

switch peFile.FileHeader.Machine {
case IMAGE_FILE_MACHINE_I386:
switch optionalHeader := peFile.OptionalHeader.(type) {
case *OptionalHeader32:
is32bit = true
optionalHeader := peFile.OptionalHeader.(*OptionalHeader32)
binary.Write(peBuf, binary.LittleEndian, peFile.OptionalHeader.(*OptionalHeader32))
binary.Write(peBuf, binary.LittleEndian, optionalHeader)
bytesWritten += uint64(binary.Size(optionalHeader))

oldCertTableOffset = optionalHeader.DataDirectory[CERTIFICATE_TABLE].VirtualAddress
oldCertTableSize = optionalHeader.DataDirectory[CERTIFICATE_TABLE].Size
case IMAGE_FILE_MACHINE_AMD64:
case *OptionalHeader64:
is32bit = false
optionalHeader := peFile.OptionalHeader.(*OptionalHeader64)
binary.Write(peBuf, binary.LittleEndian, optionalHeader)
bytesWritten += uint64(binary.Size(optionalHeader))

oldCertTableOffset = optionalHeader.DataDirectory[CERTIFICATE_TABLE].VirtualAddress
oldCertTableSize = optionalHeader.DataDirectory[CERTIFICATE_TABLE].Size
default:
return nil, errors.New("architecture not supported")
return nil, errors.New("unsupported optional header type")
}

// write section headers
Expand Down