2012-05-06 17 views
0

感谢您的阅读,如何去在外部应用程序收听范围内存地址和回声结果与ReadProcessMemory

我与一个在线游戏乱搞我玩,教我一些关于进行ReadProcess 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),什么是从这个范围内获得所有数据的最佳方式是什么?

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

此致希望,

史蒂夫

+0

您是否尝试Dim MemoryBytes()As Byte = MemoryReader.ReadMemory(New IntPtr(address_to_read),14638)?它应该读你提到的整个区域。 – IvanH

+0

你好Ivan,谢谢你的回复,我确实尝试过,但它只是返回一行,就像我之前说过的那样。我可以做到这一点,如果我手动添加所有的地址,并在所有这些地址上使用ReadMemory功能,但是,这显然非常缓慢并且不适合聊天屏幕。我不知道为什么它没有阅读所有的聊天记录,只有第一行,我甚至没有尝试过.Trim并得到了相同的结果。有任何想法吗? – Nookster

回答

0

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

在你的情况,我认为功能ASCII.GetString只解析第一条消息,因为它是由字符\0终止,所以没有理由继续。

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

此外,为每个消息调用ReadProcessMemory在速度方面相当正确,并且可以是读取消息框的好方案。

相关问题