2016-12-12 26 views
2

我正在編寫一個應用程序,它試圖從另一個進程的內存中讀取一些數據。該另一個進程正在加載一個libmono.0.dylib,目標數據(程序集)應駐留在該目錄中。在另一個進程中從加載的dylib讀取數據字段

有了一些基於mach-o的代碼,我可以迭代目標進程的加載dylib並獲得上面lib的mach頭baseaddress。在這裏,我可以去,讓我的功能,與相關數據返回結構地址符號表:

_mono_get_root_domain symbol

在單源代碼,它看起來像

MonoDomain* mono_get_root_domain (void) { return mono_root_domain; } 

我的假設是否正確,0x18a934的地址是否包含返回的結構?如果是,這個地址是相對於dylib頭(= header_addr + addr)還是我還需要添加一些幻燈片,或者就這樣使用它? 當我遵循這個地址時,對於我遇到的每個其他地址是否也持有同樣的權利?

回答

0

我寫信,試圖從另一個進程的內存

每個進程都有自己的虛擬內存空間,並通過內核保護讀取一些數據的應用程序。如果一個函數返回一個地址,則可以共享dylib,它將位於調用函數的進程的虛擬內存映射(VMMap)中。

爲了將目標進程的內存地址映射到您自己的進程地址空間,您需要目標的任務端口。您以前可以致電task_for_pid從其pid獲取進程的任務,但自從OS X 10.10(El Capitan)和引入系統完整性保護(SIP)後,這不再可能。

如果數據駐留在已加載的dylib中,只需將dylib加載到您自己的進程中並使用dlopen並通過調用dlsym來獲取該函數的地址。

+0

感謝您的回答!我已經有了這部分,我有加載的標題地址和指向符號的指針。正如你在上面看到的,我在反彙編代碼中找到了一個「內部」指針,現在我該如何使用它?如果我閱讀dylib_base_address +指針,那麼我只是隨機的東西。它指向什麼vm區域? – GooKSL

相關問題