看清一个 Windows .exe 文件的内部
在本标签页内解析 · 不上传任何内容 · 不执行任何代码
把一个 Windows 可执行文件拖到下面,这个页面会读取它的文件头,告诉你它是什么:为哪种处理器编译、需要哪些系统库、对自己的发布者和版本是怎么说的、藏在里面的图标、有没有签名,以及有没有被压缩来隐藏内容。文件从不离开你的机器——它由 JavaScript 就在这里读取,而这个页面根本没有地方可以把它发出去。
把 .exe 拖到这里,或者
也能读取 .dll、.sys、.ocx 和 .scr。最大 256 MB。
报告会告诉你什么
每个 Windows 可执行文件都写着大量关于自己的信息,多得出人意料,而在桌面上几乎一样都看不到。报告的顺序经过安排,最有用的部分排在最前面。
处理器与子系统
这是关于任何 .exe 的第一个老实答案。64 位程序在 32 位 Windows 上无法启动;32 位程序几乎在哪里都能运行。子系统说明它会打开一个窗口、一个控制台,还是什么都不打开——因为它是一个要加载进内核的驱动程序。
它加载的库
导入表是整个文件里最能说明问题的部分。程序必须以明文写出它打算调用的每一个系统库和函数——所以要上网的程序必须写出 ws2_32.dll,要动注册表的必须写出 RegOpenKeyExA,要启动其他程序的必须写出 CreateProcessW。这些在任何一条指令运行之前就已经声明好了,而且不写就等于放弃调用这些函数的能力。
它自称是什么
版本资源里保存着发布者、产品名称、文件版本、版权声明和原始文件名——也就是 Windows 在文件“属性”对话框里显示的那些字符串。它们只是构建这个文件的人随手填进去的文字,所以拿来识别文件很有用,拿来当证据则一文不值。
图标
从资源树中提取出来,直接画在页面上。这是确认一个下载就是你以为的那个程序的最快方法,也是发现某个东西冒用了它本无权使用的熟悉图标的最快方法。
加壳与熵
加壳工具会压缩可执行文件,并在启动时于内存中解压。这是缩小下载体积的正当手段,也同样能有效地把程序导入了什么一直藏到它运行起来为止。报告在认出加壳工具的特征时会直接说出它的名字,认不出时则退而测量每个节看起来有多随机。
末尾附带的东西
安装程序通常是一个普通的小程序,在最后一个节之后附加了一整个压缩包。如果报告说文件的大部分都位于可执行部分的末尾之后,你看到的就是一个外壳而不是程序本身——而且里面的文件往往不用安装就能提取出来(英文)。
它不能告诉你什么
它不能告诉你一个文件是否安全。任何只读取文件的东西都做不到,而一个暗示自己能做到的页面比没用还糟糕,因为它会让人放下心来。
这里的一切都是程序对自己的声明。一个愿意被研究的程序会声明很多;一个不愿意的程序只是声明得少一些,而加了壳的程序在真正运行之前几乎什么都不声明。所以一长串能力并不能证明它行为不端——每个更新程序都要联网,每个安装程序都要写文件——一串很短的列表也同样证明不了它行为端正。
检查真正擅长回答的是那些日常问题:它和我机器的架构对得上吗?它是安装程序还是程序本身?它声称有发布者吗?有签名吗?完整吗?是不是在隐藏内容?这些都能从文件本身得到答案,而它们正是大多数人真正想知道的。
如果要一个关于安全性的结论,VirusTotal 会让你上传的文件过一遍大约七十款杀毒引擎。这确实需要上传文件,而这个页面从不这样做——这是一个应该有意识地做出、而不是不知不觉就做了的取舍。
更详细的讨论见这个 .exe 能放心运行吗?(英文)——文件在运行之前透露出的每一个信号、每个信号作为证据到底有多少分量,以及应该按什么顺序去检查。
你的文件去了哪里
哪里都没去。浏览器把你选中的文件的字节交给页面,解析器逐一读过文件头,结果写进页面。没有请求、没有服务器、没有队列,也没有数据保留政策,因为根本没有什么需要保留。关掉标签页,它就没了。
之所以要把这一点说清楚,是因为最显而易见的替代方案——上传后扫描的网站——恰恰是手里拿着一个信不过的文件的人最应该小心的东西。如果你想亲自验证而不是听信这番话,打开浏览器的开发者工具,切到“网络”面板,然后检查一个文件:什么都不会被发送。
页面本身使用 Google Analytics 和 Mediavine,它们以通常的方式看到页面访问。它们看不到你选择的文件,也看不到从中解析出的任何内容;报告在内存中生成,从不变成一次请求。我们确实会记录的是汇总且匿名的信息——格式、处理器以及文件是否有签名——不含文件名,也不含文件内容。细节见隐私政策。
如果你想运行它,而不只是看看
在这里,读取文件和运行文件被刻意放在两个不同的页面。如果报告显示一个文件是 32 位 x86、里面没有什么特别的东西,加载器很有机会在浏览器标签页里把它跑起来——同样无需安装,那边也不上传任何内容。
运行你自己的 EXE → · 在任何平台上打开 .exe 的方法 · 哪些能运行,哪些不能 · 即点即玩的游戏和应用
各平台指南(英文):Mac · Chromebook · Android。如果某个程序因为缺少东西而拒绝启动,缺少 DLL 的错误通常比看上去简单。
把这里的游戏放到你自己的网站上
这里有十一个游戏是专门为这个网站从零写的,所以它们是我们的,可以送出去——我们也确实这么做了。任何人都可以免费放到自己的页面上:一行 HTML,不用账号,不用申请许可,除了一行署名之外不需要别的。
常见问题
我的文件会被上传到什么地方吗?
不会。文件由你自己机器上运行的 JavaScript 读取,文件头在标签页里解析,结果画在页面上。没有任何东西被传输,也不会保留任何副本,因为副本从来没有被创建过。
这会运行那个程序吗?
不会。它读取文件的方式就像图书管理员看书脊一样。可执行文件里的指令一条都不会被执行,而这正是关键:你可以检查一个拿不准的东西,却不给它任何做事的机会。如果你决定确实要运行它,加载器是另一个页面,也是需要你主动迈出的第二步。
它能告诉我一个 .exe 是不是病毒吗?
不能,任何只读取文件的东西都不能。它的用处在于发现一个文件架构不对、是安装程序而不是程序本身、没有签名,或者被压缩得在运行之前什么都不透露。要得到真正的安全结论,请用 VirusTotal。
什么是 PE 文件?
Portable Executable(可移植可执行文件)是所有 Windows .exe、.dll 和 .sys 使用的格式。它开头是一个 1985 年遗留下来的小 MS-DOS 程序,唯一的任务就是打印 This program cannot be run in DOS mode;之后才是真正的文件头、一张存放代码和数据的节表、程序所需的库列表,以及一棵资源树。更详细的解释在这里。
为什么它说我的文件是 16 位程序或 DOS 程序?
因为它确实是,这也正是现代 Windows 拒绝启动它的原因。普通的 MZ 文件是实模式的 MS-DOS 程序;NE 文件则是 16 位 Windows 程序。64 位 Windows 对两者都不再支持,所以双击它们什么反应都没有——没有报错,也没有窗口。两者都仍然可以在模拟环境下运行,那是另一个完整的话题(英文)。
某个节的熵很高是什么意思?
熵衡量的是字节看起来有多随机,范围是 0 到 8。普通的编译代码在 6 左右。大约超过 7.2,数据就是压缩过或加密过的——对于存放 zip 或 PNG 的节来说这很正常,但如果它正是程序执行代码所在的那个节,就强烈暗示加了壳。
在 Mac、Chromebook 或手机上能用吗?
能。它是一个网页,所以只要有一个较新的浏览器就能运行。这一点在那些根本打不开 .exe 的机器上最有意义:Mac 或 Chromebook 没有任何内置的方法去查看 Windows 可执行文件的内部,而这个页面什么都不用安装。