我怎样才能判断一个DOS是否是exe。需要32位CPU才能运行?

2021-02-16 13:38

是否有一些简单的方法来确定DOS(或OS/2,或Windows等)二进制文件(或.dll)是16位还是32位?Linux file命令只是说quot;.我想区分在任何quot;处理器上运行的

解答动态

  • 普通DOS可执行文件,无论是COM格式还是MZ格式,都不会在其头文件中提供此信息(当有一个-COM格式没有头文件时)。确定一个程序是否需要一个给定的CPU的唯一可靠方法是,尝试在一些性能较差的系统上运行它(或进行仿真,例如使用PCem对不同的x86处理器进行精确仿真),并依靠程序检查CPU是否足够好,或者在它上用一个无效的操作码崩溃(在186或更高版本上)。或者,您可以尝试反汇编程序并查找386+操作码;但这只与反汇编过程一样可靠,并且在适应CPU的程序上会产生不一致的结果(仅在8086s上运行8086代码,在386s上运行386代码,等等)。
    对于保护模式可执行文件,具体来说,您可以查找常见的32位DOS扩展器或存根,例如DOS/4G、32RTM。。。使用其中一个的程序需要386。(还有286个扩展器)请看.COM可执行二进制文件是实模式还是保护模式?有关DOS程序如何启动的更多讨论(但real-v.protected mode只是指令集用法的一个方面;程序甚至可以在real mode下使用286、386、486、Pentium等指令)。
    许多后MZ可执行格式对这些信息进行编码;例如,16位Windows和OS/2可执行文件是“新的可执行文件”,带有指示需要哪个CPU的标志。32位OS/2可执行文件是“线性可执行文件”,由MZ存根后面的LX头标识,并指定其目标CPU和操作系统。同样,32位Windows程序是“可移植可执行文件”,PE头标识目标CPU。文件知道这些,并将正确识别它们。但是,也值得检查MZ存根的详细信息,因为LX或PE可执行文件的MZ存根中可以包含16位变体,因此可以在16位CPU上运行;类型可执行文件头不包含关于它包含什么类型的代码或它需要什么CPU类型的信息。它只包含一个加载到内存中的二进制映像以及有关如何在实模式下启动它的信息,因此没有单独的16位或32位二进制文件。
    二进制映像可能包含任何可用于给定类型CPU的实模式操作码,但如果它确实包含32位保护模式代码,将有一个实模式加载器存根来切换到保护模式,并跳转以运行包含在可执行文件中的32位映像。
    因此DOS无法知道可执行文件包含什么,DOS只需将可执行二进制文件加载到内存中,进行重定位,然后跳转以在标头中给定的入口点运行代码。它包含什么操作码取决于可执行文件,例如,如果它需要某种类型的CPU来运行某些操作码,它可以执行CPU类型检测,如果它适合运行程序的其余部分。例如,可执行文件可能包含一个存根,用于将386 CPU置于32位保护模式,然后以该模式而不是16位实模式执行大部分程序。
    因此,为了检测需要哪种类型的CPU,该程序必须在虚拟机中运行,以查看执行的操作码。反汇编程序也可以用来查看二进制文件中有哪些操作码。虽然有一些标准的编译器启动代码可以被分析生成二进制文件的工具检测到,但也有很多其他方法可以使程序不使用标准的编译器或库,或者使反汇编程序不能遵循每一条代码路径,例如,通过动态生成一个指向执行code.
    So的指针,这并非不可能。这并不容易。有什么简单的方法可以确定DOS二进制文件(或.dll)是16位还是32位的吗?首先,DOS不知道32位,它是一个严格的16位系统。其次,.DLL不是DOS可执行文件,而是Windows库.
    Linux文件命令只是说“可执行文件”.
    ,因为所有的EXE都是以16位程序开始的,由前两个字节中的幻数“MZ”标记。DLL也一样,因为它们带有一个16位EXE的存根头。这样做是为了启用警告(*1),以防有人试图在DOS下启动它。因此,出于所有实际目的,它们都是16位可执行文件。
    说明:我想区分在任何quot;处理器上运行的程序和那些quot;处理器的程序,这比设置两个环境并尝试运行程序要简单。
    对于真正的DOS程序,那不是windows程序,也没有简单的检测方法,因为DOS根本不支持32位。任何DOS程序都以16位程序开始,标记为MZ头。DOS下的32位用法由程序自己定制,DOS不可见。当然,人们可以搜索常见DOS扩展程序的签名,但这仍然只能覆盖所有32位程序的一部分。这也不是决定性的,因为程序可能包括32位内存访问支持,但不是32位themself.
    现在,如果这是一个32位的Windows EXE程序。在这里,与DLL或任何其他包含代码的Windows文件非常相似,该文件以PE头开始,而PE头又以16位EXE存根开始,如果在DOS.
    下启动,该存根能够发出警告(*1)。任何查找(16位)DOS程序的都会发现EXE文件和DLL正是这样的,即DOS程序。
    之后存根(*2),PE头包含几个部分,首先是COFF(公共对象文件格式)块,在它的幻数之后,它包含一个机器类型,告诉代码要用于哪台机器。公共值是16位的200000h,32位的0014ch(386-32的十进制332),64位的08664h,后面是定义其他特征的更多字段,包括字大小等。对于所有实际用途,0014Ch机器类型是32位Windows应用程序的最重要指标。然后是可选的PE+头,表示64位版本的头的不同格式。
    最后但并非最不重要的是,Windows DLL的工作方式与Windows EXE完全相同,具有相同的PE头。
    虽然PE格式现在是最常见的格式,但也有一些变化。最常见的是Windows 1.0/MSDOS引入的
    New可执行文件(NE),16位线性可执行文件(LE),用于Windows 9x、OS2和一些DOS extender中的混合16/32位OS2 2.0(LX)MP的可执行文件,用于Phar Lap DOS extender. *1-众所周知的“此程序不能在DOS模式下运行”message.
    *2-由DOS组成头,指向PE头和存根本身的指针。忽略指针是程序试图PE格式的常见错误。

    • End

    免责声明:

    本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。