什么是在运行时确定以汇编语言运行OS的技术?什么是在运行时确定以汇编语言运行OS的技术?
如果有直接的方式来确定这一点,那简直是真棒。
我也在想如何有在Javascript技巧,以确定你在...上运行的浏览器是否有用于确定像Intel汇编低层次的语言操作系统,甚至CPU拱类似的技术?
谢谢, Chenz
什么是在运行时确定以汇编语言运行OS的技术?什么是在运行时确定以汇编语言运行OS的技术?
如果有直接的方式来确定这一点,那简直是真棒。
我也在想如何有在Javascript技巧,以确定你在...上运行的浏览器是否有用于确定像Intel汇编低层次的语言操作系统,甚至CPU拱类似的技术?
谢谢, Chenz
CPU架构将是下一个要不可能确定。机器码在CPU架构上差别很大,因此编写检测代码非常困难,它不会简单地在除一个架构之外的所有架构上崩溃。事实上,您可以考虑将汇编(和机器代码)作为不同CPU架构上完全不同的语言 - 任何可以探测的东西,必须基本上是machine code polyglot。这就是说,如果你知道你在的某些味道的x86,你可能可以使用CPUID指令获取有关处理器功能的信息。您也可以读取控制寄存器来确定您是否处于64位模式。
至于检测OS,这也是相当困难的。不同的操作系统有不同的系统调用入口点,尝试使用错误的操作系统入口点只会导致崩溃(实际上,Windows甚至会将系统调用入口点的地址从一个引导到另一个引导)。您可能能够探测窗口的TIB - 但任何企图访问FS:[0x0]
可以在其他操作系统也崩溃。
一般来说,当你编写汇编你应该知道你是什么样的系统上。如果您需要可移植性,请使用C语言或其他高级语言编写。
不,没有机器代码可以让你这样做。你可以使用为不同的体系结构提供几种不同的shellcode,每次传播时随机挑选一个。如果它成功运行,它会感染机器,但如果它是垃圾,那么您的进程可能因发布非法指令而被杀死,并且用户可以用健康的机器继续生活。
通常不能可靠地确定在C(++)或汇编语言程序的OS。
您可以使用它的一些功能,这些功能在这些不同的操作系统版本,像在Windows GetSystemInfo()
/GetNativeSystemInfo()
可用相同的操作系统不同的“兼容”版本之间的区别,但这些都是不可用的DOS,Linux的和其他操作系统。
这是很难找出一个汇编语言子程序,因为在不同的操作系统有正在调用OS功能的不同方式,如果你的操作系统做正确,你的程序崩溃。为了防止它崩溃,你需要安装某种异常或信号处理程序,但这也是操作系统特定的。
从通用CPU寄存器的内容中推断操作系统也是不可靠的,因为它们的值不能保证以某种方式反映操作系统,即使在某些情况下它们碰巧可能会在将来发生变化,包括将来当您更新操作系统时(例如安装安全补丁)。
您可以用C的system()
函数执行shell命令如ver
for Windows和uname -a
用于Linux,但没有可移植的方法来提取在控制台窗口此命令的输出,并复制它放回程序进行分析。
让我直截了当地说:你正在编写程序集并且不知道你在运行什么操作系统? – Stu
为什么你需要这样做? – bdonlan
@bdonlan:病毒编写是最明显的 – James