Path: blob/main/components/ee/agent-smith/cmd/signature-elfdump.go
2500 views
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package cmd56import (7"debug/elf"8"encoding/json"9"log"10"os"1112"github.com/gitpod-io/gitpod/agent-smith/pkg/classifier"13"github.com/spf13/cobra"14)1516var signatureElfdumpOpts struct {17Symbols bool18Rodata bool19}2021// signatureElfdumpCmd represents the signatureElfdump command22var signatureElfdumpCmd = &cobra.Command{23Use: "elfdump <binary>",24Short: "Dumps all signatures found in an ELF binary",25Run: func(cmd *cobra.Command, args []string) {26f, err := os.OpenFile(args[0], os.O_RDONLY, 0644)27if err != nil {28log.Fatal(err)29}30defer f.Close()3132var result struct {33Symbols []string `json:"symbols"`34Rodata []byte `json:"rodata"`35}3637executable, err := elf.NewFile(f)38if err != nil {39log.Fatalf("cannot anaylze ELF file: %v", err)40return41}4243result.Symbols, err = classifier.ExtractELFSymbols(executable)44if err != nil {45log.Fatal(err)46}4748result.Rodata, err = classifier.ExtractELFRodata(executable)49if err != nil {50log.Fatal(err)51}5253enc := json.NewEncoder(os.Stdout)54enc.SetIndent("", " ")55enc.Encode(result)56},57}5859func init() {60signatureCmd.AddCommand(signatureElfdumpCmd)61signatureElfdumpCmd.Flags().BoolVar(&signatureElfdumpOpts.Symbols, "symbols", true, "extract ELF symbols")62signatureElfdumpCmd.Flags().BoolVar(&signatureElfdumpOpts.Rodata, "rodata", true, "extract ELF rodata")63}646566