私は現在、チート エンジンを使用して見つかったベース ポインターに C# でメモリ読み取りを実装しようとしています。正しいポインターとオフセットを見つけたことは 100% 確信しています。なぜなら、それらは再起動の間でも Cheat-Engine で問題なく機能するからです。
現在、C# で実装していますが、シングル レベル ポイントに問題はありませんでしたが、何らかの理由で最後のマルチレベル ポインターを機能させることができません。
追加する必要がある最後の値まではすべてうまくいき、「ランダム」なものを返します。これらは私が見つけたポインターであり、チートエンジンで動作することがわかります.
これはC#での私の実装です:
public static int ReadFromPointer(int address, int[] offsets)
{
Console.WriteLine("----------");
Console.WriteLine("Address: " + address);
int ptr = ReadPointer(address);
Console.WriteLine($"Pointer returned as int: {ptr}, hex: {ptr:X}");
foreach (var offset in offsets)
{
Console.WriteLine($"Adding offset: {offset:X} to Pointer: {ptr:X}");
ptr = ReadPointer(ptr + offset);
Console.WriteLine($"Pointer returned as int: {ptr}, hex: {ptr:X}");
}
Console.WriteLine("----------");
return ptr;
}
private static int ReadPointer(int adress)
{
int ptrNext;
int bytesRead = 0;
byte[] _Value = new byte[4];
ReadProcessMemory((IntPtr)ProcessHandle, (IntPtr)adress, _Value, IntPtr.Size, ref bytesRead);
ptrNext = BitConverter.ToInt32(_Value, 0);
return ptrNext;
}
そして、私は以下を使用してそれを呼び出します:
var valueToFind = ProcessHelper.ReadFromPointer((int)baseAddress + 0x00C45A5C, new []{ 0xEC, 0x1C, 0x178, 0x74, 0x458 });
ここで「ランダム」部分が来ます。0x458 をポインター 1E138F80 に追加する必要がある最後のものを除いて、すべてのポインターが正しく追加されます。これは 1E1393D8 を返すはずですが、「41C00000」を返すことになります。
最後のポインターが 4 バイトではなくなったことが原因なのか、それとも何らかの形で変換が行われて混乱しているのかはわかりません。ここで何か助けていただければ幸いです。