Я читал, что существует флаг MEM_EXTENDED_PARAMETER_EC_CODE (0x40), позволяющий пометить области памяти как содержащие код x64, требующий эмуляции. Я пытался использовать его в NtMapViewOfSectionEx, но он не распознается. как допустимый параметр (
Код: Выделить всё
0xC000000DКод: Выделить всё
HANDLE hSection;
LARGE_INTEGER sectionSize = {0x8000};
NtCreateSection(&hSection, SECTION_ALL_ACCESS, nullptr,
§ionSize, PAGE_EXECUTE_READWRITE, SEC_COMMIT, nullptr);
MEM_EXTENDED_PARAMETER extParam = {0};
extParam.Type = MemExtendedParameterAttributeFlags; // Value is 5
extParam.ULong64 = MEM_EXTENDED_PARAMETER_EC_CODE; // 0x40
PVOID baseAddress = nullptr;
LARGE_INTEGER sectionOffset = {0};
SIZE_T viewSize = 0x8000;
NTSTATUS status = NtMapViewOfSectionEx(
hSection,
targetProcess,
&baseAddress,
§ionOffset,
&viewSize,
0, // AllocationType
PAGE_EXECUTE_READWRITE,
&extParam,
1 // ExtendedParameterCount
);
Код: Выделить всё
typedef NTSTATUS(NTAPI* NtMapViewOfSectionEx)(HANDLE SectionHandle, HANDLE ProcessHandle, PVOID* BaseAddress, PLARGE_INTEGER SectionOffset, PSIZE_T ViewSize, ULONG AllocationType, ULONG Win32Protect, PMEM_EXTENDED_PARAMETER ExtendedParameters, ULONG ExtendedParameterCount);
Код: Выделить всё
NtMapViewOfSectionExЯ также попытался использовать VirtualAlloc2 после сопоставления памяти, где мы могли бы пометить уже сопоставленную память как EC_CODE, однако это привело бы к поломке общей памяти из-за ее преобразования в частную память (копирование при записи).
Я ожидал, что Windows предоставит какой-то способ пометить память с поддержкой разделов флагом EC_CODE, аналогично тому, как VirtualAlloc2 работает.
Подробнее здесь: https://stackoverflow.com/questions/797 ... -for-arm64
Мобильная версия