我对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();
}
}
}
答案 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();
}