2017-09-12 115 views
0

假設有下面的代碼 -獲取文件名由地址映射到內存中它映射到

HANDLE h = CreateFile(L"some_dll.dll", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, 
    NULL, 
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
HANDLE map = CreateFileMapping(h, NULL, PAGE_READONLY | SEC_IMAGE, 0, 0, NULL); 
LPVOID res = MapViewOfFileEx(map, 0, 0, 0, 0, 0); 

是否可以提取「some_dll」,因爲採用c它映射到地址,++?

當試圖調試使用WinDbg的這個可執行文件,它似乎不提取模塊也很好

enter image description here

回答

5

是的,這正是GetMappedFileName是:

檢查指定地址是否在指定進程的地址空間中的內存映射文件中。如果是這樣,該函數將返回內存映射文件的名稱。

PS:沒有理由讓windbg顯示不是加載模塊的內存映射文件的名稱,即使該文件碰巧是DLL。

+0

太好了,謝謝! –

+2

文件映射(即段對象)映射爲「SEC_IMAGE」,內存管理器爲其映射PE/COFF映像標題中指定的各個段。因此,WinDbg會顯示來自映射圖像「IMAGE_EXPORT_DIRECTORY」的「Name」,如果它實際上是作爲模塊加載的,IIRC將被加載器模塊表中的任何名稱覆蓋。 VC++在生成一個DLL時設置這個導出目錄'Name'字段。似乎用於構建此DLL的工具將其留爲空白。 – eryksun