github.com/saferwall/pe@v1.5.2/overlay.go (about)

     1  // Copyright 2022 Saferwall. All rights reserved.
     2  // Use of this source code is governed by Apache v2 license
     3  // license that can be found in the LICENSE file.
     4  
     5  package pe
     6  
     7  import (
     8  	"errors"
     9  	"io"
    10  )
    11  
    12  // error
    13  var (
    14  	ErrNoOverlayFound = errors.New("pe does not have overlay data")
    15  )
    16  
    17  // NewOverlayReader returns a new ReadSeeker reading the PE overlay data.
    18  func (pe *File) NewOverlayReader() (*io.SectionReader, error) {
    19  	if pe.data == nil {
    20  		return nil, errors.New("pe: file reader is nil")
    21  	}
    22  	return io.NewSectionReader(pe.f, pe.OverlayOffset, 1<<63-1), nil
    23  }
    24  
    25  // Overlay returns the overlay of the PE file.
    26  func (pe *File) Overlay() ([]byte, error) {
    27  	sr, err := pe.NewOverlayReader()
    28  	if err != nil {
    29  		return nil, err
    30  	}
    31  
    32  	overlay := make([]byte, int64(pe.size)-pe.OverlayOffset)
    33  	n, err := sr.ReadAt(overlay, 0)
    34  	if n == len(overlay) {
    35  		pe.HasOverlay = true
    36  		err = nil
    37  	}
    38  
    39  	return overlay, err
    40  }
    41  
    42  func (pe *File) OverlayLength() int64 {
    43  	return int64(pe.size) - pe.OverlayOffset
    44  }