比方说,如果我有一个进程ID PID
,是否有一个WinAPI可以找出是否为该特定进程启用/禁用了ASLR?
答案 0 :(得分:6)
ASLR不是针对每个进程启用,而是仅针对那些IMAGE_OPTIONAL_HEADER
IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
成员中.DllCharacteristics
的可执行文件启用。当然必须有重新安置。
用于检查,是exe文件(从中创建的进程)动态重定位 - 我们可以将NtQueryInformationProcess
与ProcessImageInformation
一起使用 - 它为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