Назначение определенного адреса памяти из другой программы и изменение его значения - PullRequest
3 голосов
/ 28 января 2010

Недавно я на несколько дней не ходил в школу и хотел провести небольшой эксперимент (ы) по программам на C ++, связанный с адресом памяти.

Я хотел бы видеть, что если текущая работающая программа (пусть назовем ее Программой A), которая создала указатель на объект int в куче, может быть увидена другой программой и изменена (Программа B).

Так что для Программы А это мой основной код:

// Program A
#include <iostream>

using namespace std;

int main()
{
    // Pointer to an int object in the heap
    int *pint = new int(15);

    // Display the address of the memory in heap
    cout << pint << endl;

    // Display the value stored in that address
    cout << *pint << endl;

    return 0;
}

Вывод для программы A:

0x641030
15

Для Программы B я посмотрел, как назначить определенный адрес памяти по этой ссылке: http://www.devx.com/tips/Tip/14104

Код для Программы B:

// Program B
#include <iostream>

using namespace std;

int main()
{
    // assign address 0x641030 to p
    int *p = reinterpret_cast< int* > (0x641030);

    cout << p << endl;
    cout << *p << endl;

    return 0;
}

Вывод для программы B:

0x641030
... "Crash"

Я не совсем понимаю. Я ожидал показ 15 от *p, но он сделал то, чего не ожидал.

Я также пытался присвоить *p числу, подобному *p = 2000, но он также потерпел крах, когда я попытался это сделать.

Также, когда я отображаю адрес указателей и программы A (cout << &pint;) и для программы B (cout << &p;), они оба показывают один и тот же адрес памяти.

Кто-нибудь знает, что именно происходит? Я интересуюсь, но не знаю, что происходит. Кроме того, могу ли я сделать то, что я пытаюсь сделать в C ++ / C?

** РЕДАКТИРОВАТЬ ** Извините, что не упомянул мою платформу, но в настоящее время я использую Window 7 Professional

Ответы [ 3 ]

10 голосов
/ 28 января 2010

Короткий ответ: разные процессы используют совершенно разные адресные пространства.Без дополнительной работы процесс B не может читать или записывать память из процесса A.

Это можно сделать для конкретной платформы.Win32 предлагает такие функции, как WriteProcessMemory , где вы можете напрямую вставлять значения в область памяти другого процесса.Большинство операционных систем предлагают функцию совместно используемой памяти, с Win32 вы можете использовать отображенные в память файлы, а разновидности Unix обычно имеют какую-то эквивалентную функцию «mmap» или «shmem».

2 голосов
/ 28 января 2010

Я думаю, что большинство операционных систем спроектированы так, чтобы сделать невозможным (или очень трудным) делать то, что вы пытаетесь сделать - одна запущенная программа (или процесс) вмешивается в содержимое адресного пространства другой запущенной программы (или процесс). Поскольку вы не говорите нам о своей платформе, трудно быть категоричным по этому поводу, но я подозреваю, что эти операции спасают вас от вас самих. Такое жесткое разделение процессов является функцией безопасности на однопользовательских машинах, функцией безопасности на многопользовательских машинах.

Конечно, существует много методов для запуска параллельных процессов, которые могут совместно использовать память или которые обмениваются информацией путем передачи сообщений. Возьмите еще немного свободного времени и изучите его!

1 голос
/ 28 января 2010

Посмотрите на файлы, отображенные в память, или на общую память.

http://msdn.microsoft.com/en-us/library/aa366551(VS.85).aspx

...