C# Win32异常:尝试使用OpenProcess时访问被拒绝

C# Win32异常:尝试使用OpenProcess时访问被拒绝,c#,.net,access-denied,win32exception,C#,.net,Access Denied,Win32exception,当我尝试做两件事时出现此错误 尝试此操作时(代码块1): 然后在课堂过程中发生了什么 public Proc(Process _SelectedProcess) { Process = _SelectedProcess; } public Process Process { get { return SelectedProcess; } set { SelectedProcess = value; i

当我尝试做两件事时出现此错误

尝试此操作时(代码块1):

然后在课堂过程中发生了什么

public Proc(Process _SelectedProcess)
{
    Process = _SelectedProcess;
}
public Process Process
{
    get
    {
        return SelectedProcess;
    }
    set
    {
        SelectedProcess = value;
        if (SelectedProcess != null)
        {
            Process.EnterDebugMode();
            _Reader = new Win32_Memory(value.Handle, value.MainModule.BaseAddress.ToInt32(), value.Id);
         }
    }
}
这是我得到异常的一些方式,有时候,在我看来,没有任何明显的原因,这个过程没有任何异常

注意:它在Windows7中是不会通过的,我使用的是Windows10,有时这个功能会正常工作

但是如果它通过了,下次我需要在Process类之外使用OpenProcess()时,我几乎总是会得到异常,如果我通过了,那么之后如果我再次尝试执行代码块1,它就会失败

这(代码块2)也会得到相同的拒绝访问错误,有时不会

if (_Reader.ReadInt(_addr) == 1) _Reader.Write(_addr, 0);
public bool Write(int address, long value)
{
    hProc = OpenProcess(ProcessAccessFlags.VMWrite, false, ID);
    byte[] val = BitConverter.GetBytes(value);
    bool worked = WriteProcessMemory(hProc, new IntPtr(address), val, (uint)val.LongLength, 0);
    CloseHandle(hProc);
    return worked;
}
访问标志:

[Flags]
public enum ProcessAccessFlags : uint
{
    All = 0x001F0FFF,
    Terminate = 0x00000001,
    CreateThread = 0x00000002,
    VMOperation = 0x00000008,
    VMRead = 0x00000010,
    VMWrite = 0x00000020,
    DupHandle = 0x00000040,
    SetInformation = 0x00000200,
    QueryInformation = 0x00000400,
    Synchronize = 0x00100000
}
进口:

[DllImport("kernel32.dll")]
private static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, int unused);
还值得注意的是,有时所有这些代码都会在没有任何错误的情况下执行,并且只要我不重新打开这个应用程序,或者如果我不重新启动目标应用程序,这些代码就会一直工作


请帮我解决这个问题,如果我对一些事情不清楚-这是我的第一个问题,在这个问题之前我真的不需要问一个问题。。。因此,我将在后面解释所有必要的内容

如果,正如您最后的评论所指出的,这些过程确实彼此无关,那么这正好解释了AccessDeniedException。不允许只修改任何随机进程的内存。那将是一个安全漏洞


两个进程都必须进行设置,并同意彼此共享内存。在协作进程之间进行进程间通信的方法有很多:这里是一个开始:

也许一些上下文会有所帮助?您在这里试图完成的高级别任务是什么。从表面上看,上面的东西看起来太复杂了。通常不需要导入内核并直接使用内存来操作子进程。像C#这样的安全语言的全部目的就是避免这种情况。@modal#u dialog我试图更改属于另一个进程的内存,而这个进程与我的进程无关。就我所知,这是唯一的方法。好吧,这是有道理的,但它不能解释为什么它有时有效,有时无效?此外,在最近对应用程序进行修补之前,它毫无例外地工作。内存保护是随着不同版本的Windows加强安全性而发生的变化。它还取决于目标进程的设置方式,因此补丁肯定会影响它。在任何情况下,不协调的访问都不应该被使用,即使幸运的是它能工作。看起来Windows 10有一些安全问题。据我所测试的,这在Windows7上不会发生。我仍然希望找到解决方法,或者重新创建它工作时发生的情况。@Srdjan,我倒过来说:Windows 7在Windows 10中遇到了一些安全问题。如果我的SecuritySensitive.exe正在运行,并且对你的cooldownload.exe一无所知,那么它究竟为什么要允许你的调用代码决定它是否可以写入我的内存呢。注意:有一种方法可以在Win10上启动目标,使其像Win7一样运行。MS完全是关于向后兼容性的。但我不知道你是否理解我但是。。。在Windows10上,它有时工作,有时不工作。在Windows7上,它从来都不起作用,在补丁发布之前,它确实起作用了。如果它永远无法在windows 7上运行,为什么我要像从windows 7运行一样运行它?
[DllImport("kernel32.dll")]
private static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, int unused);