Как проверить, включен ли ASLR для процесса?

Скажите, если у меня есть идентификатор процесса PID, есть ли WinAPI, чтобы узнать, ASLR включен / отключен для этого конкретного процесса?

2

Решение

ASLR включен не для процесса, а только для тех исполняемых файлов, которые имеют IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE в IMAGE_OPTIONAL_HEADER.DllCharacteristics член. и, конечно, должно быть перемещение.

для проверки, exe-файл (из которого создан процесс) динамически перемещается — мы можем использовать NtQueryInformationProcess с ProcessImageInformation — это возвращение SECTION_IMAGE_INFORMATION для EXE-файла. процесс может быть открыт с PROCESS_QUERY_LIMITED_INFORMATION (этого достаточно. И это позволит нам открывать даже защищенные процессы). ImageDynamicallyRelocated немного сказать — применяются ASLR для изображения.

ULONG CheckASLR(ULONG dwProcessId, BOOLEAN& bASLR)
{
if (HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwProcessId))
{
SECTION_IMAGE_INFORMATION sii;

NTSTATUS status = NtQueryInformationProcess(hProcess, ProcessImageInformation, &sii, sizeof(sii), 0);

CloseHandle(hProcess);

if (0 <= status)
{
bASLR = sii.ImageDynamicallyRelocated;

return NOERROR;
}

return RtlNtStatusToDosError(status);
}

return GetLastError();
}

если мы хотим запросить это не только для исполняемого файла, но и для конкретного модуля, нужно сначала получить путь к этому модулю (можно использовать GetMappedFileName ), откройте файл, создайте для него раздел и запросите этот раздел для SectionImageInformation, на выходе мы снова получили SECTION_IMAGE_INFORMATION

NTSTATUS CheckASLR(HANDLE hProcess, PVOID hmod, BOOLEAN& bASLR)
{
static volatile UCHAR guz = 0;

PVOID stack = alloca(guz);

SIZE_T cb = 0, rcb = MAX_PATH*sizeof(WCHAR);

union {
PVOID buf;
PUNICODE_STRING ObjectName;
};

NTSTATUS status;
do
{
if (cb < rcb)
{
cb = RtlPointerToOffset(buf = alloca(rcb - cb), stack);
}

if (0 <= (status = NtQueryVirtualMemory(hProcess, hmod, MemoryMappedFilenameInformation, buf, cb, &rcb)))
{
HANDLE hFile, hSection;
IO_STATUS_BLOCK iosb;

OBJECT_ATTRIBUTES oa = { sizeof(oa), 0, ObjectName };

status = NtOpenFile(&hFile, FILE_GENERIC_READ, &oa, &iosb, FILE_SHARE_VALID_FLAGS, FILE_SYNCHRONOUS_IO_NONALERT);

if (0 <= status)
{
status = NtCreateSection(&hSection, SECTION_QUERY, 0, 0, PAGE_READONLY, SEC_IMAGE, hFile);

NtClose(hFile);

if (0 <= status)
{
SECTION_IMAGE_INFORMATION sii;

status = ZwQuerySection(hSection, SectionImageInformation, &sii, sizeof(sii), 0);

NtClose(hSection);

if (0 <= status)
{
bASLR = sii.ImageDynamicallyRelocated;
}
}
}

break;
}

} while (status == STATUS_BUFFER_OVERFLOW );

return status;
}
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]