Страницы

Поиск по вопросам

вторник, 24 декабря 2019 г.

Узнать, использует ли процесс технологию ASLR на C#

#c_sharp #pinvoke


В общем, был написан сей опус, что внизу. Гуглю уже пятый день, ничего толкового
не смог сделать. Код должен работать, но скорее всего я не правильно определил функции
и переменные, от чего на каждом процессе выдается 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 не шарит эти функции, так что я вообще в тупике.
    


Ответы

Ответ 1



В оригинале 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; } } }

Комментариев нет:

Отправить комментарий