C# 虚拟保护&;护卫
我对win32 API比较陌生,我正在尝试在进程的PE头上设置“PAGE\u GUARD”属性。然而,我每次尝试都失败了。我已经查看了“VirtualProtectEx”的文档,从我看到的情况来看,我已经正确设置了所有内容。我将第一个参数(句柄)设置为我启动的进程的句柄,我将lpAddress设置为我启动的进程的基址,我将大小设置为4096,我相当确定这是x86 PE的头大小,我将新的保护设置为“0x100”或“256u”,这是页面保护,而旧的保护设置为0 为什么这样不行C# 虚拟保护&;护卫,c#,winapi,C#,Winapi,我对win32 API比较陌生,我正在尝试在进程的PE头上设置“PAGE\u GUARD”属性。然而,我每次尝试都失败了。我已经查看了“VirtualProtectEx”的文档,从我看到的情况来看,我已经正确设置了所有内容。我将第一个参数(句柄)设置为我启动的进程的句柄,我将lpAddress设置为我启动的进程的基址,我将大小设置为4096,我相当确定这是x86 PE的头大小,我将新的保护设置为“0x100”或“256u”,这是页面保护,而旧的保护设置为0 为什么这样不行 namespace V
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政策,该帖子的非故意破坏版本是发布的版本。因此,任何故意破坏行为都将恢复原状。