0

谢谢阅读,

我正在玩一个在线游戏,以自学一些关于 ReadProcessMemory API 的知识。

我正在尝试使用游戏内聊天室并将其显示在我的应用程序中。使用应用程序,我能够搜索并找到所需数据的内存地址,但遇到了一些困难。

这是我用来从进程内存中读取的代码:

    Dim ProcessToReadFrom As Process = Process.GetProcessesByName("MyGameName")(0)

    'Pass the process to a new instance of our NativeMemoryReader class
    Dim MemoryReader As New NativeMemoryReader(ProcessToReadFrom)
    Dim address_to_read As Integer = Convert.ToInt32("006e3218", 16)
    'Read 400 bytes from some address in the process
    Dim MemoryBytes() As Byte = MemoryReader.ReadMemory(New IntPtr(address_to_read), 400)

    MsgBox("ascii: " & System.Text.Encoding.ASCII.GetString(MemoryBytes).Trim()) 


    MemoryReader.Dispose()

它使用此处显示的 MemoryReader 类:http ://www.vbforums.com/showthread.php?p=3819578

使用这段代码,我每次都能拉出一行聊天,这就是我的问题

  • 数据分布在(006E3218-006E6B46)的许多地址中,从该范围获取所有数据的最佳方法是什么?

非常感谢您花时间阅读本文!

希望你的,

史蒂夫

4

1 回答 1

0

理想情况下,对目标游戏进行一些逆向工程将帮助您了解游戏实际上如何将聊天消息存储在内存中。也许他们使用固定大小的缓冲区来存储消息,使您能够正确地迭代每条消息。

在您的情况下,我认为该函数ASCII.GetString仅解析第一条消息,因为它已由 char 终止\0,因此没有理由继续。

您必须创建一个算法,MemoryBytes每次找到 char 时将缓冲区拆分为多个数组,然后在每个数组上\0调用该函数。ASCII.GetString

此外,就速度而言,为每条消息调用 ReadProcessMemory 是相当正确的,并且可以成为阅读消息框的一个很好的解决方案。

于 2013-09-15T20:57:22.093 回答