2011-09-01 76 views
16

我想知道是否可以使用C/C++訪問直接內存塊並獲取值。例如:訪問直接內存地址並獲取C++中的值

int i = 15; 
int *p = &i; 
cout << &i; 

如果我把打印的價值在這裏,那會給我的變量i,後者含有值15.我只想說這打印出來0x0ff9c1在這個例子中的地址。如果我有一個單獨的程序,它聲明,像這樣的指針...

int *p = 0x0ff9c1; 
cout << *p; 

是否可以打印出15放置在內存塊0x0ff9c1其他應用程序?我知道我的指針聲明與內存地址是不正確的,我不確定如何去做,否則。我曾嘗試使用memcopy,但我還沒有能夠得到這個工作。我知道這是可能的,因爲我有一個名爲Cheat Engine的程序,它修改遊戲內存地址值以獲得不公平的優勢。我已經成功地放置了打印的內存位置並通過作弊引擎獲得了值(15)。我的目標是使用C++來做到這一點。 如果這太混亂了,基本上我想訪問另一個應用程序使用其內存地址存儲的變量並打印出該值。如果有問題,我正在使用Windows 7 x64和MinGW編譯器。謝謝! PS:我會張貼一張關於Cheat Engine做什麼的圖片來提供一個更好的主意。 enter image description here

+5

+1。 – Nawaz

+3

讀一本關於虛擬內存的書。作爲附加說明:linux和一些新版本的Windows採用堆棧隨機化,所以程序執行時局部變量的地址會有所不同。 – unkulunkulu

+0

是的,雖然我發現了實驗。我正在考慮通過執行參數將地址導出到第二個程序。我會研究虛擬內存,謝謝你的提示。 – llk

回答

6

這兩個進程有不同的地址空間。一個進程不能訪問另一個進程內存,除非它是明確的共享內存。

+0

@Shadowalker基於Ed的回答,指針內的地址不是RAM內部的實際物理地址,它只是應用程序本地的地址(從某種意義上說是虛擬地址)。 –

+0

調試器和其他程序如Cheat Engine如何訪問它們?根據我的理解,OLLYDbg和Cheat Engine不會安裝內核驅動程序或任何嚴重的掛鉤。但我可能是錯的。 – llk

+1

在Windows下使用'ReadProcessMemory()'和'WriteProcessMemory()'。 – trojanfoe

1

通常,一個程序通常不可能修改另一個程序的內存。系統竭盡全力確保這一點。如果沒有,程序就不安全。在我所使用的所有Unix變體中,尤其如此,儘管不是我見過的所有專有操作系統。

注意,沒有這些規則適用於內核...

還有一個名爲共享內存編程範式,但你必須明確地設置了。

簡答:你不能這樣做。我相信你提到過windows。我對Windows一無所知,所以你的里程可能會有所不同。

+0

答案的重點有點不對,嚴格來說不完全正確,因爲OS提供了進程修改彼此內存的方法。答案應該集中在內存空間不同的事實上,因此具有相同值的指針在不同進程中引用不同的物理內存位置。 – unkulunkulu

+0

雖然可能需要,但我並不覺得完整的虛擬記憶課有保證。 –

5

你不能在C++中以平臺不可知的方式做到這一點。雖然我沒有專門使用這個「作弊引擎」,但它幾乎可以肯定地使用調試器使用的相同的特殊API。該代碼將特定於Windows,並且您將在運行過程中需要一定的特權級別。

(例如,如果你使用Visual Studio,並在調試模式,從它執行程序,Visual Studio可以看一下,並在該程序中修改值。)

我沒有寫在調試器一段時間,所以我不知道哪裏的好地方,以獲得有關調試API是開始,但你可以在網絡上搜索的東西喜歡這篇文章:

http://www.woodmann.com/fravia/iceman1.htm

+0

注意:正如其他人指出的那樣,調試器API不是唯一的特權API,特定平臺可以提供其他過程。 (事實上​​,一些嵌入式系統根本不用單獨的地址空間,仍然可以編譯C和C++源代碼,所以你的「天真」例子實際上可能適用於那些非常基礎的平臺。)我只是猜測出現的可能性是調試API是它使用的 - 與SpyXX使用的鉤子相反。 – HostileFork

3

如果你想改變另一個進程使用的內存,一種方法是將代碼注入到另一個進程中。從這一點上,你可以做任何你想要的其他程序的內存,就好像它是你的擁有者一樣。

搜索周圍的remote thread creationhooking。這裏有幾個關於它的問題(和here,對於初學者)。