здесь нет ничего сложного - нам действительно нужно создать раздел с
#define SEC_NO_CHANGE 0x00400000
из createsec.c
SEC_NO_CHANGE
- После сопоставления файла защита не может
не может быть изменено, и представление не может быть отображено.
представление не отображается при удалении процесса.
Не может использоваться с SEC_IMAGE
.
поэтому нужно просто создать раздел с этим флагом. затем сначала сопоставьте его с PAGE_READWRITE
защитой страницы и запустите данные. чем распаковать и снова сопоставить с защитой PAGE_EXECUTE_READ
. все. ничего особенного или сложного.
#define SEC_NO_CHANGE 0x00400000
NTSTATUS ghty(PVOID* pBaseAddress, ULONG SectionSize = 0x10000)
{
HANDLE hSection;
LARGE_INTEGER MaxSize = { SectionSize };
NTSTATUS status = ZwCreateSection(&hSection,
SECTION_MAP_READ|SECTION_MAP_WRITE|SECTION_MAP_EXECUTE, 0, &MaxSize,
PAGE_EXECUTE_READWRITE, SEC_COMMIT|SEC_NO_CHANGE, 0);
if (0 <= status)
{
PVOID BaseAddress = 0;
SIZE_T ViewSize = 0;
if (0 <= (status = ZwMapViewOfSection(hSection, NtCurrentProcess(),
&BaseAddress, 0, 0, 0, &ViewSize, ViewUnmap, 0, PAGE_READWRITE)))
{
memset(BaseAddress, 0xc3, ViewSize);
ZwUnmapViewOfSection(NtCurrentProcess(), BaseAddress);
*pBaseAddress = 0;
status = ZwMapViewOfSection(hSection, NtCurrentProcess(),
pBaseAddress, 0, 0, 0, &(ViewSize = 0), ViewUnmap, 0, PAGE_EXECUTE_READ);
}
NtClose(hSection);
}
return status;
}
void test()
{
PVOID BaseAddress;
if (0 <= ghty(&BaseAddress))
{
//++ test
ULONG op;
SIZE_T Size = 1;
PVOID pv = BaseAddress;
ZwProtectVirtualMemory(NtCurrentProcess(), &pv, &Size, PAGE_READONLY, &op);
// STATUS_INVALID_PAGE_PROTECTION will be
// if we use SEC_NO_CHANGE
// -- test
ZwUnmapViewOfSection(NtCurrentProcess(), BaseAddress);
}
}
также только что нашел эту ссылку Код самопреобразования . возможный код, который вы отлаживаете, делают то же самое. думаю, смысл делать это - вы не можете устанавливать точки останова (int 3) в этом коде - потому что память не может быть записана и не может быть сделана доступной для записи. в результате невозможно вставить bp