github.com/vchain-us/vcn@v0.9.11-0.20210921212052-a2484d23c0b3/pkg/extractor/file/internal/sniff/elf.go (about) 1 /* 2 * Copyright (c) 2018-2020 vChain, Inc. All Rights Reserved. 3 * This software is released under GPL3. 4 * The full license information can be found under: 5 * https://www.gnu.org/licenses/gpl-3.0.en.html 6 * 7 */ 8 9 package sniff 10 11 import ( 12 "debug/elf" 13 "os" 14 "strings" 15 ) 16 17 var elfosabiDesc = map[elf.OSABI]string{ 18 elf.ELFOSABI_HPUX: "HP-UX operating system", 19 elf.ELFOSABI_NETBSD: "NetBSD", 20 elf.ELFOSABI_LINUX: "GNU/Linux", 21 elf.ELFOSABI_HURD: "GNU/Hurd", 22 elf.ELFOSABI_86OPEN: "86Open common IA32 ABI", 23 elf.ELFOSABI_SOLARIS: "Solaris", 24 elf.ELFOSABI_AIX: "AIX", 25 elf.ELFOSABI_IRIX: "IRIX", 26 elf.ELFOSABI_FREEBSD: "FreeBSD", 27 elf.ELFOSABI_TRU64: "TRU64 UNIX", 28 elf.ELFOSABI_MODESTO: "Novell Modesto", 29 elf.ELFOSABI_OPENBSD: "OpenBSD", 30 elf.ELFOSABI_OPENVMS: "Open VMS", 31 elf.ELFOSABI_NSK: "HP Non-Stop Kernel", 32 elf.ELFOSABI_AROS: "Amiga Research OS", 33 elf.ELFOSABI_FENIXOS: "The FenixOS highly scalable multi-core OS", 34 elf.ELFOSABI_CLOUDABI: "Nuxi CloudABI", 35 elf.ELFOSABI_ARM: "ARM", 36 elf.ELFOSABI_STANDALONE: "Standalone (embedded) application", 37 } 38 39 func ELF(file *os.File) (*Data, error) { 40 f, err := elf.NewFile(file) 41 if err != nil { 42 return nil, err 43 } 44 45 platform := elfosabiDesc[f.OSABI] 46 if platform == "" { 47 // https://refspecs.linuxfoundation.org/LSB_1.2.0/gLSB/noteabitag.html 48 if abiTag := f.Section(".note.ABI-tag"); abiTag != nil { 49 if data, err := abiTag.Data(); err == nil && strings.Contains(string(data), "GNU") { 50 platform = "GNU/Linux" 51 } 52 } 53 } 54 55 d := &Data{ 56 Format: "ELF", 57 Type: strings.TrimPrefix(f.Type.String(), "ET_"), 58 Platform: platform, 59 Arch: strings.TrimPrefix(f.Machine.String(), "EM_"), 60 X64: f.Class == elf.ELFCLASS64, 61 } 62 return d, nil 63 }