簡體   English   中英

從另一個程序分配特定的內存地址,並更改其值

[英]Assigning A Specific Memory Address from another program, and changing it's value

最近我離開學校幾天,想在C ++中做一個處理內存地址的小程序實驗。

我想看到的是,如果當前正在運行的程序(讓它稱之為程序A)創建了一個指向堆中int對象的指針,則可以被另一個程序看到並進行修改(程序B)。

所以對於程序A,這是我的基本代碼:

// 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"

我不太明白。 我期待從*p顯示15,但它做了我沒想到的事情。

我也嘗試將*p分配給像*p = 2000這樣的數字,但是當我嘗試它時它也崩潰了。

此外,當我顯示指針的地址和程序A( cout << &pint; )和程序B( cout << &p; )時,它們都顯示相同的內存地址。

有誰知道究竟發生了什么? 我很感興趣但對於正在發生的事情感到困惑。 另外,我有可能做我在C ++ / C中嘗試的事情嗎?

**編輯**很抱歉不提我的平台,但我目前正在使用Window 7 Professional

簡短的回答是,不同的進程使用完全不同的地址空間。 如果不做更多的工作,進程B就無法從進程A讀取或寫入內存。

可以以特定於平台的方式執行此操作。 Win32提供WriteProcessMemory等函數,您可以直接將值戳入另一個進程的內存空間。 大多數操作系統提供共享內存功能,使用Win32可以使用內存映射文件,而Unix風格通常具有某種等效的“mmap”或“shmem”功能。

我認為大多數操作系統都是為了讓你不可能(或者很難)做你想要做的事情 - 讓一個正在運行的程序(或進程)干擾另一個正在運行的程序(或進程)的地址空間的內容)。 既然你沒有告訴我們你的平台,就很難對此進行分類,但我懷疑o / s是在拯救你自己。 這種嚴格的過程分離是單用戶機器上的安全功能,是多用戶機器上的安全和安全功能。

當然,有許多用於運行並發進程的技術,這些進程可以共享內存或通過消息傳遞交換信息。 離開學校再多學時間學習一下!

看看內存映射文件或共享內存。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM