一次偶然的情况,发现我电脑上的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起的作用:
[lubo@localhost binfmt_misc]$ cat windowsPE
enabled
interpreter /usr/bin/wine
flags:
offset 0
magic 5045(注:'P','E'的ascii码)

手动设置:
echo :windows:M::MZ::/usr/bin/wine: > /proc/sys/fs/binfmt_misc/register
echo :windowsPE:M::PE::/usr/bin/wine: > /proc/sys/fs/binfmt_misc/register

开机自动设置的地方在:
[lubo@localhost 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.htm
https://wiki.archlinux.org/index.php/Wine_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29
https://www.kernel.org/doc/Documentation/binfmt_misc.txt
http://blog.csdn.net/summerhust/article/details/6097198
GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:23 天前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐