2012-09-25 19 views
5

我有一個工作程序,加載插件LoadLibrary在Windows下動態加載庫的地址範圍

新要求:在代碼的某個位置,我給了一個指針,我需要測試這個指針是指向插件的代碼還是靜態數據。

bool is_pointer_into_plugin(void *p, HMODULE h); 

等價,我需要檢索插件到其中的指針指向,如果有的話。我還需要知道指針是指向主程序的代碼還是靜態數據(理想情況下,區分只讀區域和讀寫區域)。

HMODULE plugin_containing_pointer(void *p); 

等同地,我需要能夠檢索插件映射的範圍(地址和大小)。我也需要這些信息作爲主程序。

我該如何實施is_pointer_into_pluginplugin_containing_pointer或其他什麼東西?

如有必要,我可以將電話更改爲LoadLibrary。查找應該儘可能快,加載時間代碼不需要很快。在單獨的進程中運行插件並通過共享內存進行通信不是一種選擇。該程序必須在Windows XP及更高版本(和Linux,但是這是another question)上運行。

我需要的信息或多或少是Sysinternals實用程序listdlls報告的內容,所以我試圖瞭解它是如何實現的。我看到使用NtQueryInformationProcess檢索鏈接到LDR_DATA_TABLE_ENTRYPEB結構的suggestion。看起來很有希望,但:

  • 我可以看到一個DllBase這看起來似乎是每個DLL(是嗎?)的起始地址,但沒有大小。
  • NtQueryInformationProcess的文檔標記爲不可移植,但並不表示我正在嘗試做的替代方案。
  • 在我的系統上,PEB中的唯一字段是BeingDebuggedSessionId,再加上一些ReservedN字節數組 - 這不是一個好兆頭。

我該如何枚舉插件的地址範圍,或者測試指針是否在插件中,或者確定指針指向哪個插件?

回答

4

GetModuleHandleExGET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS標誌會告訴你指針指向哪個模塊。從這裏你可以學習模塊頭來找出哪一部分。但整個演習聞起來很有趣。你爲什麼關心一個指針指向哪個插件?