簡體   English   中英

如何從內存地址獲取值?

[英]How can I get the value from a memory address?

我想從我擁有的內存地址中獲取值而不會使程序崩潰。

這是我的代碼:

int main(){
    int *ptr=(int*)0x09D37570;
    while(1){
        system("cls");
        cout<<(*ptr);
    }
    return 0;
}

但這會使程序崩潰,它通過調用 *ptr 崩潰,為什么會這樣? 我怎樣才能毫無問題地獲得價值?

您正在獲取一個硬編碼地址並期望它保留您看到的值。 但是,這有幾個問題:

如果擔心你自己的過程,你必須擁有那段記憶。 你用new之類的分配的東西最好已經搶走了那個地址,否則不知道會發生什么。 例如:

int *someAddress = new int (5);
int *somePtr = someAddress; //point to same address as newed
int someInt = *somePtr; //someInt is 5
++somePtr; //uh-oh, now we've left what we newed; it might not be allocated
someInt = *somePtr; //there's no telling if that memory was ok to use

如果它確實有效,您將獲得一些隨機數。 事實上,如果你循環的時間足夠長,它最終會崩潰。 不過,就算是問題,也不直接屬於這里!

最大的問題是即使它有相同的地址,它也不是相同的內存。 這聽起來可能令人困惑,但這是一個非常好的主題 ( http://en.wikipedia.org/wiki/Virtual_address_space )。 基本上,每個進程都有相同的地址值,但它們映射到實際內存中的不同區域。 因此,您的硬編碼地址僅與您的流程有關。

至少在 Windows 上查看其他進程內存的一種方法是使用ReadProcessMemory 在該頁面上,您可以看到要求,例如對正在讀取的進程具有PROCESS_VM_READ權限。 如果失敗,請務必檢查GetLastError 這里有一個小例子。

請注意,在調用ReadProcessMemory之前, VirtualQueryEx也是一件好事。

它可能有效,也可能無效,但這是我所知道的在其他進程的內存空間中探索的最好的方法。 如果您打算完成此任務,那么值得一試。

每個進程都有自己的內存空間,同一個地址在不同的進程中映射不同的物理地址,這樣做是沒有意義的。

如果你在 Linux 上,你可以使用gdb附加到進程,並在某個時候按 Ctrl-C 然后檢查內存。 命令是x ,所以

x 0x09D37570

你也應該能夠做到

print *(int*)0x09D37570;

使用gdb ,您處於進程的受保護內存空間中。

如果沒有操作系統,您嘗試做的事情確實有效。 如果您正在開發沒有虛擬內存地址的固件,這獲取內存的正確方法。

https://sourceware.org/gdb/current/onlinedocs/gdb/Memory.html

暫無
暫無

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

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