Я пытаюсь заставить IMAGE_NT_HEADERS работать.
Для этого я создал такую структуру:
[StructLayout(LayoutKind.Explicit)]
public struct IMAGE_NT_HEADERS64
{
[FieldOffset(0)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public char[] Signature;
//Incorrect aligned error if uncommented
[FieldOffset(4)]
public IMAGE_FILE_HEADER FileHeader;
[FieldOffset(24)]
public IMAGE_OPTIONAL_HEADER64 OptionalHeader;
private string _Signature {
get { return new string(Signature); }
}
public bool isValid {
get { return _Signature == "PE\0\0" && OptionalHeader.Magic == MagicType.IMAGE_NT_OPTIONAL_HDR64_MAGIC; }
}
}
С такой структурой IMAGE_FILE_HEADER:
[StructLayout(LayoutKind.Explicit, Size = 20)]
public struct IMAGE_FILE_HEADER {
[FieldOffset(0)]
public UInt16 Machine;
[FieldOffset(2)]
public UInt16 NumberOfSections;
[FieldOffset(4)]
public UInt32 TimeDateStamp;
[FieldOffset(8)]
public UInt32 PointerToSymbolTable;
[FieldOffset(12)]
public UInt32 NumberOfSymbols;
[FieldOffset(16)]
public UInt16 SizeOfOptionalHeader;
[FieldOffset(18)]
public UInt16 Characteristics;
}
Но пытаясь запустить сценарий, я получаю следующее сообщение об ошибке:
System.TypeLoadException: 'Не удалось загрузить тип' IMAGE_NT_HEADERS64 'из сборки' Test, Version = 1.0.0.0, Culture = нейтральный , PublicKeyToken = null ', потому что он содержит поле объекта со смещением 4, которое неправильно выровнено или перекрывается полем, не являющимся объектом.'
При комментировании кода с IMAGE_FILE_HEADER я могу правильно скомпилируйте программу, и все будет загружено по желанию. Но мне нужны FileHeaders.
Что я здесь делаю не так?