Side-by-side Assemblies

最近準備往AntiSpy中加入應用層檢測Hook的功能。在寫這個功能的時候碰上了一些問題,花了很長時間才搞定,在此記錄下,後來人可以少走俺的這些“彎路”。

在枚舉“阿里旺旺”進程的鉤子時,發現此進程加載了兩個同名的Dll,即“comctl32.dll”。
而其中comdlg32.dll的導入表中會引入 comctl32.dll 模塊的導出函數,這裏就有一個問題了,comdlg32.dll模塊到底導入的是哪個comctl32.dll 導出的函數呢?

Google了下才發現,此技術叫Side-by-side Assemblies(http://msdn.microsoft.com/en-us/library/aa376307.aspx)。用到此技術的模塊通常會被放在Windows\winsxs目錄下。

當PE文件的Dll加載器加載相關的模塊時,會根據PE文件發佈時自帶的manifest加載適當版本的Dll,如果不發佈該項manifest,Dll加載器按默認版本加載Dll,例如,xp系統的默認 Comctl32.DLL 版本5.0

用資源編輯器打開comdlg32.dll,並定位到manifest。
...
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
...
這裏要求使用的是6.0.0.0版本,因此,此處comdlg32.dll導入的是第二個版本的Comctl32.DLL 模塊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章