私はjavaでゲームのクライアントをコーディングしようとしています(正直言って、Minecraft)。しかし、これはMinecraftにのみ適用されるものではなく、一般的にJava仮想マシンアーキテクチャに適用されるので、私は推測します。基本的に、私はメモリアドレスを見つけるためにチートエンジンを使用しています、そして、私はプレーヤーの健康価値に対応するように見えるアドレスを見つけました。実行時にJava(より具体的にはjavaw)のメモリを外部に変更できますか?
問題を修正することは不可能なので、私は間違ったことをしていますか、またはJVMのメモリの変更を制限するメカニズムがありますか?
ちょっとした背景:私はC#を使ってメモリをプロセス間で読み書きしています。私がこれを達成する方法は、kernel.dllによって提供される外部関数を使用することです(詳細はこちら:https://stackoverflow.com/a/4623200/6817922)。私のようなコードでプログラムを実行すると、しかし
public static bool Write(IntPtr address, byte[] value)
{
if(ProcessToEdit == null) // If the process is not valid: return with no attempt to edit
{
return false;
}
int bytesWritten = 0;
// Writes the byte[] value to a specified address
return WriteProcessMemory(ProcessPointer, address, value, (uint)value.LongLength, out bytesWritten)
}
:
はWrite(0xCDD9BEA0, new byte[] { 20 }); // 0xCDD9BEA0 is the memory address of health.
プログラムが正しく実行され、関数「書き込み」があることを返す私はまた、書き込みタスクを簡素化する機能を持っていますメモリアドレスに正常に書き込まれましたが、(ゲームが更新されなかったため、またチートエンジンインターフェイスを実行しなかったために)失敗しました。これは、JVMプロセスを変更しようとした場合にのみ発生します。たとえば、プロセス「メモ帳」のテキストを編集すると、正しく編集され、チートエンジンと同様にプログラムに変更が表示されます。
さらに進んでJVMプロセスでは、チートエンジンがメモリアドレスを変更することさえできません。すぐにリセットされます。だから問題はまだ残っています:JVMにメモリが外部から変更されないようにするメカニズムはありますか?