2014-07-19 39 views
2

所以最近我試圖使用一個進程來從進程讀取/寫入內存。
我已經爲ptrace寫了一個包裝類,現在我正在使用它。Linux上的C++ GetModuleBase

但是,該過程使用多個共享對象,我需要偏移量來計算地址。

因此,讓我們在Windows版本我的過程中說,地址是base.dll +爲0xFF00,所以在Linux上,我希望它是base.so +爲0xFF00,我已經找到了一個不錯替代欺騙引擎scanmem,結合gameconqueror。

但是,我無法獲得base.so的基址,我發現this代碼爲Windows系統,但是,這不適用於Linux系統。

所以各地這就是我在尋找: 那得到一個模塊的基本地址的過程中,通過它的名字,像函數:getModuleBase(PID,「base.so」);

這甚至是可能的,或者我正在尋找一些甚至無法工作的東西?

在此先感謝!

回答

0

在Linux上,您可以使用linux特定的(實際上是GNU libc專用的)dladdr(3)函數,假設您知道其中某個函數符號的地址。

否則,您可以按順序讀取並從您的程序中解析/proc/self/maps文件(或/proc/1234/maps進行pid 1234)。 proc(5)是Linux特有的,並且讀取/proc/中的文件很快(因爲/proc/在沒有物理I/O的情況下在內核中實現,所以沒有涉及磁盤IO)。嘗試在終端

cat /proc/self/maps 

它會告訴你的過程中執行該cat命令

我不知道內存映射的動態定義明確和獨特基址的想法加載(dlopen -ed)插件是有意義的。共享對象ELF文件(即plugin.so文件)通常有幾個段。請參閱this answer(並考慮ASLR ...)

+0

這就是我一直在尋找的!謝謝! – berlinoverflow