虚拟保护& PAGE_GUARD

时间:2017-04-16 03:47:47

标签: c# winapi

我对win32 API比较陌生,我试图设置' PAGE_GUARD'过程中的属性' PE标题。但是,每次尝试时,这似乎都会失败。我已经查看了VirtualProtectEx'的文档,从我看到的我已经正确设置了所有内容。我有第一个参数(HANDLE)设置为我开始的进程' HANDLE,我有lpAddress设置我开始的进程的BaseAddress,我的大小设置为4096我相当肯定是x86 PE的标题大小,我将新保护设置为' 0x100'或者' 256u',这是PAGE_GUARD,旧的保护是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();
    }
}
}

1 个答案:

答案 0 :(得分:0)

仅使用PAGE_GUARD(0x100)标志,因为保护无效 - 来自documentation

  

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

所以你需要将PAGE_GUARD与其他一些标志(PAGE_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();
}