Скажите, если у меня есть идентификатор процесса PID
, есть ли WinAPI, чтобы узнать, ASLR включен / отключен для этого конкретного процесса?
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;
}
Других решений пока нет …