2011-10-19 44 views
1

什么是在运行时确定以汇编语言运行OS的技术?什么是在运行时确定以汇编语言运行OS的技术?

如果有直接的方式来确定这一点,那简直是真棒。

我也在想如何有在Javascript技巧,以确定你在...上运行的浏览器是否有用于确定像Intel汇编低层次的语言操作系统,甚至CPU拱类似的技术?

谢谢, Chenz

+2

让我直截了当地说:你正在编写程序集并且不知道你在运行什么操作系统? – Stu

+0

为什么你需要这样做? – bdonlan

+0

@bdonlan:病毒编写是最明显的 – James

回答

3

CPU架构将是下一个要不可能确定。机器码在CPU架构上差别很大,因此编写检测代码非常困难,它不会简单地在除一个架构之外的所有架构上崩溃。事实上,您可以考虑将汇编(和机器代码)作为不同CPU架构上完全不同的语言 - 任何可以探测的东西,必须基本上是machine code polyglot。这就是说,如果你知道你在的某些味道的x86,你可能可以使用CPUID指令获取有关处理器功能的信息。您也可以读取控制寄存器来确定您是否处于64位模式。

至于检测OS,这也是相当困难的。不同的操作系统有不同的系统调用入口点,尝试使用错误的操作系统入口点只会导致崩溃(实际上,Windows甚至会将系统调用入口点的地址从一个引导到另一个引导)。您可能能够探测窗口的TIB - 但任何企图访问FS:[0x0]可以在其他操作系统也崩溃。

一般来说,当你编写汇编你应该知道你是什么样的系统上。如果您需要可移植性,请使用C语言或其他高级语言编写。

+0

忘记了:让我们从可执行头开始! – Stu

+0

@Stu,我假设原始机器代码(由某种存根加载器调用)。可执行头文件确实是另一个问题 - 如果格式A希望文件以幻数X开头,格式B希望以幻数Y开始文件,则完全卡住 – bdonlan

+0

就arch而言,CPUID很酷。而且我认为确定永久性可能是可行的。是的,原始机器码。至于可执行的头文件,也许在一段代码中读取神奇的数字将是一种可能性... –

1

不,没有机器代码可以让你这样做。你可以使用为不同的体系结构提供几种不同的shellcode,每次传播时随机挑选一个。如果它成功运行,它会感染机器,但如果它是垃圾,那么您的进程可能因发布非法指令而被杀死,并且用户可以用健康的机器继续生活。

+0

你真棒。没有这种美妙的见解,我不知道我会做什么。 –

+0

我期待着接受的答案! – James

+0

提供一个确定正在运行的操作系统类型的C函数,我会这样做。 –

0

通常不能可靠地确定在C(++)或汇编语言程序的OS。

您可以使用它的一些功能,这些功能在这些不同的操作系统版本,像在Windows GetSystemInfo()/GetNativeSystemInfo()可用相同的操作系统不同的“兼容”版本之间的区别,但这些都是不可用的DOS,Linux的和其他操作系统。

这是很难找出一个汇编语言子程序,因为在不同的操作系统有正在调用OS功能的不同方式,如果你的操作系统做正确,你的程序崩溃。为了防止它崩溃,你需要安装某种异常或信号处理程序,但这也是操作系统特定的。

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

您可以用C的system()函数执行shell命令如ver for Windows和uname -a用于Linux,但没有可移植的方法来提取在控制台窗口此命令的输出,并复制它放回程序进行分析。