5

重複の可能性:
C# で byte[] から IntPtr を取得する方法

私はメモリから文字列を読んでいます

byte[] array = 
reader.ReadProcessMemory((IntPtr)address, (uint)255, out bytesReadSize);

そして、この配列を文字列に変換しています。

プログラムのメモリ内のアドレス 003A53D4 の下に、文字列を指すポインターがあるため、問題が発生しました。文字列のアドレスを取得するにはどうすればよいですか? ありがとう :)

それは私が試したことです:

IntPtr pointers_address = new IntPtr(module_base_address + 3822548);
byte[] pointer_arrays = 
reader.ReadProcessMemory(pointers_address, (uint)16, out bytesReadSize2); 
IntPtr pointer_for_string = new IntPtr();
Marshal.Copy(pointers_array, 0, pointer_for_string, 16);

それは言います(約4行目):

値を null にすることはできません。パラメータ名: 宛先

new IntPtr() を new IntPtr(1)に変更 すると、

保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。

4

2 に答える 2

7

最良の方法(IMO)は次のとおりです。

GCHandle pinned = GCHandle.Alloc(array , GCHandleType.Pinned);
IntPtr address = pinned.AddrOfPinnedObject();
reader.ReadProcessMemory(address, (uint)255, out bytesReadSize);
pinned.Free();
于 2012-02-29T15:03:00.760 に答える
2

を使用しEncoding.GetString()て、バイトを文字列に変換できます。使用するエンコーディングは、文字列のエンコーディングによって異なります。たとえば、UTF8エンコーディングの場合はEncoding.UTF8.GetString(pointer_arrays、0)、ユニコードの場合はEncoding.Unicode、ASCIIの場合はEncoding.ASCII、システムのデフォルトコードページの場合はEncoding.Defaultです。 。

于 2012-02-29T14:50:33.583 に答える