Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/ee/agent-smith/cmd/signature-elfdump.go
2500 views
1
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
2
// Licensed under the GNU Affero General Public License (AGPL).
3
// See License.AGPL.txt in the project root for license information.
4
5
package cmd
6
7
import (
8
"debug/elf"
9
"encoding/json"
10
"log"
11
"os"
12
13
"github.com/gitpod-io/gitpod/agent-smith/pkg/classifier"
14
"github.com/spf13/cobra"
15
)
16
17
var signatureElfdumpOpts struct {
18
Symbols bool
19
Rodata bool
20
}
21
22
// signatureElfdumpCmd represents the signatureElfdump command
23
var signatureElfdumpCmd = &cobra.Command{
24
Use: "elfdump <binary>",
25
Short: "Dumps all signatures found in an ELF binary",
26
Run: func(cmd *cobra.Command, args []string) {
27
f, err := os.OpenFile(args[0], os.O_RDONLY, 0644)
28
if err != nil {
29
log.Fatal(err)
30
}
31
defer f.Close()
32
33
var result struct {
34
Symbols []string `json:"symbols"`
35
Rodata []byte `json:"rodata"`
36
}
37
38
executable, err := elf.NewFile(f)
39
if err != nil {
40
log.Fatalf("cannot anaylze ELF file: %v", err)
41
return
42
}
43
44
result.Symbols, err = classifier.ExtractELFSymbols(executable)
45
if err != nil {
46
log.Fatal(err)
47
}
48
49
result.Rodata, err = classifier.ExtractELFRodata(executable)
50
if err != nil {
51
log.Fatal(err)
52
}
53
54
enc := json.NewEncoder(os.Stdout)
55
enc.SetIndent("", " ")
56
enc.Encode(result)
57
},
58
}
59
60
func init() {
61
signatureCmd.AddCommand(signatureElfdumpCmd)
62
signatureElfdumpCmd.Flags().BoolVar(&signatureElfdumpOpts.Symbols, "symbols", true, "extract ELF symbols")
63
signatureElfdumpCmd.Flags().BoolVar(&signatureElfdumpOpts.Rodata, "rodata", true, "extract ELF rodata")
64
}
65
66