它们是相同的吗?
更长的版本:
假设我在Windows机器上用汇编语言写了一个小程序,它只是将1+1相加并将其存储在一个寄存器中。然后,我在Linux机器上编写完全相同的代码。它会工作吗?
我的想法是会,因为在硬件级别上,它是相同的机器,因此“硬件语言”(请原谅不精确)也将是相同的。
所以,我认为一个针对Windows的病毒,但用汇编语言编写的,不仅仅是一个Windows病毒。
它们是相同的吗?
更长的版本:
假设我在Windows机器上用汇编语言写了一个小程序,它只是将1+1相加并将其存储在一个寄存器中。然后,我在Linux机器上编写完全相同的代码。它会工作吗?
我的想法是会,因为在硬件级别上,它是相同的机器,因此“硬件语言”(请原谅不精确)也将是相同的。
所以,我认为一个针对Windows的病毒,但用汇编语言编写的,不仅仅是一个Windows病毒。
病毒一定需要与操作系统交互,并使用其API,因此高度依赖平台。
此外,可执行文件也有一个头部,这取决于目标操作系统。如果在Windows中创建一个空的EXE文件,则该文件在Linux下无法运行(甚至无法启动)。
section .text global _start ;必须为链接器(ld)声明这与DOS的hello world程序不同,因为它涉及到特定于操作系统的内容(如int 0x80)。
_start: ;告诉链接器入口点
mov edx,len ;消息长度 mov ecx,msg ;要写的消息 mov ebx,1 ;文件描述符(标准输出) mov eax,4 ;系统调用号(sys_write) int 0x80 ;调用内核
mov eax,1 ;系统调用号(sys_exit) int 0x80 ;调用内核
section .data
msg db 'Hello, world!',0xa ;我们亲爱的字符串 len equ $ - msg ;我们亲爱的字符串的长度
虽然您可能正在编写x86汇编语言,但根据您使用的操作系统,您仍将使用不同的汇编器,并且它们将具有不同的功能,因此在Windows上使用汇编语言编写的内容不一定与在Linux上编写的相同,尽管我认为它们应该是相当相似的。
接下来,你将面临Windows和Linux之间(甚至是不同版本的Windows和Linux之间)不同的函数调用约定问题;还有不同的系统调用API集和不同的方法来执行最基本的系统调用。实际上,编写一个在Windows和Linux之间可移植的汇编代码几乎是不可能的,因为即使像打印输入/输出这样的基本操作也是不同的。
x86指令将执行相同的操作。
但是,内存中的位置以及代码可以访问的内容将有所不同。 操作系统服务也会因为调用方式的不同而有所不同。
因此,如果您可以在两者上获得相同的二进制代码,则可以编写代码来将1-100的所有数字相加,这将起作用,但打印输出的机制将大不相同。
以下是来自《Linux Intel汇编语言入门》的引用:
在其他操作系统下情况类似。例如,使用Microsoft或Turbo编译器,汇编语言源文件的后缀名为.asm,目标文件的后缀名为.obj等。
NASM可用于Unix和MS Windows。事实上,甚至可以在Windows下使用as,因为它是gcc软件包的一部分,并且在cygwin下以该名称提供。
针对所有操作系统,汇编可以是相同的,只要有针对您支持的每个操作系统的可移植性层和实现即可。
但是,如果您计划创建类似于我一样的超级兼容二进制文件... ELF 和 PE 格式完全不同,这将防止相同的可执行文件在不同的操作系统上运行。但是,这可以通过编写便携式程序加载器来解决。
它是相同的处理器,因此执行加1+1的指令也是相同的。
而且很可能你可以使用相似的工具,至少对于那个指令来说,有相同的汇编源码。但可执行文件格式不同于操作系统之间包含的字节执行以及其他内容差异较大。不同的工具用于创建不同的可执行文件/容器。如果您尝试执行完整的程序,就会产生这种情况。如果您有病毒或其他恶意程序,利用操作系统中某些malloc的方式,在其中存在一种方法可以使操作系统执行代码,那么该代码字节将不包含此可执行包装器,这些字节只是要运行的指令。因此从这个意义上讲,它们将再次成为相同的字节,但用于进入操作系统(或驱动程序)的漏洞很可能依赖于操作系统,您的漏洞将依赖于操作系统。