簡體   English   中英

我可以讀取任何內存值嗎?

[英]Can I read any memory value

我只是想知道我是否可以通過提供它的地址(在我的情況下隨機)來讀取內存中的任何值。 我知道它不起作用,但我試過:

int e = 10;
int* p = &e;
p = 0x220202;

這甚至都不會編譯。 那么,有沒有辦法用C ++或任何其他編程語言在計算機的內存中讀取內容。

那么,有沒有辦法在我的計算機內存中讀取內容

如果您參考計算機的整個內存: ,您不能 - 至少不在現代桌面/主流操作系統上。 您只能從進程的地址空間中讀取內存。

看看虛擬內存 簡而言之:您的指針指的是“虛擬”地址,而不是真正的地址。 計算機中的特殊硬件會將這些地址轉換為實際地址。 操作系統定義了必須如何完成映射。 這樣,每個進程都擁有自己唯一的地址空間。 只要操作系統的調度程序切換到另一個進程,它就會告訴硬件切換到相應的轉換表。 由於這種機制,您可以在進程之間獲得隔離,這是一件非常好的事情:如果編程不良的應用程序訪問無效內存,則只有相關進程會崩潰,而系統的其余部分不會受到影響。

想一想:如果沒有這種隔離,每次測試某些指針算法時,您可能需要重新啟動計算機。

您可以讀取操作系統分配給您的進程的任何值。

在您的示例中,您需要在分配之前將整數強制轉換為指針:

p = (int*) 0x220202; // now p points to address 0x220202
int value = *p;  // read an integer at 0x220202 into 'value'

請注意,不能訪問地址 - 某些區域是只讀的,在某些平台上,指針也必須正確對齊(即指向32位整數的指針應在4字節邊界上對齊)。

如果用p = (int *)0x220202替換p = 0x220202 ,則代碼將編譯。 僅通過提供地址,您將無法訪問任何內存。 您只能訪問此進程的地址空間內的內存。 這意味着您的操作系統將阻止您訪問另一個exe的內存。

您必須將0x220202int*

寫:

p = (int*)0x220202 ;

這將編譯,但在運行程序時很可能會崩潰。

您將收到運行時錯誤,因為此內存超出了程序的范圍

#include <iostream>
using namespace std;

int main() {
    int * p = (int *) 0x220202;
    int i = *p;
    cout << i;
    return 0;
}

暫無
暫無

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

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