在运行时用汇编语言确定正在运行的操作系统的技术有哪些?
如果有直接的方法来确定这一点,那就太棒了。
我也在想Javascript中有什么技巧可以用来确定你运行的浏览器是什么……在像英特尔汇编语言这样的低级语言中,有没有类似的技术来确定操作系统甚至CPU拱门?
谢谢,Chenz
发布于 2011-10-20 05:19:25
CPU架构几乎不可能确定。机器代码在不同的CPU架构之间差别很大,因此很难编写检测代码,而不是简单地在所有架构上崩溃,而只在一个架构上崩溃。实际上,你可以认为汇编(和机器代码)在不同的CPU架构上是一种完全不同的语言--任何可以探测的东西基本上都必须是一个machine code polyglot。
也就是说,如果您知道您正在使用某种风格的x86,那么您也许能够使用CPUID指令来获取有关处理器功能的信息。您还可以读取控制寄存器,以确定您是否处于64位模式。
至于操作系统的检测,这也是相当困难的。不同的OSes有不同的系统调用入口点,尝试使用错误的操作系统入口点只会让你崩溃(实际上,Windows甚至在每次启动时都会改变syscall入口点的地址)。你也许能够探测到windows的TIB,但是任何访问FS:[0x0]的尝试都很可能在其他OSes上崩溃。
一般来说,当你编写汇编语言时,你应该知道你在哪种系统上。如果您需要可移植性,可以用C或其他高级语言编写。
发布于 2011-10-20 05:42:03
不,没有机器代码可以让你这样做。你可以给你的病毒几个不同的外壳代码,用于不同的架构,在每次传播时随机选择一个。如果它成功运行,它就会感染机器,但如果它是垃圾,你的进程可能会因为发出非法指令而被杀死,而用户可能会在健康的机器上再活一天。
发布于 2011-10-20 06:45:13
通常,您不能可靠地确定C(++)或汇编语言程序中的操作系统。
你也许能够使用一些在不同操作系统版本中可用的功能来区分同一操作系统的不同“兼容”版本,比如Windows中的GetSystemInfo()/GetNativeSystemInfo(),但这些功能在DOS、Linux和其他OSes中是不可用的。
这在汇编语言子例程中很难发现,因为在不同的OSes上有不同的调用OS函数的方法,如果您在OS上做得不正确,您的程序就会崩溃。为了防止它崩溃,您需要安装某种异常或信号处理程序,但这也是特定于操作系统的。
从通用CPU寄存器的内容推断操作系统也是不可靠的,因为它们的值不能保证以某种方式反映操作系统,即使在某些情况下,这种情况可能会在未来发生变化,包括在不久的将来当您更新操作系统时(例如安装安全补丁)。
您也许能够使用C的system()函数执行shell命令,例如ver for Windows和uname -a for Linux,但是没有可移植的方法从控制台窗口中提取此命令的输出并将其复制回程序中进行分析。
https://stackoverflow.com/questions/7828233
复制相似问题