題:
進程地址空間中存在的模塊
user3365
2013-12-18 20:02:25 UTC
view on stackexchange narkive permalink

利用波動性檢查內存轉儲中的services.exe進程,我建立了一個在進程空間中加載的dll列表。 (這些模塊來自InLoadOrder模塊列表)

這只是摘錄(完整列表: http://pastie.org/8560797):

  0x5b860000 netapi32.dllFileObject @ 8a3cb028,名稱:\ WINDOWS \ system32 \ netapi32.dll0x77f60000 shlwapi.dllFileObject @ 8a3e0df0,名稱:\ WINDOWS \ system32 \ shlwapi.dll  
可以看到進程中已加載shlwapi.dll。感謝DependencyWalker(查看services.exe的導入),我發現了shlwapi.dll的加載方式。 (->表示導入)

netapi.dll-> dnsapi.dll-> iphlpapi.dll-> mprapi.dll-> setupapi.dll-> shlapi.dll

但僅netapi.dll已加載。 dnsapi.dll未加載,在InLoadOrder模塊列表中沒有該條目,也沒有加載上述“依賴鏈”中的任何其他dll。

這不僅適用於shlapi.dll,而且適用於許多其他已加載的dll。例如:shell32.dll,psapi.dll ...都不會僅在services.exe進程中發生。

為什麼將這些dll加載到進程中?非常感謝您的幫助!

一 回答:
peter ferrie
2013-12-19 01:53:28 UTC
view on stackexchange narkive permalink

netapi.dll可能已經加載了dnsapi.dll以便進行一些網絡檢查,然後在完成時釋放了DLL。但是,shlwapi.dll可能由於某種原因而持有一些打開的對象的句柄,或者由於循環加載而具有非零引用計數,因此即使在其他DLL卸載後也仍保留在內存中。卸載請求不能保證一定會得到兌現,也不能阻止請求者先卸載。 user32.dll是另一個通常顯示此行為的DLL。

好的,我理解這一點-感謝您向我說明清楚。這使我想到另一個問題。查看由csrss.exe進程加載的dll(實際上僅導入ntdll.dll和csrsrv.dll),我在進程空間中發現了一堆其他dll,即:basesrv.dll,winsrv.dll,user32.dll, sxs.dll,kernel32.dll,gdi32.dll,advapi32.dll,rpcrt4.dll。這些進口來自哪裡?它們既不是ntdll.dll的依賴項,也不是csrsrv.dll的依賴項。謝謝!
從Windows XP開始,將kernel32.dll強制加載到所有進程中,以防止進程啟動時崩潰(ntdll.dll依賴kernel32.dll)。 kernel32.dll依次加載gdi32.dll,advapi32.dll,rpcrt4.dll等。每個加載項可能會加載其他DLL,最終覆蓋整個列表。
我只是檢查了kernel32.dll的導入,根據DependencyWalker,kernel32.dll僅依賴於ntdll.dll。
雖然在您的示例中kernel32.dll可能僅從ntdll.dll導入(Win7才是正確的-然後它也從其他DLL導入),但即使是像WinExec這樣的簡單API,kernel32.dll也會加載advapi32.dll,該advapi32.dll會加載rpcrt4等


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...