2015-03-05 2 views
1

Возможно ли получить доступ к памяти через определенную переменную UInt32?Доступ к памяти UInt32 в C#

Например, если я имел переменную UInt32, и его значение 12345678,

то есть любой способ, чтобы получить доступ к ячейке памяти 0x12345678?

+1

Не совсем уверен, чего вы пытаетесь достичь, но вы говорите о 'IntPtr' и неуправляемом коде. То есть Указатель на языках C++ и подобных языках. – Belogix

+0

Не будет работать на 64-битной коробке – GregC

+0

Абсолютная память или виртуальный адрес? :-) – xanatos

ответ

3

MSDN показывает, как сделать это, обратите внимание, что вам нужно будет скомпилировать с опцией /unsafe (вы найдете его в настройках проекта)

 unsafe 
     { 
      // Assign the address of number to a pointer: 
      int* p = &number; 

      // Commenting the following statement will remove the 
      // initialization of number. 
      *p = 0xffff; 

      // Print the value of *p: 
      System.Console.WriteLine("Value at the location pointed to by p: {0:X}", *p); 

      // Print the address stored in p: 
      System.Console.WriteLine("The address stored in p: {0}", p->ToString()); 
     } 
+1

Это не отвечает на вопрос.В этом примере показано, как получить указатель на переменную и получить доступ к переменной, а не как получить доступ к адресу, указанному рядом. – Guffa

+0

Передайте свой адрес указателю нужного типа (в этом случае я взял int): 'var p = (int *) & 0x12345678;' Затем измените его: 'p [0] = 0xCAFEBABE;' –

+0

Я скажу это 'int * p = (int *) 0x12345678'; (no '&') – xanatos

2

Помимо использования указателей, вы можете

IntPtr ptr = IntPtr.Zero; // here you need some address you can read 
// For example IntPtr ptr = (IntPtr)0x12345678 
// IntPtr is 32 bits or 64 bits depending on how the program is running 

byte b = Marshal.ReadByte(ptr); // Or all the other Read* methods. 

Обратите внимание, что Marshal.Read*/Marshal.Write*не требуют небезопасный режим (но, вероятно, медленнее) (и по-прежнему небезопасно в английском смысле этого слова, как бег с ножницами :-))

Очевидно, вам нужен адрес, который вы можете прочитать (например, полученные с помощью C-взаимодействием вызова)

Обратите внимание, что в целом вы можете» t читает какой-либо один адрес памяти и что используемый вами ptr не является абсолютным указателем на память (IntPtr.Zero не является ячейкой памяти 0 вашей оперативной памяти, поскольку Windows/любая современная ОС сопоставляет память всем процессы)

В целом из Windows Server 2003 SP1 «необработанный» доступ к памяти (прямой доступ к памяти, не привязанный к вашему процессу) запрещен для не-драйверов: Read physical memory under Windows 8. Ясно, что вы все равно можете прочитать всю память, сопоставленную с вашим процессом.

Как правило не положить указатели в Int32/UInt32. Хотя в 32 бит sizeof(Int32) == sizeof(void*), когда вы переходите на 64 бита, это больше не работает. Используйте типы указателей (int*, byte*, ...) или IntPtr/UIntPtr (которые гарантированно имеют длину указателя). Если вам нужно сделать указатель математику, и вы не используете .NET 4.0 общего пользования в long/ulong (или Int64/UInt64, то же самое) (т.е. 64 бит, так что безопасные и на 32 и 64 бита)

1

Вы можете присвоить номер указателю. Пример:

int address = 0x12345678; 

unsafe { 
    byte* ptr = (byte*)address; 
    Console.WriteLine(*ptr); 
} 

Обратите внимание, что вы можете получить доступ только виртуальное пространство имен вашего собственного приложения, а не фактической физической памяти, и вы получите исключение, если вы пытаетесь прочитать за пределами области памяти, выделенной для приложения. Кроме того, помните, что данные не гарантированно остаются в памяти, сборщик мусора может перемещать любой объект в любое время.

+0

Это так неправильно делать ... Вы создаете сильную импликацию, что 'sizeof (int) == sizeof (byte *)' и давая ответ например, вы говорите «это нормально» :-( – xanatos

+0

@xanatos: Это очень странный комментарий, так как вы делаете то же самое в своем ответе ... – Guffa

+0

Я использую 'IntPtr', где' IntPtr.Size == sizeof (byte *) 'по определению' IntPtr'. – xanatos

Смежные вопросы