سؤال

التكرار المحتمل:
كيفية الحصول على IntPtr من byte[] في C#

أنا أقرأ سلاسل من الذاكرة مع

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);

يقول (حوالي السطر الرابع):

قيمة لا يمكن أن تكون فارغة.اسم المعلمة:وجهة

وعندما أتغير IntPtr () جديد إلى New إنتبتر(1)انها تقول

تمت محاولة قراءة أو كتابة الذاكرة المحمية.هذا غالبًا ما يكون مؤشرا على أن الذاكرة الأخرى فاسدة.

هل كانت مفيدة؟

المحلول

يمكنك استخدام Encoding.GetString() لتحويل البايتات إلى سلسلة.يعتمد التشفير الذي سيتم استخدامه على تشفير السلسلة، على سبيل المثال.Encoding.UTF8.GetString(pointer_arrays, 0) لتشفير UTF8، أو Encoding.Unicode لـ unicode، أو Encoding.ASCII لـ 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