Возможно ли получить доступ к памяти через определенную переменную UInt32?Доступ к памяти UInt32 в C#
Например, если я имел переменную UInt32, и его значение 12345678,
то есть любой способ, чтобы получить доступ к ячейке памяти 0x12345678?
Возможно ли получить доступ к памяти через определенную переменную UInt32?Доступ к памяти UInt32 в C#
Например, если я имел переменную UInt32, и его значение 12345678,
то есть любой способ, чтобы получить доступ к ячейке памяти 0x12345678?
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());
}
Это не отвечает на вопрос.В этом примере показано, как получить указатель на переменную и получить доступ к переменной, а не как получить доступ к адресу, указанному рядом. – Guffa
Передайте свой адрес указателю нужного типа (в этом случае я взял int): 'var p = (int *) & 0x12345678;' Затем измените его: 'p [0] = 0xCAFEBABE;' –
Я скажу это 'int * p = (int *) 0x12345678'; (no '&') – xanatos
Помимо использования указателей, вы можете
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 бита)
Вы можете присвоить номер указателю. Пример:
int address = 0x12345678;
unsafe {
byte* ptr = (byte*)address;
Console.WriteLine(*ptr);
}
Обратите внимание, что вы можете получить доступ только виртуальное пространство имен вашего собственного приложения, а не фактической физической памяти, и вы получите исключение, если вы пытаетесь прочитать за пределами области памяти, выделенной для приложения. Кроме того, помните, что данные не гарантированно остаются в памяти, сборщик мусора может перемещать любой объект в любое время.
Это так неправильно делать ... Вы создаете сильную импликацию, что 'sizeof (int) == sizeof (byte *)' и давая ответ например, вы говорите «это нормально» :-( – xanatos
@xanatos: Это очень странный комментарий, так как вы делаете то же самое в своем ответе ... – Guffa
Я использую 'IntPtr', где' IntPtr.Size == sizeof (byte *) 'по определению' IntPtr'. – xanatos
Не совсем уверен, чего вы пытаетесь достичь, но вы говорите о 'IntPtr' и неуправляемом коде. То есть Указатель на языках C++ и подобных языках. – Belogix
Не будет работать на 64-битной коробке – GregC
Абсолютная память или виртуальный адрес? :-) – xanatos