Assembly 确定在运行时以汇编语言运行操作系统的技术有哪些?

Assembly 确定在运行时以汇编语言运行操作系统的技术有哪些?,assembly,operating-system,cross-platform,detection,Assembly,Operating System,Cross Platform,Detection,确定在运行时以汇编语言运行操作系统的技术有哪些 如果有直接的方法来确定这一点,那就太棒了 我还想知道Javascript中有哪些技巧可以确定您正在运行的浏览器。。。在像英特尔汇编这样的低级语言中,有没有类似的技术来确定操作系统甚至CPU架构 谢谢, ChenzCPU架构几乎无法确定。CPU体系结构之间的机器代码差别很大,因此很难编写检测代码,因为检测代码不会简单地在一个体系结构之外的所有体系结构上崩溃。事实上,你可以考虑汇编和机器代码在不同的CPU体系结构上是完全不同的语言——任何能探测到基本上

确定在运行时以汇编语言运行操作系统的技术有哪些

如果有直接的方法来确定这一点,那就太棒了

我还想知道Javascript中有哪些技巧可以确定您正在运行的浏览器。。。在像英特尔汇编这样的低级语言中,有没有类似的技术来确定操作系统甚至CPU架构

谢谢,
Chenz

CPU架构几乎无法确定。CPU体系结构之间的机器代码差别很大,因此很难编写检测代码,因为检测代码不会简单地在一个体系结构之外的所有体系结构上崩溃。事实上,你可以考虑汇编和机器代码在不同的CPU体系结构上是完全不同的语言——任何能探测到基本上都是.

的语言。 也就是说,如果您知道您使用的是某种风格的x86,那么您可能可以使用该指令来获取有关处理器功能的信息。您还可以读取控制寄存器以确定是否处于64位模式

至于检测操作系统,这也是相当困难的。不同的操作系统有不同的系统调用入口点,试图使用错误的操作系统入口点只会导致崩溃事实上,Windows甚至会在每次启动时改变系统调用入口点的地址。您可能能够探测windows,但任何访问FS:[0x0]的尝试都可能在其他操作系统上崩溃


一般来说,当您编写程序集时,您应该知道您使用的是哪种系统。如果您需要可移植性,请使用C或其他高级语言编写。

CPU体系结构几乎无法确定。CPU体系结构之间的机器代码差别很大,因此很难编写检测代码,因为检测代码不会简单地在一个体系结构之外的所有体系结构上崩溃。事实上,你可以考虑汇编和机器代码在不同的CPU体系结构上是完全不同的语言——任何能探测到基本上都是.

的语言。 也就是说,如果您知道您使用的是某种风格的x86,那么您可能可以使用该指令来获取有关处理器功能的信息。您还可以读取控制寄存器以确定是否处于64位模式

至于检测操作系统,这也是相当困难的。不同的操作系统有不同的系统调用入口点,试图使用错误的操作系统入口点只会导致崩溃事实上,Windows甚至会在每次启动时改变系统调用入口点的地址。您可能能够探测windows,但任何访问FS:[0x0]的尝试都可能在其他操作系统上崩溃


一般来说,当您编写程序集时,您应该知道您使用的是哪种系统。如果您需要可移植性,请使用C或其他高级语言编写。

不,没有机器代码可以让您这样做。你可以给你的病毒不同的架构几个不同的外壳代码,每次它传播时随机挑选一个。如果它成功运行,它会感染机器,但如果它是垃圾,则您的进程可能会因为发出非法指令而被杀死,并且用户会在一台健康的机器上多活一天。

不,没有机器代码允许您这样做。你可以给你的病毒不同的架构几个不同的外壳代码,每次它传播时随机挑选一个。如果它运行成功,它会感染机器,但是如果是垃圾,那么程序可能因为发出非法指令而被杀死,而用户又用一台健康的机器过日子。

< P>一般不能可靠地确定C++或汇编语言程序中的操作系统。 您可以使用Windows中的GetSystemInfo/GetNativeSystemInfo等不同操作系统版本中提供的某些功能来区分同一操作系统的不同兼容版本,但这些功能在DOS、Linux和其他操作系统中不可用

在汇编语言子例程中很难发现这一点,因为在不同的操作系统上,调用操作系统函数的方式不同,如果对操作系统执行错误,程序就会崩溃。为了防止它崩溃,您需要安装某种异常或信号处理程序,但这也是特定于操作系统的

从通用CPU寄存器的内容推断操作系统也是不可靠的,因为它们的值不能保证以某种方式反映操作系统,即使在某些情况下它们碰巧反映了操作系统,这种情况也可能在将来发生变化,包括在不久的将来更新操作系统时,例如安装安全补丁


您可以使用C的系统函数执行Linux和UNAME-A的shell命令,但是没有可移植的方法来从控制台窗口中的命令中提取输出,并将其复制到程序中进行分析。

< P>一般不能可靠地确定C++或汇编中的OS。 语言程序

您可以使用Windows中的GetSystemInfo/GetNativeSystemInfo等不同操作系统版本中提供的某些功能来区分同一操作系统的不同兼容版本,但这些功能在DOS、Linux和其他操作系统中不可用

在汇编语言子例程中很难发现这一点,因为在不同的操作系统上,调用操作系统函数的方式不同,如果对操作系统执行错误,程序就会崩溃。为了防止它崩溃,您需要安装某种异常或信号处理程序,但这也是特定于操作系统的

从通用CPU寄存器的内容推断操作系统也是不可靠的,因为它们的值不能保证以某种方式反映操作系统,即使在某些情况下它们碰巧反映了操作系统,这种情况也可能在将来发生变化,包括在不久的将来更新操作系统时,例如安装安全补丁



您可能能够使用C的系统函数执行shell命令,例如ver for Windows和uname-a for Linux,但是,没有可移植的方法可以在控制台窗口中提取此命令的输出,并将其复制回程序进行分析。

让我直截了当地说:您正在汇编中编写,但不知道正在运行什么操作系统?为什么需要这样做?@bdonlan:病毒编写是最明显的方法,或者在一个特定的环境中接近通用库不同的way@CrazyChenz,不去上班。大多数主要的PC操作系统都要求在库文件的开头有一个“魔法数字”;这些神奇的数字在不同的操作系统之间是不同的,所以如果你尝试使用一个组合库,除了一个操作系统之外,其他所有操作系统都会完全拒绝它。让我直截了当地说:你在汇编中编写,但不知道你在运行什么操作系统?为什么你需要这样做?@bdonlan:病毒编写是最明显的,或者以不同的方式接近通用库way@CrazyChenz,不去上班。大多数主要的PC操作系统都要求在库文件的开头有一个“魔法数字”;这些神奇的数字在不同的操作系统之间是不同的,所以如果你尝试使用一个组合库,除了一个操作系统之外,其他所有操作系统都会完全拒绝它@斯图,我假设原始机器代码被某种存根加载器调用。可执行文件头确实是另一个问题——如果格式A希望文件以幻数X开头,而格式B希望文件以幻数Y开头,那么在arch方面,您完全是个呆子,CPUID很酷。我认为确定持久性是可行的。是的,原始机器代码。至于可执行文件头,也许在运行的代码位中读取神奇的数字是一种可能性…@CrazyChenz,endianness由CPU拱门决定。如果您真的可以运行代码,那么您已经非常了解endianness了。而可执行文件头的内容只是说这真的很难,可能是不可能的!要使一个可执行文件在多个操作系统上运行,您提到了使用C实现可移植性,但即使在C中,您也无法确定运行时所使用的操作系统。另外,我的目标不是创建一个通用的可执行文件,我只是尝试运行机器代码来确定运行的操作系统@斯图,我假设原始机器代码被某种存根加载器调用。可执行文件头确实是另一个问题——如果格式A希望文件以幻数X开头,而格式B希望文件以幻数Y开头,那么在arch方面,您完全是个呆子,CPUID很酷。我认为确定持久性是可行的。是的,原始机器代码。至于可执行文件头,也许在运行的代码位中读取神奇的数字是一种可能性…@CrazyChenz,endianness由CPU拱门决定。如果您真的可以运行代码,那么您已经非常了解endianness了。而可执行文件头的内容只是说这真的很难,可能是不可能的!要使一个可执行文件在多个操作系统上运行,您提到了使用C实现可移植性,但即使在C中,您也无法确定运行时所使用的操作系统。另外,我的目标不是创建一个通用的可执行文件,我只是试着运行机器代码来确定运行操作系统。你太棒了。我不知道如果没有这美妙的洞察力我会做什么。提供一个C函数来决定运行操作系统的类型,我会的。你太棒了。我不知道如果没有这美妙的洞察力我会做什么。提供一个C函数来决定运行操作系统的类型,我会的。