IMAGE_NT_HEADERS в C# (неправильно выровнено или перекрывается необъектным полем) - PullRequest
1 голос
/ 16 июня 2020

Я пытаюсь заставить 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.

Что я здесь делаю не так?

1 Ответ

0 голосов
/ 16 июня 2020

Так и должно быть. вы используете неправильное значение

[FieldOffset(16)]
public UInt16 SizeOfOptionalHeader;
[FieldOffset(18)]
public UInt16 Characteristics;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...