質問

重複の可能性:
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 にすることはできません。パラメータ名:行き先

そして私が変わるとき 新しい IntPtr() 新しいものへ IntPtr(1)それは言う

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

役に立ちましたか?

解決

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

他のヒント

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

GCHandle pinned = GCHandle.Alloc(array , GCHandleType.Pinned);
IntPtr address = pinned.AddrOfPinnedObject();
reader.ReadProcessMemory(address, (uint)255, out bytesReadSize);
pinned.Free();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top