Guest User

Mono structure marshalling

a guest
Jun 5th, 2017
30
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Linq;
  3. using System.Runtime.InteropServices;
  4.  
  5. namespace explicit1
  6. {
  7.     class Program
  8.     {
  9.  
  10.         public ImageNtHeaders32 NtHeaders { get; set; }
  11.  
  12.         public static T GetStructure<T>(byte[] data, int offset = 0)
  13.         {
  14.             var ptr = Marshal.AllocHGlobal(data.Length);
  15.             Marshal.Copy(data, offset, ptr, data.Length - offset);
  16.             var obj = (T)Marshal.PtrToStructure(ptr, typeof(T));
  17.             Marshal.FreeHGlobal(ptr);
  18.  
  19.             return obj;
  20.         }
  21.  
  22.         [StructLayout(LayoutKind.Sequential)]
  23.         public struct ImageFileHeader32
  24.         {
  25.             public ushort Machine;
  26.             public ushort NumberOfSections;
  27.             public uint TimeDateStamp;
  28.             public uint PointerToSymbolTable;
  29.             public uint NumberOfSymbols;
  30.             public ushort SizeOfOptionalHeader;
  31.             public ushort Characteristics;
  32.         }
  33.  
  34.         public enum MagicType : ushort
  35.         {
  36.             ImageNtOptionalHdr32Magic = 0x10B,
  37.             ImageNtOptionalHdr64Magic = 0x20B
  38.         }
  39.  
  40.  
  41.         [StructLayout(LayoutKind.Explicit)]
  42.         public struct ImageOptionalHeader32
  43.         {
  44.             [FieldOffset(0)]
  45.             public MagicType Magic;
  46.  
  47.             [FieldOffset(2)]
  48.             public byte MajorLinkerVersion;
  49.         }
  50.  
  51.  
  52.         [StructLayout(LayoutKind.Explicit)]
  53.         public struct ImageNtHeaders32
  54.         {
  55.             [FieldOffset(0)]
  56.             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
  57.             public char[] Signature;
  58.  
  59.             [FieldOffset(4)]
  60.             public ImageFileHeader32 FileHeader;
  61.  
  62.             [FieldOffset(24)]
  63.             public ImageOptionalHeader32 OptionalHeader;
  64.  
  65.             /// <summary>
  66.             /// Gets if this structure is valid for a PE file.
  67.             /// </summary>
  68.             public bool IsValid => new string(this.Signature).Trim('\0') == "PE";
  69.         }
  70.  
  71.  
  72.         public void RunMe()
  73.         {
  74.             byte[] FileData = Enumerable.Repeat((byte)0x41 , 1000).ToArray();
  75.  
  76.             this.NtHeaders = new ImageNtHeaders32();
  77.             this.NtHeaders = GetStructure<ImageNtHeaders32>(FileData, 320);
  78.  
  79.             Console.WriteLine("NtHeaders[0]= " + this.NtHeaders.Signature[1]);
  80.         }
  81.  
  82.     }
  83.  
  84.     class trigger
  85.     {
  86.         static void Main(string[] args)
  87.         {
  88.             var inst = new Program();
  89.             inst.RunMe();
  90.         }      
  91.     }
  92. }
RAW Paste Data