sources/Google.Solutions.IapDesktop/ProcessMitigations.cs (131 lines of code) (raw):

// // Copyright 2021 Google LLC // // Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. // using System.ComponentModel; using System.Runtime.InteropServices; namespace Google.Solutions.IapDesktop { internal static class ProcessMitigations { internal static void Apply() { var fontPolicy = new UnsafeNativeMethods.PROCESS_MITIGATION_FONT_DISABLE_POLICY() { DisableNonSystemFonts = true }; if (!UnsafeNativeMethods.SetProcessMitigationPolicy( UnsafeNativeMethods.PROCESS_MITIGATION_POLICY.ProcessFontDisablePolicy, ref fontPolicy, Marshal.SizeOf(fontPolicy))) { throw new Win32Exception("Setting font process mitigation policy failed"); } var imagePolicy = new UnsafeNativeMethods.PROCESS_MITIGATION_IMAGE_LOAD_POLICY() { NoLowMandatoryLabelImages = true, NoRemoteImages = true }; if (!UnsafeNativeMethods.SetProcessMitigationPolicy( UnsafeNativeMethods.PROCESS_MITIGATION_POLICY.ProcessImageLoadPolicy, ref imagePolicy, Marshal.SizeOf(imagePolicy))) { throw new Win32Exception("Setting image-load process mitigation policy failed"); } } //--------------------------------------------------------------------- // P/Invoke definitions. //--------------------------------------------------------------------- private class UnsafeNativeMethods { internal 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 } internal struct PROCESS_MITIGATION_FONT_DISABLE_POLICY { public uint Flags; public bool DisableNonSystemFonts { get => (this.Flags & 0x1u) != 0; set { if (value) { this.Flags |= 0x1u; } else { this.Flags &= ~0x1u; } } } } internal struct PROCESS_MITIGATION_IMAGE_LOAD_POLICY { public uint Flags; public bool NoRemoteImages { get => (this.Flags & 0x1u) != 0; set { if (value) { this.Flags |= 0x1u; } else { this.Flags &= ~0x1u; } } } public bool NoLowMandatoryLabelImages { get => (this.Flags & 0x2u) != 0; set { if (value) { this.Flags |= 0x2u; } else { this.Flags &= ~0x2u; } } } public bool PreferSystem32Images { get => (this.Flags & 0x4u) != 0; set { if (value) { this.Flags |= 0x4u; } else { this.Flags &= ~0x4u; } } } } [DllImport("kernel32.dll")] internal static extern bool SetProcessMitigationPolicy( PROCESS_MITIGATION_POLICY mitigationPolicy, ref PROCESS_MITIGATION_FONT_DISABLE_POLICY lpBuffer, int dwLength); [DllImport("kernel32.dll")] internal static extern bool SetProcessMitigationPolicy( PROCESS_MITIGATION_POLICY mitigationPolicy, ref PROCESS_MITIGATION_IMAGE_LOAD_POLICY lpBuffer, int dwLength); } } }