use chrono::serde::ts_seconds_option;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct PEInfo {
#[serde(default)]
pub rich_pe_header_hash: Option<String>,
#[serde(default, with = "ts_seconds_option")]
pub timestamp: Option<DateTime<Utc>>,
#[serde(default)]
pub compiler_product_versions: Vec<String>,
pub entry_point: u64,
pub machine_type: u32,
pub imphash: String,
#[serde(default)]
pub sections: Vec<PESection>,
#[serde(default)]
pub import_list: Vec<PEImports>,
#[serde(flatten)]
pub extra: HashMap<String, serde_json::Value>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct PESection {
pub name: String,
pub chi2: f32,
pub virtual_address: u64,
pub entropy: f32,
pub raw_size: u64,
pub flags: String,
pub virtual_size: u64,
pub md5: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct PEImports {
pub library_name: String,
#[serde(default)]
pub imported_functions: Vec<String>,
}
pub mod dotnet {
use super::*;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct DotNetAssembly {
pub entry_point_rva: u64,
pub metadata_header_rva: u64,
pub assembly_name: String,
pub assembly_flags: u32,
pub strongname_va: u32,
pub tables_rows_map_log: String,
pub external_assemblies: HashMap<String, ExternalAssembly>,
#[serde(default)]
pub type_definition_list: Vec<TypeDefinition>,
pub entry_point_token: u64,
pub tables_rows_map: String,
pub assembly_flags_txt: String,
pub streams: HashMap<String, Stream>,
pub tables_present: u32,
pub tables_present_map: String,
pub clr_version: String,
pub clr_meta_version: String,
pub assembly_data: AssemblyData,
pub resources_va: u64,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ExternalAssembly {
pub version: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TypeDefinition {
#[serde(default)]
pub type_definitions: Vec<String>,
pub namespace: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Stream {
pub chi2: f32,
pub size: u64,
pub entropy: f32,
pub md5: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct AssemblyData {
pub majorversion: u64,
pub minorversion: u64,
pub hashalgid: u64,
#[serde(default)]
pub flags_text: Option<String>,
pub buildnumber: u64,
pub flags: u64,
pub revisionnumber: u64,
pub name: String,
}
}