1. 程式人生 > >wine的工作原理與自動執行PE程式

wine的工作原理與自動執行PE程式

一次偶然的情況,發現我電腦上的linux可以直接使用./來執行tools/vnd/BCM7584UPKFxBA/brcm_sign_enc.exe程式,但是另外一臺linux電腦就不可以。使用file命令檢視該檔案是windowsPE格式的程式。由於我電腦上有wine,猜測它是通過wine來執行的,因此 cat /proc/PID/maps,發現確實是被wine執行的,程式碼段載入了很多wine相關的庫。那麼問題來了,一個windowsPE格式的控制檯程式,是如何直接通過./被解釋執行的呢?經過查閱資料,發現是/proc/sys/fs/binfmt_misc起的作用:[[email protected] binfmt_misc]$ cat windowsPEenabledinterpreter /usr/bin/wineflags:offset 0magic 5045(注:'P','E'的ascii碼)手動設定:echo :windows:M::MZ::/usr/bin/wine: > /proc/sys/fs/binfmt_misc/registerecho :windowsPE:M::PE::/usr/bin/wine: > /proc/sys/fs/binfmt_misc/register開機自動設定的地方在:[[email protected] binfmt.d]$ cat /usr/lib/binfmt.d/wine.conf# Pre-PE Windows Executables:windows:M::MZ::/usr/bin/wine:# PE Windows Executables:windowsPE:M::PE::/usr/bin/wine:關於wine:之前一直把wine看成一個windows模擬器,但是wine的全名又傲嬌的說自己不是模擬器:Wine Is Not Emulator。下載了wine的原始碼和文件簡單看了下,這才瞭解了wine的工作原理:準確的說,wine是*nix系統上對windows API的開源實現。wine包含了一個windowsPE程式的loader,用來將windowsPE程式及相關dll庫裝載到linux程序環境,同時保留維護著windows環境所需要的一些上下文引數。另外wine中對一些必須重新實現的windows系統dll庫使用linux共享庫來進行了實現。如此看來,wine是執行時刻對windowsAPI進行的動態翻譯,而不是一個模擬器來模擬windows系統的執行邏輯。另外,wine還提供了windows常用命令的linux實現,使得使用者可以重新編譯生成windows命令工具。關於安全性:和虛擬機器不同,由於執行的程式沒有隔離,因此wine的安全性也值得考慮:理論上講windows病毒是可以通過wine來汙染linux環境的,所以至少千萬不要用root來執行wine。相關資料:https://www.winehq.org/http://book.51cto.com/art/201211/364983.htmhttps://wiki.archlinux.org/index.php/Wine_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29https://www.kernel.org/doc/Documentation/binfmt_misc.txthttp://blog.csdn.net/summerhust/article/details/6097198