use std::path::PathBuf;
use e_utils::cmd::ExeType;
use goblin::elf::header::*;
use goblin::mach::cputype::*;
use goblin::pe::header::*;
use serde::{Deserialize, Serialize};
use strum::*;
#[derive(Clone, Debug, Deserialize, Serialize, Default)]
pub struct Type {
pub fname: String,
pub cwd: Option<String>,
pub exe_type: ExeType,
pub architecture: ArchType,
pub platform: PlatformType,
pub is_lib: bool,
pub is_64: bool,
pub libs: Vec<Dependency>,
}
#[derive(Default, Clone, Debug, Deserialize, Serialize)]
pub struct ImportedFunction {
pub name: String,
pub ordinal: u16,
pub rva: usize,
}
#[derive(Default, Clone, Debug, Deserialize, Serialize)]
pub struct Dependency {
pub name: String,
pub is_exists: bool,
pub fullpath: Option<PathBuf>,
pub functions: Vec<ImportedFunction>,
}
#[derive(Default, Clone, Copy, Debug, Display, PartialEq, VariantArray, EnumString, Deserialize, Serialize)]
#[repr(u8)]
pub enum PlatformType {
Windows,
MacOS,
Linux,
Android,
IOS,
Unix,
#[default]
#[strum(to_string = "未知")]
Unknown,
}
impl PlatformType {
pub fn is_current(&self) -> bool {
match self {
PlatformType::Windows => cfg!(target_os = "windows"),
PlatformType::MacOS => cfg!(target_os = "macos"),
PlatformType::Linux => cfg!(target_os = "linux"),
PlatformType::Android => cfg!(target_os = "android"),
PlatformType::IOS => cfg!(target_os = "ios"),
PlatformType::Unix => cfg!(unix),
PlatformType::Unknown => true, }
}
}
pub struct ExeTypeEx(pub ExeType);
impl ExeTypeEx {
pub fn from_linux(t: u16, is_lib: bool) -> Self {
Self(match t {
goblin::elf::header::ET_EXEC => ExeType::LinuxExe,
goblin::elf::header::ET_DYN => {
if is_lib {
ExeType::So
} else {
ExeType::LinuxExe
}
}
goblin::elf::header::ET_REL => ExeType::Unknown,
goblin::elf::header::ET_CORE => ExeType::Unknown,
_ => ExeType::LinuxExe,
})
}
pub fn from_android(t: u16, is_lib: bool) -> Self {
Self(match t {
goblin::elf::header::ET_EXEC => ExeType::AndroidApk,
goblin::elf::header::ET_DYN => {
if is_lib {
ExeType::So
} else {
ExeType::AndroidApk }
}
_ => ExeType::So,
})
}
}
#[derive(Default, Clone, Copy, Debug, Display, PartialEq, VariantArray, EnumString, Deserialize, Serialize)]
#[repr(u8)]
pub enum ArchType {
X86,
X86_64,
ARM,
ARM64,
MIPS,
PowerPC,
PowerPC64,
SPARC,
MC68K,
HPPA,
MC88K,
I860,
Alpha,
VAX,
ARM64_32,
#[default]
#[strum(to_string = "未知")]
Unknown,
}
impl ArchType {
pub fn is_current(&self) -> bool {
match self {
ArchType::X86 => cfg!(target_arch = "x86"),
ArchType::X86_64 => cfg!(target_arch = "x86_64"),
ArchType::ARM => cfg!(target_arch = "arm"),
ArchType::ARM64 => cfg!(target_arch = "aarch64"),
ArchType::MIPS => cfg!(target_arch = "mips"),
ArchType::PowerPC => cfg!(target_arch = "powerpc"),
ArchType::PowerPC64 => cfg!(target_arch = "powerpc64"),
ArchType::SPARC => cfg!(target_arch = "sparc"),
ArchType::MC68K => cfg!(target_arch = "m68k"),
ArchType::HPPA => false,
ArchType::MC88K => false, ArchType::I860 => false, ArchType::Alpha => false, ArchType::VAX => false, ArchType::ARM64_32 => false, ArchType::Unknown => true, }
}
pub fn from_mach(value: u32) -> Self {
match value {
CPU_TYPE_X86 => ArchType::X86,
CPU_TYPE_X86_64 => ArchType::X86_64,
CPU_TYPE_ARM => ArchType::ARM,
CPU_TYPE_ARM64 => ArchType::ARM64,
CPU_TYPE_MIPS => ArchType::MIPS,
CPU_TYPE_POWERPC => ArchType::PowerPC,
CPU_TYPE_POWERPC64 => ArchType::PowerPC64,
CPU_TYPE_SPARC => ArchType::SPARC,
CPU_TYPE_MC680X0 => ArchType::MC68K,
CPU_TYPE_HPPA => ArchType::HPPA,
CPU_TYPE_MC88000 => ArchType::MC88K,
CPU_TYPE_I860 => ArchType::I860,
CPU_TYPE_ALPHA => ArchType::Alpha,
CPU_TYPE_VAX => ArchType::VAX,
CPU_TYPE_ARM64_32 => ArchType::ARM64_32,
_ => ArchType::Unknown,
}
}
pub fn from_pe(value: u16) -> Self {
match value {
COFF_MACHINE_X86 => ArchType::X86,
COFF_MACHINE_X86_64 => ArchType::X86_64,
COFF_MACHINE_ARM => ArchType::ARM,
COFF_MACHINE_ARM64 => ArchType::ARM64,
COFF_MACHINE_POWERPC => ArchType::PowerPC,
COFF_MACHINE_ALPHA => ArchType::Alpha,
_ => ArchType::Unknown,
}
}
pub fn from_elf(value: u16) -> Self {
match value {
EM_386 => ArchType::X86,
EM_X86_64 => ArchType::X86_64,
EM_ARM => ArchType::ARM,
EM_AARCH64 => ArchType::ARM64,
EM_MIPS => ArchType::MIPS,
EM_PPC => ArchType::PowerPC,
EM_PPC64 => ArchType::PowerPC64,
EM_SPARC => ArchType::SPARC,
_ => ArchType::Unknown,
}
}
}