Projects STRLCPY Offensive-Rust Commits 5630e8dc
🤬
  • ■ ■ ■ ■ ■ ■
    peparse.rs
     1 +use std::fmt::Write;
     2 +use std::io::Read;
     3 +use winapi::ctypes::c_void;
     4 +use winapi::um::memoryapi::WriteProcessMemory;
     5 +use winapi::um::processthreadsapi::GetCurrentProcess;
     6 + 
     7 +pub fn FillStructureFromArray<T, U>(base: &mut T, arr: &[U]) -> usize {
     8 + unsafe {
     9 + //println!("{}",std::mem::size_of::<T>());
     10 + // println!("{}",std::mem::size_of_val(arr));
     11 + if std::mem::size_of::<T>() != std::mem::size_of_val(arr) {
     12 + println!("{}", std::mem::size_of::<T>());
     13 + println!("{}", std::mem::size_of_val(arr));
     14 + panic!("sizes are not equal to copy");
     15 + }
     16 + 
     17 + let mut handle = GetCurrentProcess();
     18 + let mut byteswritten = 0;
     19 + let res = WriteProcessMemory(
     20 + handle,
     21 + base as *mut _ as *mut c_void,
     22 + arr as *const _ as *const c_void,
     23 + std::mem::size_of_val(arr),
     24 + &mut byteswritten,
     25 + );
     26 + 
     27 + return byteswritten;
     28 + }
     29 +}
     30 + 
     31 +fn main() {
     32 + use std::fs::File;
     33 + let filepath = r#"D:\rust_practice\command_exec\target\debug\command_exec.exe"#;
     34 + let mut buffer = Vec::new();
     35 + 
     36 + let mut fd = File::open(filepath).unwrap();
     37 + fd.read_to_end(&mut buffer);
     38 + 
     39 + println!("{:#?}", String::from_utf8_lossy(&buffer[0..2]));
     40 + 
     41 + let mut dos = IMAGE_DOS_HEADER::default();
     42 + let byteswritten = FillStructureFromArray(&mut dos, &buffer[0..64]);
     43 + println!("{:x?}", dos.e_magic);
     44 + println!("{:x?}", dos.e_lfanew);
     45 + 
     46 + let mut ntheader = IMAGE_NT_HEADERS64::default();
     47 + FillStructureFromArray(
     48 + &mut ntheader.Signature,
     49 + &buffer[(dos.e_lfanew as usize)..((dos.e_lfanew + 4) as usize)],
     50 + );
     51 + println!("{:x?}", ntheader.Signature);
     52 + 
     53 + FillStructureFromArray(
     54 + &mut ntheader.FileHeader,
     55 + &buffer[((dos.e_lfanew + 4) as usize)..((dos.e_lfanew + 4 + 20) as usize)],
     56 + );
     57 + println!("{:x?}", ntheader.FileHeader);
     58 + 
     59 + FillStructureFromArray(
     60 + &mut ntheader.OptionalHeader,
     61 + &buffer[((dos.e_lfanew + 4 + 20) as usize)
     62 + ..(((dos.e_lfanew as usize) + std::mem::size_of::<IMAGE_NT_HEADERS64>()) as usize)]
     63 + );
     64 + 
     65 + println!("{:x?}", ntheader.OptionalHeader);
     66 + println!("{}",std::mem::size_of_val(&ntheader.OptionalHeader));
     67 +}
     68 + 
     69 +#[derive(Debug, Default, Clone)]
     70 +#[repr(C)]
     71 +pub struct IMAGE_OPTIONAL_HEADER64 {
     72 + Magic: u16,
     73 + 
     74 + MajorLinkerVersion: u8,
     75 + 
     76 + MinorLinkerVersion: u8,
     77 + 
     78 + SizeOfCode: u32,
     79 + 
     80 + SizeOfInitializedData: u32,
     81 + 
     82 + SizeOfUninitializedData: u32,
     83 + 
     84 + AddressOfEntryPoint: u32,
     85 + 
     86 + BaseOfCode: u32,
     87 + 
     88 + ImageBase: i64,
     89 + 
     90 + SectionAlignment: u32,
     91 + 
     92 + FileAlignment: u32,
     93 + 
     94 + MajorOperatingSystemVersion: u16,
     95 + 
     96 + MinorOperatingSystemVersion: u16,
     97 + 
     98 + MajorImageVersion: u16,
     99 + 
     100 + MinorImageVersion: u16,
     101 + 
     102 + MajorSubsystemVersion: u16,
     103 + 
     104 + MinorSubsystemVersion: u16,
     105 + 
     106 + Win32VersionValue: u32,
     107 + 
     108 + SizeOfImage: u32,
     109 + 
     110 + SizeOfHeaders: u32,
     111 + 
     112 + CheckSum: u32,
     113 + 
     114 + Subsystem: u16,
     115 + 
     116 + DllCharacteristics: u16,
     117 + 
     118 + SizeOfStackReserve: u64,
     119 + 
     120 + SizeOfStackCommit: u64,
     121 + 
     122 + SizeOfHeapReserve: u64,
     123 + 
     124 + SizeOfHeapCommit: u64,
     125 + 
     126 + LoaderFlags: u32,
     127 + 
     128 + NumberOfRvaAndSizes: u32,
     129 + 
     130 + ExportTable: IMAGE_DATA_DIRECTORY,
     131 + 
     132 + ImportTable: IMAGE_DATA_DIRECTORY,
     133 + 
     134 + ResourceTable: IMAGE_DATA_DIRECTORY,
     135 + 
     136 + ExceptionTable: IMAGE_DATA_DIRECTORY,
     137 + 
     138 + CertificateTable: IMAGE_DATA_DIRECTORY,
     139 + 
     140 + BaseRelocationTable: IMAGE_DATA_DIRECTORY,
     141 + 
     142 + Debug: IMAGE_DATA_DIRECTORY,
     143 + 
     144 + Architecture: IMAGE_DATA_DIRECTORY,
     145 + 
     146 + GlobalPtr: IMAGE_DATA_DIRECTORY,
     147 + 
     148 + TLSTable: IMAGE_DATA_DIRECTORY,
     149 + LoadConfigTable: IMAGE_DATA_DIRECTORY,
     150 + BoundImport: IMAGE_DATA_DIRECTORY,
     151 + 
     152 + IAT: IMAGE_DATA_DIRECTORY,
     153 + 
     154 + DelayImportDescriptor: IMAGE_DATA_DIRECTORY,
     155 + CLRRuntimeHeader: IMAGE_DATA_DIRECTORY,
     156 + 
     157 + Reserved: IMAGE_DATA_DIRECTORY,
     158 +}
     159 + 
     160 +#[derive(Debug, Default, Clone)]
     161 +#[repr(C)]
     162 +pub struct IMAGE_OPTIONAL_HEADER32 {
     163 + Magic: u16,
     164 + 
     165 + MajorLinkerVersion: u8,
     166 + 
     167 + MinorLinkerVersion: u8,
     168 + 
     169 + SizeOfCode: u32,
     170 + 
     171 + SizeOfInitializedData: u32,
     172 + 
     173 + SizeOfUninitializedData: u32,
     174 + 
     175 + AddressOfEntryPoint: u32,
     176 + 
     177 + BaseOfCode: u32,
     178 + 
     179 + // PE32 contains this additional field
     180 + BaseOfData: u32,
     181 + 
     182 + ImageBase: u32,
     183 + 
     184 + SectionAlignment: u32,
     185 + 
     186 + FileAlignment: u32,
     187 + 
     188 + MajorOperatingSystemVersion: u16,
     189 + 
     190 + MinorOperatingSystemVersion: u16,
     191 + 
     192 + MajorImageVersion: u16,
     193 + 
     194 + MinorImageVersion: u16,
     195 + 
     196 + MajorSubsystemVersion: u16,
     197 + 
     198 + MinorSubsystemVersion: u16,
     199 + 
     200 + Win32VersionValue: u32,
     201 + 
     202 + SizeOfImage: u32,
     203 + 
     204 + SizeOfHeaders: u32,
     205 + 
     206 + CheckSum: u32,
     207 + 
     208 + Subsystem: u32,
     209 + 
     210 + DllCharacteristics: u16,
     211 + 
     212 + SizeOfStackReserve: u32,
     213 + 
     214 + SizeOfStackCommit: u32,
     215 + 
     216 + SizeOfHeapReserve: u32,
     217 + 
     218 + SizeOfHeapCommit: u32,
     219 + 
     220 + LoaderFlags: u32,
     221 + 
     222 + NumberOfRvaAndSizes: u32,
     223 + 
     224 + ExportTable: IMAGE_DATA_DIRECTORY,
     225 + 
     226 + ImportTable: IMAGE_DATA_DIRECTORY,
     227 + 
     228 + ResourceTable: IMAGE_DATA_DIRECTORY,
     229 + 
     230 + ExceptionTable: IMAGE_DATA_DIRECTORY,
     231 + 
     232 + CertificateTable: IMAGE_DATA_DIRECTORY,
     233 + 
     234 + BaseRelocationTable: IMAGE_DATA_DIRECTORY,
     235 + 
     236 + Debug: IMAGE_DATA_DIRECTORY,
     237 + 
     238 + Architecture: IMAGE_DATA_DIRECTORY,
     239 + 
     240 + GlobalPtr: IMAGE_DATA_DIRECTORY,
     241 + 
     242 + TLSTable: IMAGE_DATA_DIRECTORY,
     243 + LoadConfigTable: IMAGE_DATA_DIRECTORY,
     244 + BoundImport: IMAGE_DATA_DIRECTORY,
     245 + 
     246 + IAT: IMAGE_DATA_DIRECTORY,
     247 + 
     248 + DelayImportDescriptor: IMAGE_DATA_DIRECTORY,
     249 + CLRRuntimeHeader: IMAGE_DATA_DIRECTORY,
     250 + 
     251 + Reserved: IMAGE_DATA_DIRECTORY,
     252 +}
     253 + 
     254 +#[derive(Debug, Default, Clone)]
     255 +#[repr(C)]
     256 +pub struct IMAGE_FILE_HEADER {
     257 + Machine: u16,
     258 + NumberOfSections: u16,
     259 + TimeDateStamp: u32,
     260 + PointerToSymbolTable: u32,
     261 + NumberOfSymbols: u32,
     262 + SizeOfOptionalHeader: u16,
     263 + Characteristics: u16,
     264 +}
     265 + 
     266 +#[derive(Debug, Default, Clone)]
     267 +#[repr(C)]
     268 +pub struct IMAGE_DATA_DIRECTORY {
     269 + VirtualAddress: u32,
     270 + Size: u32,
     271 +}
     272 + 
     273 +#[derive(Debug, Default, Clone)]
     274 +#[repr(C)]
     275 +pub struct IMAGE_NT_HEADERS32 {
     276 + Signature: u32,
     277 + 
     278 + FileHeader: IMAGE_FILE_HEADER,
     279 + 
     280 + OptionalHeader: IMAGE_OPTIONAL_HEADER32,
     281 +}
     282 + 
     283 +#[derive(Debug, Default, Clone)]
     284 +#[repr(C)]
     285 +pub struct IMAGE_NT_HEADERS64 {
     286 + Signature: u32,
     287 + 
     288 + FileHeader: IMAGE_FILE_HEADER,
     289 + 
     290 + OptionalHeader: IMAGE_OPTIONAL_HEADER64,
     291 +}
     292 + 
     293 +#[derive(Debug, Default, Clone)]
     294 +#[repr(C)]
     295 + 
     296 +pub struct IMAGE_DOS_HEADER {
     297 + e_magic: [u8; 2], // Magic number
     298 + e_cblp: u16, // Bytes on last page of file
     299 + e_cp: u16, // Pages in file
     300 + e_crlc: u16, // Relocations
     301 + e_cparhdr: u16, // Size of header in paragraphs
     302 + e_minalloc: u16, // Minimum extra paragraphs needed
     303 + e_maxalloc: u16, // Maximum extra paragraphs needed
     304 + e_ss: u16, // Initial (relative) SS value
     305 + e_sp: u16, // Initial SP value
     306 + e_csum: u16, // Checksum
     307 + e_ip: u16, // Initial IP value
     308 + e_cs: u16, // Initial (relative) CS value
     309 + e_lfarlc: u16, // File address of relocation table
     310 + e_ovno: u16, // Overlay number
     311 + e_res1: [u16; 4], // Reserved words
     312 + e_oemid: u16, // OEM identifier (for e_oeminfo)
     313 + e_oeminfo: u16, // OEM information, e_oemid specific
     314 + e_res2: [u16; 10], // Reserved words
     315 + e_lfanew: i32, // File address of new exe header
     316 +}
     317 + 
Please wait...
Page is in error, reload to recover