背景:DLL Hell 依舊存在
雖然 .NET 組件並行運行緩解了「DLL 地獄」,但大量存量 C++/COM 專案仍面臨:版本衝突、入口點缺失、加載順序錯誤。標準工具(Depends.exe、Process Explorer)功能固定,難以實現自動化日誌、腳本控制、快照對比等高級需求。本文提供三個自製工具源碼,掌握核心技術後可按需擴展。
現有工具回顧
Depends.exe (Dependency Walker)
- VC++ 附帶,靜態分析 EXE/DLL 導入表,顯示依賴樹。
- 右鍵菜單可顯示完整路徑。
- 局限:僅靜態分析,無法檢測
LoadLibrary/GetProcAddress 動態加載、COM 延遲激活的 DLL。

圖一
Sysinternals ListDlls / Process Explorer
- 動態掃描進程已加載模塊,顯示基址、路徑、版本。
- Process Explorer 3.11+ 支持快照對比,高亮新增/釋放對象。
- 局限:掃描間隔內極短壽命 DLL 可能漏檢;無法直接回答「哪個進程正在使用某 DLL」。

圖二
自製工具一:DllSpy —— 反向查詢「誰在用這個 DLL」
- 上窗格:列出系統中所有已加載 DLL(路徑、版本、基址)。
- 選中 DLL → 下窗格顯示所有使用該 DLL 的進程(PID、進程名、加載基址、靜態/動態加載標記)。

圖三
自製工具二:ProcessSpy —— 正向查詢「這個進程加載了什麼 DLL」
- 上窗格:所有運行進程。
- 選中進程 → 下窗格顯示其加載的所有 DLL(基址、優先加載地址、靜態/動態、路徑)。

圖四
自製工具三:ProcessXP —— 會話/會話隔離視圖
- 專為 Windows XP/Server 2003 終端服務設計,列出所有會話及其進程樹。
- 解決多用戶會話下進程可見性問題。
核心技術點預告
下回將詳細講解:
- 如何枚舉系統進程(
ToolHelp32、PSAPI、NtQuerySystemInformation)。
- 如何獲取進程加載模塊列表(
EnumProcessModules、PEB 遍歷)。
- 如何實現跨進程模塊關聯統計。
參考資料
- Win32 API 枚舉窗口與進程
- VDMDBG 函數在 NT/2000/XP 中的使用
- 調用 Shell 文件屬性對話框
- NT 系統中啟動/終止 16 位應用