C# 虚拟保护&;护卫

C# 虚拟保护&;护卫,c#,winapi,C#,Winapi,我对win32 API比较陌生,我正在尝试在进程的PE头上设置“PAGE\u GUARD”属性。然而,我每次尝试都失败了。我已经查看了“VirtualProtectEx”的文档,从我看到的情况来看,我已经正确设置了所有内容。我将第一个参数(句柄)设置为我启动的进程的句柄,我将lpAddress设置为我启动的进程的基址,我将大小设置为4096,我相当确定这是x86 PE的头大小,我将新的保护设置为“0x100”或“256u”,这是页面保护,而旧的保护设置为0 为什么这样不行 namespace V

我对win32 API比较陌生,我正在尝试在进程的PE头上设置“PAGE\u GUARD”属性。然而,我每次尝试都失败了。我已经查看了“VirtualProtectEx”的文档,从我看到的情况来看,我已经正确设置了所有内容。我将第一个参数(句柄)设置为我启动的进程的句柄,我将lpAddress设置为我启动的进程的基址,我将大小设置为4096,我相当确定这是x86 PE的头大小,我将新的保护设置为“0x100”或“256u”,这是页面保护,而旧的保护设置为0

为什么这样不行

namespace VirtualProtectTest
{
class Program
{
    [DllImport("kernel32.dll")]
    public static extern bool VirtualProtectEx( IntPtr hProcess, uint dwAddress, int nSize, uint flNewProtect, out uint lpflOldProtect);


    static void Main(string[] args)
    {
        Process p = Process.Start("app.exe");
        Thread.Sleep(1000);
        if (VirtualProtectEx(p.Handle, (uint)p.MainModule.BaseAddress, 4096, 0x100, out uint a))
        {
            Console.WriteLine("Success!");
        }

        else 
        {
            Console.WriteLine("Fail!");
            p.Kill();
        }

        Console.ReadKey();
    }
}
}

仅使用
页面保护
(0x100)标志,因为保护无效-从

此标志是页面保护修饰符,仅在与一起使用时有效 除page_NOACCESS之外的页面保护标志之一

因此,您需要将
PAGE\u-GUARD
与一些其他标志(除了
PAGE\u-NOACCESS
)结合起来。使用
VirtualQueryEx
对当前页面进行保护的第一次查询效果更好。代码必须如下

HANDLE hProcess = NtCurrentProcess();
PVOID Address = &__ImageBase;
MEMORY_BASIC_INFORMATION mbi;
BOOL fOk;
if (fOk = (VirtualQueryEx(hProcess, Address, &mbi, sizeof(mbi)) == sizeof(mbi)))
{
    ULONG op;
    if (!(mbi.Protect & (PAGE_GUARD|PAGE_NOACCESS)))
    {
        fOk = VirtualProtectEx(hProcess, Address, PAGE_SIZE, PAGE_GUARD|mbi.Protect, &op);
    }
}
if (!fOk)
{
    GetLastError();
}

我的问题是C#,但我接受。不过我有个问题。我该如何判断它是否正常工作呢。。。乍一看,最有可能的结果是子进程将崩溃。如果真是这样的话,这个电话很可能奏效了。当另一个程序试图访问内存时,是否有任何方法可以防止崩溃?@HarryJohnston这“不起作用”,正是因为仅使用
PAGE\u-GUARD
无效。此标志必须与另一个页面保护标志组合,除了
page\u NOACCESS
RbMm,是的,我理解。我是在回答Richard的问题,他如何判断这一变化是否真的生效。Richard,我想如果您作为调试器附加到子进程,您将能够拦截保护页异常。但是你到底想达到什么目的呢?请不要通过破坏你的帖子来为人们做更多的工作。通过在Stack Exchange(SE)网络上发布,您已根据授予SE分发该内容的不可撤销权利(即,无论您未来的选择如何)。根据SE政策,该帖子的非故意破坏版本是发布的版本。因此,任何故意破坏行为都将恢复原状。