pes/
images.rs

1#![allow(non_snake_case)]
2#![allow(non_camel_case_types)]
3
4use std::fmt;
5
6//----------------------------------------------------------------
7pub const IMAGE_DOS_SIGNATURE: u16 = 0x5A4D;
8
9#[derive(Debug, Copy, Clone)]
10#[repr(C)]
11// pub struct DosHeader {
12//     pub e_magic: u16,
13//     _unused: [u16; 29],
14//     pub e_lfanew: u32,
15// }
16pub struct IMAGE_DOS_HEADER {
17    pub e_magic: u16,
18    pub e_cblp: u16,
19    pub e_cp: u16,
20    pub e_crlc: u16,
21    pub e_cparhdr: u16,
22    pub e_minalloc: u16,
23    pub e_maxalloc: u16,
24    pub e_ss: u16,
25    pub e_sp: u16,
26    pub e_csum: u16,
27    pub e_ip: u16,
28    pub e_cs: u16,
29    pub e_lfarlc: u16,
30    pub e_ovno: u16,
31    pub e_res: [u16; 4],
32    pub e_oemid: u16,
33    pub e_oeminfo: u16,
34    pub e_res2: [u16; 10],
35    pub e_lfanew: u32,
36}
37
38//----------------------------------------------------------------
39
40pub const IMAGE_NT_HEADERS_SIGNATURE: u32 = 0x00004550;
41
42#[derive(Copy, Clone, Debug)]
43#[repr(C)]
44pub struct IMAGE_NT_HEADERS32 {
45    pub Signature: u32,
46    pub FileHeader: IMAGE_FILE_HEADER,
47    pub OptionalHeader: IMAGE_OPTIONAL_HEADER32,
48}
49
50#[derive(Copy, Clone, Debug)]
51#[repr(C)]
52pub struct IMAGE_NT_HEADERS64 {
53    pub Signature: u32,
54    pub FileHeader: IMAGE_FILE_HEADER,
55    pub OptionalHeader: IMAGE_OPTIONAL_HEADER64,
56}
57
58#[derive(Debug, Copy, Clone)]
59#[repr(C)]
60pub struct IMAGE_FILE_HEADER {
61    pub Machine: u16,
62    pub NumberOfSections: u16,
63    pub TimeDateStamp: u32,
64    pub PointerToSymbolTable: u32,
65    pub NumberOfSymbols: u32,
66    pub SizeOfOptionalHeader: u16,
67    pub Characteristics: u16,
68}
69
70pub const IMAGE_NT_OPTIONAL_HDR32_MAGIC: u16 = 0x10b;
71pub const IMAGE_NT_OPTIONAL_HDR64_MAGIC: u16 = 0x20b;
72
73// helper struct
74#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd)]
75#[repr(C)]
76pub struct IMAGE_VERSION<T> {
77    pub Major: T,
78    pub Minor: T,
79}
80
81impl<T: fmt::Display> fmt::Debug for IMAGE_VERSION<T> {
82    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
83        write!(f, "\"{}.{}\"", self.Major, self.Minor)
84    }
85}
86impl<T: fmt::Display> fmt::Display for IMAGE_VERSION<T> {
87    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
88        write!(f, "{}.{}", self.Major, self.Minor)
89    }
90}
91
92#[derive(Debug, Copy, Clone)]
93#[repr(C)]
94pub struct IMAGE_OPTIONAL_HEADER32 {
95    pub Magic: u16,
96    pub LinkerVersion: IMAGE_VERSION<u8>, // 2 b
97    pub SizeOfCode: u32,
98    pub SizeOfInitializedData: u32,
99    pub SizeOfUninitializedData: u32,
100    pub AddressOfEntryPoint: u32,
101    pub BaseOfCode: u32,
102    pub BaseOfData: u32,
103    pub ImageBase: u32,
104    pub SectionAlignment: u32,
105    pub FileAlignment: u32,
106    pub OperatingSystemVersion: IMAGE_VERSION<u16>,
107    pub ImageVersion: IMAGE_VERSION<u16>,
108    pub SubsystemVersion: IMAGE_VERSION<u16>,
109    pub Win32VersionValue: u32,
110    pub SizeOfImage: u32,
111    pub SizeOfHeaders: u32,
112    pub CheckSum: u32,
113    pub Subsystem: u16,
114    pub DllCharacteristics: u16,
115    pub SizeOfStackReserve: u32,
116    pub SizeOfStackCommit: u32,
117    pub SizeOfHeapReserve: u32,
118    pub SizeOfHeapCommit: u32,
119    pub LoaderFlags: u32,
120    pub NumberOfRvaAndSizes: u32,
121    pub DataDirectory: [IMAGE_DATA_DIRECTORY; 16],
122}
123//----------------------------------------------------------------
124
125#[derive(Copy, Clone, Debug)]
126#[repr(C)]
127pub struct IMAGE_DATA_DIRECTORY {
128    pub VirtualAddress: u32,
129    pub Size: u32,
130}
131
132pub const IMAGE_DIRECTORY_ENTRY_EXPORT: usize = 0;
133pub const IMAGE_DIRECTORY_ENTRY_IMPORT: usize = 1;
134pub const IMAGE_DIRECTORY_ENTRY_RESOURCE: usize = 2;
135pub const IMAGE_DIRECTORY_ENTRY_EXCEPTION: usize = 3;
136pub const IMAGE_DIRECTORY_ENTRY_SECURITY: usize = 4;
137pub const IMAGE_DIRECTORY_ENTRY_BASERELOC: usize = 5;
138pub const IMAGE_DIRECTORY_ENTRY_DEBUG: usize = 6;
139pub const IMAGE_DIRECTORY_ENTRY_ARCHITECTURE: usize = 7;
140pub const IMAGE_DIRECTORY_ENTRY_GLOBALPTR: usize = 8;
141pub const IMAGE_DIRECTORY_ENTRY_TLS: usize = 9;
142pub const IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG: usize = 10;
143pub const IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT: usize = 11;
144pub const IMAGE_DIRECTORY_ENTRY_IAT: usize = 12;
145pub const IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT: usize = 13;
146pub const IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR: usize = 14;
147
148pub const IMAGE_NUMBEROF_DIRECTORY_ENTRIES: usize = 16;
149
150//----------------------------------------------------------------
151#[derive(Copy, Clone, Debug)]
152#[repr(C)]
153pub struct IMAGE_OPTIONAL_HEADER64 {
154    pub Magic: u16,
155    pub LinkerVersion: IMAGE_VERSION<u8>,
156    pub SizeOfCode: u32,
157    pub SizeOfInitializedData: u32,
158    pub SizeOfUninitializedData: u32,
159    pub AddressOfEntryPoint: u32,
160    pub BaseOfCode: u32,
161    pub ImageBase: u64,
162    pub SectionAlignment: u32,
163    pub FileAlignment: u32,
164    pub OperatingSystemVersion: IMAGE_VERSION<u16>,
165    pub ImageVersion: IMAGE_VERSION<u16>,
166    pub SubsystemVersion: IMAGE_VERSION<u16>,
167    pub Win32VersionValue: u32,
168    pub SizeOfImage: u32,
169    pub SizeOfHeaders: u32,
170    pub CheckSum: u32,
171    pub Subsystem: u16,
172    pub DllCharacteristics: u16,
173    pub SizeOfStackReserve: u64,
174    pub SizeOfStackCommit: u64,
175    pub SizeOfHeapReserve: u64,
176    pub SizeOfHeapCommit: u64,
177    pub LoaderFlags: u32,
178    pub NumberOfRvaAndSizes: u32,
179    pub DataDirectory: [IMAGE_DATA_DIRECTORY; IMAGE_NUMBEROF_DIRECTORY_ENTRIES],
180}
181
182//----------------------------------------------------------------
183
184pub const IMAGE_SIZEOF_SHORT_NAME: usize = 8usize;
185
186#[derive(Copy, Clone, Debug)]
187#[repr(C)]
188pub struct IMAGE_SECTION_HEADER {
189    pub Name: [u8; IMAGE_SIZEOF_SHORT_NAME],
190    pub VirtualSize: u32,
191    pub VirtualAddress: u32,
192    pub SizeOfRawData: u32,
193    pub PointerToRawData: u32,
194    pub PointerToRelocations: u32,
195    pub PointerToLinenumbers: u32,
196    pub NumberOfRelocations: u16,
197    pub NumberOfLinenumbers: u16,
198    pub Characteristics: u32,
199}
200
201impl IMAGE_SECTION_HEADER {
202    pub fn name(&self) -> Result<&str, std::str::Utf8Error> {
203        std::str::from_utf8(&self.Name)
204    }
205}