如何检查是否为进程启用了ASLR?

时间:2017-11-03 22:55:01

标签: c++ winapi windows-security

比方说,如果我有一个进程ID PID,是否有一个WinAPI可以找出是否为该特定进程启用/禁用了ASLR

1 个答案:

答案 0 :(得分:6)

ASLR不是针对每个进程启用,而是仅针对那些IMAGE_OPTIONAL_HEADER IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 成员中.DllCharacteristics的可执行文件启用。当然必须有重新安置。

用于检查,是exe文件(从中创建的进程)动态重定位 - 我们可以将NtQueryInformationProcessProcessImageInformation一起使用 - 它为exe文件返回SECTION_IMAGE_INFORMATION。可以使用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();
}

如果我们不仅要查询exe文件而是查询特定模块,首先需要获取此模块的路径(可以使用GetMappedFileName),打开文件,为其创建部分并查询此部分{{1 }}。在退出时,我们再次得到SECTION_IMAGE_INFORMATION

SectionImageInformation