2015-11-07 47 views
-1

此错误出现时,我试图做两件事情,访问被拒绝。Win32异常:尝试使用OpenProcess

尝试这个(代码块1):

_class = new Proc(Process.GetProcessesByName("procname")[0]); 

然后在类PROC发生了什么是

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); 
     } 
    } 
} 

这是一些我得到异常的方法,有时候这种传递没有任何据我所知,没有明显的原因。

注:它永远不会通过在Windows 7中,我使用Windows 10,有时它发生函数工作

,但如果它不通过,下一次我需要使用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); 

也值得注意的是,有时候所有这些代码都会在没有任何错误的情况下执行,并且只要我没有打开此应用程序,或者如果我不重新启动目标应用程序。

请帮我在这一个,如果我是不是对一些事情很明显 - 这是我的第一个问题,我还没有真的想知道这个人之前,先问一个......所以,我将解释什么必要事后

+0

也许有些上下文会有帮助吗?什么是您在此尝试完成的*高级*任务。从表面上看,上面的东西看起来过于复杂。通常不需要直接导入内核并使用内存来操作子进程。像C#这样的安全语言的全部意义在于避免这种情况。 –

+0

@modal_dialog我想改变一些属于另一个与我的进程无关的进程。就我所知,这是这样做的唯一途径。 –

回答

0

如果像你最后的评论表明,该过程真正拥有无关,与对方的话,恰好解释了AccessDeniedException异常。你不能只修改任何随机过程的记忆。那将是一个安全漏洞。

必须设置两个进程并且同意以彼此共享存储器。 合作进程之间进行进程间通信的方法有很多种:这里是一个开始:Shared memory between 2 processes (applications)

+0

好吧,这是有道理的,但它并不能解释为什么它有时会起作用,有时它不会? 此外,在对应用程序进行最近的修补程序之前,它无任何例外地工作过。 –

+0

内存保护是在各种版本的Windows中改变的,因为它们加强了安全性。 https://en.wikipedia.org/wiki/Memory_protection它也可能取决于如何设置目标进程,所以补丁肯定会影响它。在任何情况下,不协调的访问都不应该使用,即使它运作得很好。 –

+0

似乎Windows 10有一些安全问题。 就我所测试的情况而言,这在Windows 7上不会发生。 我仍想尝试为此找到解决方法,或重新创建工作时发生的情况。 –