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