#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; } } }
Комментариев нет:
Отправить комментарий