Come convertire l'array byte[] in IntPtr?[duplicare]
-
14-11-2019 - |
Domanda
Possibile duplicato:
Come ottenere IntPtr da byte[] in C#
Sto leggendo le stringhe dalla memoria con
byte[] array =
reader.ReadProcessMemory((IntPtr)address, (uint)255, out bytesReadSize);
e poi sto convertendo questo array in stringa.
Ora ho un problema perché sotto l'indirizzo 003A53D4 nella memoria del programma c'è un puntatore che punta a una stringa.Come posso ottenere l'indirizzo della stringa?Grazie :)
ECCO COSA HO PROVATO:
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);
Dice (circa la quarta riga):
Il valore non può essere nullo.Nome del parametro:destinazione
e quando cambio nuovo IntPtr() a nuovo IntPtr(1)dice
Tentativo di leggere o scrivere nella memoria protetta.Questo è spesso un'indicazione che altri memoria sono corrotti.
Soluzione
Puoi usare un Encoding.GetString()
per convertire i byte in una stringa.La codifica da utilizzare dipende dalla codifica della stringa, ad es.Encoding.UTF8.GetString(pointer_arrays, 0) per la codifica UTF8, Encoding.Unicode per unicode, Encoding.ASCII per ASCII o Encoding.Default per la code page predefinita del sistema.
Altri suggerimenti
Il modo migliore (IMO) è il seguente:
GCHandle pinned = GCHandle.Alloc(array , GCHandleType.Pinned);
IntPtr address = pinned.AddrOfPinnedObject();
reader.ReadProcessMemory(address, (uint)255, out bytesReadSize);
pinned.Free();