2012-02-29 7 views
3

Можно создать дубликат:
How to get IntPtr from byte[] in C#Как преобразовать массив byte [] в IntPtr?

Я читаю строки из памяти с

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

, а затем я converthing этот массив в строку.

У меня возникла проблема теперь по адресу 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-й строке):

Значение не может быть пустым. Имя параметра: назначение

и когда я изменяю новый IntPtr() к новым IntPtr (1) это говорит

Попытка чтения или записи в защищенную память. Это часто является индикатором , что другая память повреждена.

+0

Вот статья, вы можете смотреть на это поможет понять, как сделать то, что это вы хотели сделать также попытаться использовать ключевое слово небезопасный также http://blog.rednael.com/2008/08/29/MarshallingUsingNativeDLLsInNET.aspx – MethodMan

ответ

1

Вы можете использовать Encoding.GetString() для преобразования байтов в строку. Какая кодировка для использования зависит от кодирования строки, например. Encoding.UTF8.GetString (pointer_arrays, 0) для кодировки UTF8, Encoding.Unicode для unicode, Encoding.ASCII для ASCII или Encoding.Default для кодовой страницы по умолчанию вашей системы.

6

Лучший способ (ИМО) является следующее:

GCHandle pinned = GCHandle.Alloc(array , GCHandleType.Pinned); 
IntPtr address = pinned.AddrOfPinnedObject(); 
reader.ReadProcessMemory(address, (uint)255, out bytesReadSize); 
pinned.Free(); 
Смежные вопросы