在64位
windows
上存在著
32位和
64位兩個版本的
clr。本文介紹如何通過
clr自帶的工具
(ldr64.exe/corflags.exe)
指定託管程式「寄宿」的
clr版本,並且和大家分享筆者研究這兩個工具運作機理的過程以及使用的「秘密**」
(procmon/dumpbin)
。在過去的一年中,我的工作環境從32位
windows(
儘管cpu是64
位的)漸漸遷徙到64位
windows
。在64
位windows
上安裝的
.net
會有兩個分支,分別針對
32位和
64位環境,其主要的
dll分別儲存在了以下位置:
c:/windows/microsoft.net/framework/v2.0.50727/mscorwks.dll
c:/windows/microsoft.net/framework64/v2.0.50727/mscorwks.dll
根據具體的
.net
版本,上述路徑中的版本號會有些微的差別。儘管兩個
clr的表現基本一致,但是由於工作平台的差別,也只能是求同存異。最明顯的差別是:
jit出來的**不同,乙個是
32位的本地**,而另乙個是
64位的。
這就帶來了乙個問題,託管程式的到底是在哪乙個
clr中執行的呢?
32位還是
64位?在這裡介紹兩個工具,從不同的粒度上決定了32位
clr還是64位
clr。
1.ldr64.exe:
在這裡我特地強調了
.exe
,是因為臭名昭著的特洛伊木馬
ldr64.dll
。大家以後看到這個名字的時候先不要興奮,看清楚字尾再做打算。
ldr64
的語法很簡單,後面跟乙個引數,只有兩個可能的值,分別是
set64
和setwow
。其意義很直接:
ldr64 set64
表示用64
位的clr
,ldr64 setwow
表示用32
位的clr。(
如果你在詫異為什麼不是
ldr64 set32
而是ldr64 setwow
,那麼我很榮幸的講乙個小故事:
wow是
windows on windows
的簡稱,當
64位的
windows
發布時,為了相容32位
windows
,發明了
wow這個概念,不過事實證明這個名字很容易引起歧義。)
ldr64
是乙個粒度很大的命令,具有全域性影響。舉例來說,在乙個命令列視窗執行了
ldr64
以後,不管是從該命令列視窗還是其外的其他環境啟動乙個託管程式,都會遵照之前
ldr64
設定的結果。當然,也有例外:
2.corflags
corflags
是修改託管二進位制程式的工具。最常見的用法是
corflags /32bit+ a.exe
。其中,
a.exe
是託管程式的檔名,
/32bit+
是用來指定
32位的執行時,與之相對的是
/32bit-
,其功能是取消該程式對
32位執行時的繫結,可以通過
32位或者是
64位執行時執行。
到這裡,我小結一下前面講過的東西好讓僅僅抱著解決問題而來的朋友們滿意而去,
ldr64.exe
和corflags
兩個工具從不同的粒度指定
32位或是
64位執行時。而且一如我們的常識,當兩者衝突的時候,力度小的工具
corflags
具有更高優先順序。
接下來,我們來使用一些秘密**,進一步了解
ldr64.exe
和corflags
的工作原理。首先,請大家開啟
)(這套工具是由在
os界具有傳奇色彩的
mark
開發,mark
以前一直通過逆向工程的方法了解
windows
甚至是抨擊
windows
,但是現在已經成為了
windows
mark
的傳奇)。
在procmon
中新增乙個
filter
來觀察ldr64.exe
的行為,如圖所示。
然後,執行
c:/windows/microsoft.net/framework64/v2.0.50727/ldr64.exe setwow
,觀察procmon
,發現乙個很有趣的行為,如下圖所示,
對了,ldr64
所做的事情,就是修改這個這冊表項。
接著,來看
corflags
。由於corflags
操作的物件託管程式,而託管程式本身是乙個二進位制檔案,所以祭出
dumpbin
。對乙個任意的託管程式(假設
a.exe
),在執行
corflags /32bit+
和/32bit-
之後,用
dumpbin
產生人類可以看懂的描述,進而比較其不同。操作如下所述:
corflags /32bit+ a.exe
dumpbin /all a.exe > 32.dmp
corflags /32bit- a.exe
dumpbin /all a.exe > any.dmp
windiff 32.dmp any.dmp
注:windiff
是筆者手頭的檔案比較器,看官們可隨意選用自己稱手的比較器取而代之。
比較結果如圖所示,
corflags
的效果一目了然:
/32bit+
設定了託管程式的
clr頭,增添了乙個需要
32位執行時的要求。而
/32bit-
則做了相反的事情,把之前的置位復原。
今天借了
ldr64.exe
和corflags
的機會,介紹了兩個小工具
procmon
和dumpbin
的使用,許多程式高手手邊都有這些小巧玲瓏但是功能強大的工具,從而事倍功半。
Windows上64位程式設計
windows上64位程式設計 2011年6月21日 18 01 c c 僅僅定義了這些基本資料型別之間的關係,並沒有定義嚴格定義它們的字長。在不同的平台上,根據編譯器不同的實現,它們的字長如下表所示 資料型別 lp64 ilp64 llp64 ilp32 lp32 char short 16 16...
32 位和 64 位 Windows識別
32 位和 64 位 windows 全部顯示 32 位和 64 位版本 windows 之間有什麼區別?術語 32 位 和 64 位 是指計算機的處理器 也稱為 cpu 處理資訊的方式。64 位版本的 windows 可處理大量的隨機訪問記憶體 ram 其效率遠遠高於 32 位的系統。我如何知道我...
無法執行64 位操作
事先說明一下,本人的電腦是t430,64 位作業系統,32位的虛擬機器 64位的 centos6.5 安裝包。在家電腦想搭建一套 linux centos centos 6.5 x86 64 bin iso 不到2 centos,按照網上大家奉獻文件開始配置,配置好了開啟虛擬機器,啟動途中出現了 v...