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

このコードを使用すると、毎回チャットの 1 行を取得できます。ここに私の質問があります。

  • データは (006E3218-006E6B46) からの多くのアドレスに分散しています。この範囲からすべてのデータを取得する最良の方法は何ですか?

これを読んでくれてありがとう!

うまくいけば、

スティーブ

4

1 に答える 1

0

理想的には、対象のゲームで少しリバース エンジニアリングを行うことで、ゲームが実際にチャット メッセージをメモリに保存する方法を理解するのに役立ちます。おそらく、固定サイズのバッファーを使用してメッセージを保存し、各メッセージを正しく反復できるようにします。

あなたの場合、関数ASCII.GetStringは char で終了しているため、最初のメッセージのみを解析すると思う\0ので、続行する理由はありません。

MemoryByteschar が見つかるたびにバッファーを複数の配列に分割するアルゴリズムを作成し、これらの配列のそれぞれで\0関数を呼び出す必要があります。ASCII.GetString

また、メッセージごとに ReadProcessMemory を呼び出すことは、速度の点でかなり正確であり、メッセージ ボックスを読み取るための優れたソリューションになる可能性があります。

于 2013-09-15T20:57:22.093 に答える