github.com/anchore/syft@v1.38.2/syft/pkg/cataloger/binary/pe_package_cataloger.go (about)

     1  package binary
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"github.com/anchore/syft/internal/unknown"
     8  	"github.com/anchore/syft/syft/artifact"
     9  	"github.com/anchore/syft/syft/file"
    10  	"github.com/anchore/syft/syft/pkg"
    11  	"github.com/anchore/syft/syft/pkg/cataloger/generic"
    12  	"github.com/anchore/syft/syft/pkg/cataloger/internal/pe"
    13  )
    14  
    15  // NewPEPackageCataloger returns a cataloger that interprets packages from DLL and EXE files.
    16  func NewPEPackageCataloger() pkg.Cataloger {
    17  	return generic.NewCataloger("pe-binary-package-cataloger").
    18  		WithParserByGlobs(parsePE, "**/*.dll", "**/*.exe")
    19  }
    20  
    21  func parsePE(_ context.Context, _ file.Resolver, _ *generic.Environment, reader file.LocationReadCloser) ([]pkg.Package, []artifact.Relationship, error) {
    22  	f, err := pe.Read(reader)
    23  	if err != nil {
    24  		return nil, nil, fmt.Errorf("failed to parse PE file %q: %w", reader.RealPath, err)
    25  	}
    26  
    27  	if f == nil {
    28  		return nil, nil, unknown.Newf(reader, "unable to determine packages")
    29  	}
    30  
    31  	if f.CLR.HasEvidenceOfCLR() {
    32  		// this is for a .NET application, which is covered by other catalogers already
    33  		return nil, nil, nil
    34  	}
    35  
    36  	p := newPEPackage(f.VersionResources, f.Location)
    37  
    38  	return []pkg.Package{p}, nil, nil
    39  }