Decode ELF architecture.

This commit is contained in:
2018-03-15 00:49:28 +00:00
parent 51f2591a82
commit 7f78c4f151
2 changed files with 301 additions and 16 deletions

View File

@@ -9,7 +9,7 @@ namespace libexeinfo
{ {
public partial class ELF : IExecutable public partial class ELF : IExecutable
{ {
List<Architecture> architectures; Architecture[] architectures;
Elf64_Ehdr Header; Elf64_Ehdr Header;
string interpreter; string interpreter;
Dictionary<string, ElfNote> notes; Dictionary<string, ElfNote> notes;
@@ -82,7 +82,7 @@ namespace libexeinfo
Type = "Executable and Linkable Format (ELF)"; Type = "Executable and Linkable Format (ELF)";
IsBigEndian = Header.ei_data == eiData.ELFDATA2MSB; IsBigEndian = Header.ei_data == eiData.ELFDATA2MSB;
architectures = new List<Architecture>(); architectures = new Architecture[1];
switch(Header.ei_class) switch(Header.ei_class)
{ {
@@ -103,6 +103,8 @@ namespace libexeinfo
default: return; default: return;
} }
architectures[0] = GetArchitecture(Header.e_machine);
if(Header.ei_data != eiData.ELFDATA2LSB && Header.ei_data != eiData.ELFDATA2MSB || if(Header.ei_data != eiData.ELFDATA2LSB && Header.ei_data != eiData.ELFDATA2MSB ||
Header.ei_version != eiVersion.EV_CURRENT) return; Header.ei_version != eiVersion.EV_CURRENT) return;
@@ -693,5 +695,125 @@ namespace libexeinfo
return elfHdr.ei_mag.SequenceEqual(ELFMAG); return elfHdr.ei_mag.SequenceEqual(ELFMAG);
} }
static Architecture GetArchitecture(eMachine machine)
{
switch(machine)
{
case eMachine.EM_386: return Architecture.I386;
case eMachine.EM_68HC05: return Architecture.M68HC05;
case eMachine.EM_68HC08: return Architecture.M68HC08;
case eMachine.EM_68HC11: return Architecture.M68HC11;
case eMachine.EM_68HC12: return Architecture.M68HC12;
case eMachine.EM_68HC16: return Architecture.M68HC16;
case eMachine.EM_68K: return Architecture.M68K;
case eMachine.EM_78KOR: return Architecture.R78KOR;
case eMachine.EM_8051: return Architecture.I8051;
case eMachine.EM_860: return Architecture.I860;
case eMachine.EM_88K: return Architecture.M88K;
case eMachine.EM_960: return Architecture.I960;
case eMachine.EM_AARCH64: return Architecture.Aarch64;
case eMachine.EM_ALPHA_OLD:
case eMachine.EM_ALPHA: return Architecture.Alpha;
case eMachine.EM_ALTERA_NIOS2: return Architecture.NIOS2;
case eMachine.EM_AMDGPU: return Architecture.AmdGpu;
case eMachine.EM_ARCA: return Architecture.Arca;
case eMachine.EM_ARC_COMPACT2: return Architecture.ARCompact2;
case eMachine.EM_ARC_COMPACT: return Architecture.ARCompact;
case eMachine.EM_ARC: return Architecture.Argonaut;
case eMachine.EM_ARM: return Architecture.Arm;
case eMachine.EM_AVR32: return Architecture.Avr32;
case eMachine.EM_AVR: return Architecture.Avr;
case eMachine.EM_BA1: return Architecture.Ba1;
case eMachine.EM_BA2: return Architecture.Ba2;
case eMachine.EM_BLACKFIN: return Architecture.Blackfin;
case eMachine.EM_C166: return Architecture.C16;
case eMachine.EM_CDP: return Architecture.CDP;
case eMachine.EM_CE: return Architecture.CommunicationEngine;
case eMachine.EM_CLOUDSHIELD: return Architecture.CloudShield;
case eMachine.EM_COGE: return Architecture.Coge;
case eMachine.EM_COLDFIRE: return Architecture.Coldfire;
case eMachine.EM_COOL: return Architecture.CoolEngine;
case eMachine.EM_COREA_1ST: return Architecture.CoreA;
case eMachine.EM_COREA_2ND: return Architecture.CoreA2;
case eMachine.EM_CR16: return Architecture.CompactRisc16;
case eMachine.EM_CRAYNV2: return Architecture.CrayNv2;
case eMachine.EM_CRIS: return Architecture.Cris;
case eMachine.EM_CR: return Architecture.CompactRisc;
case eMachine.EM_CRX: return Architecture.CompactRiscX;
case eMachine.EM_CSR_KALIMBA: return Architecture.Kalimba;
case eMachine.EM_CUDA: return Architecture.Cuda;
case eMachine.EM_CYGNUS_M32R: return Architecture.M32R;
case eMachine.EM_CYGNUS_V850: return Architecture.V850;
case eMachine.EM_CYPRESS_M8C: return Architecture.M8C;
case eMachine.EM_D10V: return Architecture.D10V;
case eMachine.EM_D30V: return Architecture.D30V;
case eMachine.EM_DXP: return Architecture.DeepExecutionProcessor;
case eMachine.EM_FR20: return Architecture.FR20;
case eMachine.EM_FR30: return Architecture.FR30;
case eMachine.EM_FRV: return Architecture.FRV;
case eMachine.EM_FT32: return Architecture.FT32;
case eMachine.EM_FX66: return Architecture.FX66;
case eMachine.EM_H8_300H:
case eMachine.EM_H8_300:
case eMachine.EM_H8_500:
case eMachine.EM_H8S: return Architecture.H8;
case eMachine.EM_HOBBIT: return Architecture.Hobbit;
case eMachine.EM_HUANY: return Architecture.Huany;
case eMachine.EM_IA_64: return Architecture.IA64;
case eMachine.EM_IP2K: return Architecture.IP2K;
case eMachine.EM_JAVELIN: return Architecture.Javelin;
case eMachine.EM_LATTICEMICO32: return Architecture.Lattice;
case eMachine.EM_M16C: return Architecture.M16C;
case eMachine.EM_M32C: return Architecture.M32C;
case eMachine.EM_M32: return Architecture.We32000;
case eMachine.EM_M32R: return Architecture.M32R;
case eMachine.EM_MCST_ELBRUS: return Architecture.Elbrus;
case eMachine.EM_MICROBLAZE: return Architecture.MicroBlaze;
case eMachine.EM_MIPS: return Architecture.Mips;
case eMachine.EM_MIPS_RS3_LE: return Architecture.Mips3;
case eMachine.EM_MIPS_X: return Architecture.Mips;
case eMachine.EM_NS32K: return Architecture.We32000;
case eMachine.EM_OPEN8: return Architecture.Open8;
case eMachine.EM_OPENRISC: return Architecture.OpenRisc;
case eMachine.EM_PARISC: return Architecture.PaRisc;
case eMachine.EM_PDP10: return Architecture.Pdp10;
case eMachine.EM_PDP11: return Architecture.Pdp11;
case eMachine.EM_PJ: return Architecture.PicoJava;
case eMachine.EM_PPC64: return Architecture.PowerPc64;
case eMachine.EM_PPC: return Architecture.PowerPc;
case eMachine.EM_PRISM: return Architecture.Prism;
case eMachine.EM_R32C: return Architecture.R32C;
case eMachine.EM_RISCV: return Architecture.RiscV;
case eMachine.EM_S370: return Architecture.S370;
case eMachine.EM_S390_OLD:
case eMachine.EM_S390: return Architecture.S390;
case eMachine.EM_SHARC: return Architecture.Sharc;
case eMachine.EM_SH: return Architecture.Sh2;
case eMachine.EM_SPARC32PLUS:
case eMachine.EM_SPARC: return Architecture.Sparc;
case eMachine.EM_SPARCV9: return Architecture.Sparc64;
case eMachine.EM_SPU: return Architecture.Spu;
case eMachine.EM_STARCORE: return Architecture.StarCore;
case eMachine.EM_STM8: return Architecture.STM8;
case eMachine.EM_TILE64: return Architecture.Tile64;
case eMachine.EM_TILEGX: return Architecture.TileGx;
case eMachine.EM_TILEPRO: return Architecture.TilePro;
case eMachine.EM_TINYJ: return Architecture.TinyJ;
case eMachine.EM_TRICORE: return Architecture.TriCore;
case eMachine.EM_TRIMEDIA: return Architecture.TriMedia;
case eMachine.EM_V800: return Architecture.V800;
case eMachine.EM_V850: return Architecture.V850;
case eMachine.EM_VAX: return Architecture.Vax;
case eMachine.EM_VIDEOCORE3:
case eMachine.EM_VIDEOCORE5:
case eMachine.EM_VIDEOCORE: return Architecture.VideoCore;
case eMachine.EM_X86_64: return Architecture.Amd64;
case eMachine.EM_XCORE: return Architecture.Xcore;
case eMachine.EM_XTENSA: return Architecture.Xtensa;
case eMachine.EM_Z80: return Architecture.Z80;
default: return Architecture.Unknown;
}
}
} }
} }

View File

@@ -33,32 +33,114 @@ namespace libexeinfo
Alpha, Alpha,
Am33, Am33,
Amd64, Amd64,
AmdGpu,
Arca,
ARCompact,
ARCompact2,
Argonaut,
Arm, Arm,
Avr,
Avr32,
Ba1,
Ba2,
Blackfin,
C16,
CDP,
Clipper, Clipper,
CloudShield,
Coge,
Coldfire,
CommunicationEngine,
CompactRisc,
CompactRisc16,
CompactRiscX,
CoolEngine,
CoreA,
CoreA2,
CrayNv2,
Cris,
Cuda,
D10V,
D30V,
DeepExecutionProcessor,
EfiByteCode, EfiByteCode,
I86, Elbrus,
FR20,
FR30,
FRV,
FT32,
FX66,
H8,
Hobbit,
Huany,
I286, I286,
I386, I386,
I8051,
I86,
I860, I860,
I960,
IA64, IA64,
IP2K,
Javelin,
Kalimba,
Lattice,
M16C,
M32C,
M32R, M32R,
M68HC05,
M68HC08,
M68HC11,
M68HC12,
M68HC16,
M68K, M68K,
M88K,
M8C,
MicroBlaze,
Mips, Mips,
Mips3,
Mips16, Mips16,
Mips3,
NIOS2,
Open8,
OpenRisc,
PaRisc,
Pdp10,
Pdp11,
PicoJava,
Power, Power,
PowerPc, PowerPc,
PowerPc64, PowerPc64,
Prism,
R32C,
R78KOR,
RiscV, RiscV,
S370,
S390,
Sh2, Sh2,
Sh3, Sh3,
Sh4, Sh4,
Sh5, Sh5,
Sharc,
Sparc, Sparc,
Sparc64, Sparc64,
Spu,
StarCore,
STM8,
Thumb, Thumb,
Thumb2, Thumb2,
We32000 Tile64,
TileGx,
TilePro,
TinyJ,
TriCore,
TriMedia,
V800,
V850,
Vax,
VideoCore,
We32000,
Xcore,
Xtensa,
Z80
} }
public static class Enums public static class Enums
@@ -70,33 +152,114 @@ namespace libexeinfo
(Architecture.Alpha, "axp", "Alpha"), (Architecture.Alpha, "axp", "Alpha"),
(Architecture.Am33, "am33", "AM33"), (Architecture.Am33, "am33", "AM33"),
(Architecture.Amd64, "amd64", "AMD64"), (Architecture.Amd64, "amd64", "AMD64"),
(Architecture.AmdGpu, "amdgpu", "AMD GPU"),
(Architecture.Arca, "arca", "Arca RISC"),
(Architecture.ARCompact2, "arcompact2", "ARCompact 2"),
(Architecture.ARCompact, "arcompact", "ARCompact"),
(Architecture.Argonaut, "arc", "Argonaut RISC Core"),
(Architecture.Arm, "arm", "ARM"), (Architecture.Arm, "arm", "ARM"),
(Architecture.Avr32, "avr32", "Atmel AVR32"),
(Architecture.Avr, "avr", "Atmel AVR"),
(Architecture.Ba1, "ba1", "BA1"),
(Architecture.Ba2, "ba2", "BA2"),
(Architecture.Blackfin, "blackfin", "Blackfin"),
(Architecture.C16, "c16", "Infineon C16x/XC16x"),
(Architecture.CDP, "cdp", "Paneve CDP"),
(Architecture.Clipper, "clipper", "Clipper"), (Architecture.Clipper, "clipper", "Clipper"),
(Architecture.CloudShield, "cloudshield", ""),
(Architecture.Coge, "coge", "Cognitive Smart Memory Processor"),
(Architecture.Coldfire, "coldfire", "Motorola ColdFire"),
(Architecture.CommunicationEngine, "fce", "Freescale Communication Engine"),
(Architecture.CompactRisc16, "cr16", "CompactRISC (16-bit)"),
(Architecture.CompactRisc, "cr", "CompactRISC"),
(Architecture.CompactRiscX, "crx", "CompactRISC X"),
(Architecture.CoolEngine, "coole", "Bluechip Systems CoolEngine"),
(Architecture.CoreA2, "corea2", "Core-A (2nd gen.)"),
(Architecture.CoreA, "corea", "Core-A"),
(Architecture.CrayNv2, "craynv2", "Cray NV2"),
(Architecture.Cris, "cris", "Axis Cris"),
(Architecture.Cuda, "cuda", "NVIDIA CUDA"),
(Architecture.D10V, "d10v", "Mitsubishi D10V"),
(Architecture.D30V, "d30v", "Mitsubishi D30V"),
(Architecture.DeepExecutionProcessor, "dep", "Deep Execution Processor"),
(Architecture.EfiByteCode, "ebc", "EFI Byte Code"), (Architecture.EfiByteCode, "ebc", "EFI Byte Code"),
(Architecture.I86, "i86", "Intel x86 (16-bit)"), (Architecture.Elbrus, "elbrus", "Elbrus"),
(Architecture.FR20, "fr20", "Fujitsu FR20"),
(Architecture.FR30, "fr30", "Fujitsu FR30"),
(Architecture.FRV, "frv", "Fujitsu FR-V"),
(Architecture.FT32, "ft32", "FTDI FT32"),
(Architecture.FX66, "fx66", "Siemens FX66"),
(Architecture.H8, "h8", "Hitachi H8"),
(Architecture.Hobbit, "hobbit", "AT&T Hobbit"),
(Architecture.Huany, "huany", "Harvard University machine-independent"),
(Architecture.I286, "i286", "Intel x86 (16-bit protected mode)"), (Architecture.I286, "i286", "Intel x86 (16-bit protected mode)"),
(Architecture.I386, "ia32", "Intel IA-32"), (Architecture.I386, "ia32", "Intel IA-32"),
(Architecture.I8051, "8051", "Intel 8051"),
(Architecture.I86, "i860", "Intel i860"), (Architecture.I86, "i860", "Intel i860"),
(Architecture.I86, "i86", "Intel x86 (16-bit)"),
(Architecture.I960, "i960", "Intel 960"),
(Architecture.IA64, "ia64", "Intel IA-64"), (Architecture.IA64, "ia64", "Intel IA-64"),
(Architecture.IP2K, "ip2k", "Ubicom IP2xxx"),
(Architecture.Javelin, "javelin", "Infineon Javelin"),
(Architecture.Kalimba, "kalimba", "Kalimba"),
(Architecture.Lattice, "lattice", "Lattice Mico32"),
(Architecture.M16C, "m16c", "Renesas M16C"),
(Architecture.M32C, "m32c", "Renesas M32C"),
(Architecture.M32R, "m32r", "Mitsubishi M32R"), (Architecture.M32R, "m32r", "Mitsubishi M32R"),
(Architecture.M68HC05, "68hc05", "Motorola 68HC05"),
(Architecture.M68HC08, "68hc08", "Motorola 68HC08"),
(Architecture.M68HC11, "68hc11", "Motorola 68HC11"),
(Architecture.M68HC12, "68hc12", "Motorola 68HC12"),
(Architecture.M68HC16, "68hc16", "Motorola 68HC16"),
(Architecture.M68K, "m68k", "Motorola 68000"), (Architecture.M68K, "m68k", "Motorola 68000"),
(Architecture.Mips, "mips", "MIPS"), (Architecture.M88K, "m88k", "Motorola 88000"),
(Architecture.Mips3, "mips3", "MIPS III"), (Architecture.M8C, "m8c", "Cypress M8C"),
(Architecture.MicroBlaze, "microblaze", "MicroBlanse"),
(Architecture.Mips16, "mips16", "MIPS16"), (Architecture.Mips16, "mips16", "MIPS16"),
(Architecture.Power, "power", "POWER"), (Architecture.Mips3, "mips3", "MIPS III"),
(Architecture.PowerPc, "ppc", "PowerPC"), (Architecture.Mips, "mips", "MIPS"),
(Architecture.NIOS2, "nios2", "Altera Nios II"),
(Architecture.Open8, "open8", "Open8"),
(Architecture.OpenRisc, "openrisc", "OpenRisc"),
(Architecture.PaRisc, "hppa", "HP PA-RISC"),
(Architecture.Pdp10, "pdp10", "Digital PDP-10"),
(Architecture.Pdp11, "pdp11", "Digital PDP-11"),
(Architecture.PicoJava, "picojava", "PicoJava"),
(Architecture.PowerPc64, "ppc64", "PowerPC (64-bit)"), (Architecture.PowerPc64, "ppc64", "PowerPC (64-bit)"),
(Architecture.PowerPc, "ppc", "PowerPC"),
(Architecture.Power, "power", "POWER"),
(Architecture.Prism, "prism", "PRISM"),
(Architecture.R32C, "r32c", "Renesas R32C"),
(Architecture.R78KOR, "78kor", "Renesas 78KOR"),
(Architecture.RiscV, "riscv", "RISC-V"), (Architecture.RiscV, "riscv", "RISC-V"),
(Architecture.S370, "s370", "IBMSystem/370"),
(Architecture.S390, "s390", "IBM S/390"),
(Architecture.Sh2, "sh2", "Hitachi SH2"), (Architecture.Sh2, "sh2", "Hitachi SH2"),
(Architecture.Sh3, "sh3", "Hitachi SH3"), (Architecture.Sh3, "sh3", "Hitachi SH3"),
(Architecture.Sh4, "sh4", "Hitachi SH4"), (Architecture.Sh4, "sh4", "Hitachi SH4"),
(Architecture.Sh5, "sh5", "Hitachi SH5"), (Architecture.Sh5, "sh5", "Hitachi SH5"),
(Architecture.Sparc, "sparc", "SPARC"), (Architecture.Sharc, "sharc", "SHARC"),
(Architecture.Sparc64, "sparc64", "SPARC (64-bit)"), (Architecture.Sparc64, "sparc64", "SPARC (64-bit)"),
(Architecture.Thumb, "thumb", "ARM Thumb"), (Architecture.Sparc, "sparc", "SPARC"),
(Architecture.Spu, "spu", "IBM SPU"),
(Architecture.StarCore, "starcore", "Motorola Star*Core"),
(Architecture.STM8, "stm8", "STM8"),
(Architecture.Thumb2, "thumb2", "ARM Thumb-2"), (Architecture.Thumb2, "thumb2", "ARM Thumb-2"),
(Architecture.We32000, "we32000", "WE32000") (Architecture.Thumb, "thumb", "ARM Thumb"),
(Architecture.Tile64, "tile64", "Tile64"),
(Architecture.TileGx, "tilegx", "TileGx"),
(Architecture.TilePro, "tilepro", "Tile Pro"),
(Architecture.TinyJ, "tinyj", "TinyJ"),
(Architecture.TriCore, "tricore", "TriCore"),
(Architecture.TriMedia, "trimedia", "TriMedia"),
(Architecture.V800, "v800", "NEC V800"),
(Architecture.V850, "v850", "NEC V850"),
(Architecture.Vax, "vax", "Digital VAX"),
(Architecture.VideoCore, "videocore", "VideoCore"),
(Architecture.We32000, "we32000", "WE32000"),
(Architecture.Xcore, "xcore", "xCORE"),
(Architecture.Xtensa, "xtensa", "Xtensa"),
(Architecture.Z80, "z80", "Z80")
}; };
} }
} }