C# c在另一进程的内存中搜索-突然锁定

C# c在另一进程的内存中搜索-突然锁定,c#,memory,process,C#,Memory,Process,我需要跟踪另一个程序的内存,不断寻找要在其中出现的字节序列,当它们出现时,我需要记住它们的位置,以便以后知道写入到哪里 我使用以下帖子学习如何在另一个进程的内存中查找字节[]: 我的程序非常简单:它使用process.Start启动进程,然后从链接线程的答案之一重复运行函数: private static int GetMemoryAddressOfString(byte[] searchedBytes) { IntPtr hProcess = OpenProcess

我需要跟踪另一个程序的内存,不断寻找要在其中出现的字节序列,当它们出现时,我需要记住它们的位置,以便以后知道写入到哪里

我使用以下帖子学习如何在另一个进程的内存中查找字节[]:

我的程序非常简单:它使用process.Start启动进程,然后从链接线程的答案之一重复运行函数:

private static  int GetMemoryAddressOfString(byte[] searchedBytes)
    {
        IntPtr hProcess = OpenProcess(ProcessAccessFlags.VMOperation | ProcessAccessFlags.VMRead | ProcessAccessFlags.VMWrite, false, Program.ArtemisProcess.Id);
        if (hProcess == IntPtr.Zero)
            throw new Win32Exception(Marshal.GetLastWin32Error());

        int addr = 0;
        int speed = 1024 * 64;
        for (int j = 0x00400000; j < 0x11000000; j += speed)
        {
            byte[] bigMem = new byte[speed + searchedBytes.Length];

            IntPtr unmanagedPointer = Marshal.AllocHGlobal(4);
            ReadProcessMemory(hProcess, (IntPtr)j, bigMem, new UIntPtr((uint)(speed + searchedBytes.Length)), unmanagedPointer);
            int result = Marshal.ReadInt32(unmanagedPointer);
            Marshal.DestroyStructure(unmanagedPointer, typeof(int));

            for (int k = 0; k < bigMem.Length - searchedBytes.Length; k++)
            {
                bool found = true;
                for (int l = 0; l < searchedBytes.Length; l++)
                {
                    if (bigMem[k + l] != searchedBytes[l])
                    {
                        found = false;
                        break;
                    }
                }
                if (found)
                {
                    addr = k + j;
                    break;
                }
            }
            if (addr != 0)
                break;
        }
        return addr;
    }
其中ArtemisProcess是我运行的进程。Start

大多数情况下,它运行良好。只要我在监视的进程中执行将搜索到的字节序列放入内存的操作,下一次搜索就会找到它。然而,有时,它不会

我想知道我是否正确,并使用作弊引擎来确保搜索到的数据存在

然后,我添加了一个部分,我在其中创建了一个非托管指针,以了解有多少字节被读取,而这正是我发现在内存中搜索字节出现的地方,作弊引擎正确识别返回0!它不让我在那里读记忆。这个锁定发生了大约一两分钟,然后才允许我突然读取内存,下一次在该位置读取内存的尝试是成功的,并且发现字节序列是正确的

现在,我在msdn上读到,如果请求的读取操作跨入进程中不可访问的区域,那么函数将失败,但是我如何知道进程内存的哪个部分是可访问的,哪个部分不是

为什么作弊引擎能够读取内存,而我的程序却不能

为什么它突然允许我再次读取进程内存


我在这里不知所措……

调用ReadProcessMemory时,您的非托管指针不应该是ref UInt32吗?我不熟悉ref与指针的关系,所以我决定使用我在Web上找到的代码。我可以只执行IntPtr结果,然后将ref结果传递给dll调用?