В общем, был написан сей опус, что внизу. Гуглю уже пятый день, ничего толкового не смог сделать. Код должен работать, но скорее всего я не правильно определил функции и переменные, от чего на каждом процессе выдается False.
Вот код:
class Program{
const int PROCESS_QUERY_INFORMATION = 0x0400;
const int PROCESS_WM_READ = 0x0010;
public enum PROCESS_MITIGATION_POLICY
{
ProcessDEPPolicy = 0,
ProcessASLRPolicy = 1,
ProcessDynamicCodePolicy = 2,
ProcessStrictHandleCheckPolicy = 3,
ProcessSystemCallDisablePolicy = 4,
ProcessMitigationOptionsMask = 5,
ProcessExtensionPointDisablePolicy = 6,
ProcessControlFlowGuardPolicy = 7,
ProcessSignaturePolicy = 8,
ProcessFontDisablePolicy = 9,
ProcessImageLoadPolicy = 10,
MaxProcessMitigationPolicy = 11
}
[StructLayout(LayoutKind.Explicit)]
public struct union
{
[FieldOffset(0)]
uint EnableBottomUpRandomization;
[FieldOffset(0)]
uint EnableForceRelocateImages;
[FieldOffset(0)]
uint EnableHighEntropy;
[FieldOffset(0)]
uint DisallowStrippedImages;
[FieldOffset(0)]
uint ReservedFlags;
}
public struct PROCESS_MITIGATION_ASLR_POLICY
{
uint Flags;
union other;
}
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(
int dwDesiredAccess,
bool bInheritHandle,
int dwProcessId);
[DllImport("kernel32.dll")]
static extern bool GetProcessMitigationPolicy(
IntPtr hProcess,
PROCESS_MITIGATION_POLICY mitigationPolicy,
ref PROCESS_MITIGATION_ASLR_POLICY lpBuffer,
int dwLength);
static void Main()
{
string ID_str = Console.ReadLine();
int ID = int.Parse(ID_str);
Process proc = Process.GetProcessById(ID);
IntPtr hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_WM_READ, false, proc.Id);
PROCESS_MITIGATION_ASLR_POLICY PMAP = new PROCESS_MITIGATION_ASLR_POLICY();
bool result = GetProcessMitigationPolicy(hProc, PROCESS_MITIGATION_POLICY.ProcessASLRPolicy, ref PMAP, Marshal.SizeOf(PMAP));
Console.WriteLine(result);
Console.ReadKey();
}
}
pinvoke.net не шарит эти функции, так что я вообще в тупике.
Ответ
В оригинале PROCESS_MITIGATION_ASLR_POLICY содержит битовую структуру, которые C# не поддерживает. Поэтому определение нужно немного переделать (проверьте, Marshal.SizeOf должен возвращать 4):
struct PROCESS_MITIGATION_ASLR_POLICY
{
uint Flags;
bool EnableBottomUpRandomization {
get { return (Flags & 1) > 0; }
}
bool EnableForceRelocateImages {
get { return (Flags & 2) > 0; }
}
bool EnableHighEntropy {
get { return (Flags & 4) > 0; }
}
bool DisallowStrippedImages {
get { return (Flags & 8) > 0; }
}
}
Комментариев нет:
Отправить комментарий