7

他们是一样的吗?

更长的版本:

假设我在 Windows 机器上在汇编中编写了一个小应用程序,它所做的只是添加 1+1 并将其存储在寄存器中。然后,我在 Linux 机器上编写完全相同的代码。它会起作用吗?

我想是的,因为在硬件级别,它是同一台机器,所以“硬件语言”(请原谅不精确)是相同的。

所以我认为一个针对 windows 的病毒但用汇编编写的不会只是 windows 病毒。

4

10 回答 10

11

病毒肯定需要与操作系统交互,并使用其 API。因此,它高度依赖于平台。

此外,可执行文件还具有标头,这取决于目标操作系统。如果您要在 Windows 中创建一个或多或少为空的 EXE 文件,这将无法在 Linux 下运行(甚至无法启动)。

于 2010-07-23T21:04:11.810 回答
9

是和不是。

添加 1+1 并将其存储在寄存器中的小片段将是完全相同的机器代码——也就是说,无论操作系统如何,在处理器上运行的代码都是相同的。

但是,您需要将该代码与与操作系统交互的其他位包围以使您的程序有意义 -例如,如果您的代码没有输出到某个地方,您将永远不会知道您的代码实际上是否正确存储2eax

有趣的是,像 Wine 这样的项目通过在 Linux 下提供程序在 Windows 下可以找到的相同 API 调用来实现跨平台互操作性,并提供适当的逻辑以允许 Linux 正确解码 Windows 可执行文件。因此,有了 Wine 的支持,一些 Windows 病毒实际上可以在 Windows 下运行。这可能需要一些工作,但你可以做到这一点。

不,Wine 不需要重新编译 Windows 程序——事实上,它确实可以直接在处理器上运行存储在 EXE 中的机器代码。

于 2010-07-23T21:28:55.653 回答
5

在 windows 上用汇编程序编写的程序与 linux 不兼容...您需要在 linux 上再次编译(组装)它们,但请记住,汇编程序之间存在差异..它们以不同的方式处理例如用于声明代码、数据的部分, bs

windows execs 不能在 linux 上本地运行(你可以在 wine 中运行它们,但它们将被沙盒化)

于 2010-07-23T21:07:05.407 回答
3

语言本身几乎相同,但操作员说明不同。http://asm.sourceforge.net/intro/hello.html上的教程对此有很好的解释。

部分 .text
    global _start ;必须为链接器(ld)声明

_start: ;告诉链接器入口点

    mov edx,len ;消息长度
    mov ecx,msg ;要写入的消息
    mov ebx,1 ;文件描述符(标准输出)
    mov eax,4 ;系统调用号(sys_write)
    int 0x80 ;调用内核

    mov eax,1 ;系统调用号(sys_exit)
    int 0x80 ;调用内核

节 .data

msg db 'Hello, world!',0xa ; 我们亲爱的字符串
len equ $ - msg ; 我们亲爱的字符串的长度

由于操作系统特定的东西(如 int 0x80),这与 DOS hello world 程序不同。

于 2010-07-23T21:11:21.863 回答
1

尽管您可能正在编写 x86 汇编,但您仍将使用不同的汇编器,具体取决于您使用的操作系统,并且它们将具有不同的功能,因此在 Windows 上使用汇编器编写不一定与您使用的相同会在 Linux 中编写,尽管我认为它们会非常相似。

于 2010-07-23T21:13:31.630 回答
1

汇编语言在很大程度上是相同和相似的。但是,Windows 和 Linux 都不会尝试执行任意文件。大多数现代操作系统拒绝执行程序,除非它具有适当的可执行头文件(例如 PE 或 ELF)。

在 Windows 中,文件需要具有正确的扩展名(例如 .exe、.dll、.com),并且文件的布局需要符合可移植可执行文件 (PE) 格式,然后 Windows 甚至会尝试执行文件。

在 Linux 中,文件需要符合 ELF 格式(可执行和可链接格式)并具有执行权限位(可以使用 chmod 设置/取消设置)。

实际上,这意味着不能识别 ELF 格式的 Windows 会拒绝执行 Linux 程序;除非你有 Wine,否则 Linux 将拒绝执行 PE/Windows 程序。用汇编语言编写的病毒需要重新汇编(通过汇编程序运行)为正确的可执行格式(PE 或 ELF)以适应操作系统。

之后,你就会遇到 Windows 和 Linux 之间函数调用约定不同的问题(甚至不同版本的 Windows 和不同版本的 Linux 之间);即使是最基本的事情,也有不同的系统调用 API 和不同的方法来进行系统调用。实际上,编写在 Windows 和 Linux 之间可移植的汇编代码几乎是不可能的,因为即使是打印输入/输出等基本操作也是不同的。

于 2010-07-23T21:24:43.930 回答
1

x86 指令会做同样的事情。

但是东西在内存中的位置会有所不同,你的代码可以访问什么。操作系统服务会因您调用它们的方式而有所不同。

因此,如果您可以在两者上获得相同的二进制代码,那么您可以例如编写代码来将 1-100 的所有数字相加,这将起作用,但打印出来的机制会有很大差异。

于 2010-07-23T21:25:53.093 回答
0

以下引自:Linux 英特尔汇编语言简介

  • 在其他操作系统下情况类似。例如,使用 Microsoft 或 Turbo 编译器,汇编语言源文件具有后缀 .asm,目标文件具有后缀 .obj 等。

  • NASM可用于 Unix 和 MS Windows。就此而言,即使可以在 Windows 下使用,因为它是gcc包的一部分,并且可以在名称 cygwin 下用于 Windows。

于 2010-07-23T21:22:00.553 回答
0

所有操作系统的程序集都可以相同,假设您支持的每个操作系统都有实现的可移植层。

但是,如果您像我一样计划使用超级兼容的二进制文件.. ELF 和 PE 格式彼此完全不同,它会阻止相同的可执行文件在不同的操作系统上运行。虽然这可以通过编写一个可移植的程序加载器来解决。

于 2010-07-23T21:24:09.907 回答
0

它是相同的处理器,因此执行 add 1+1 yes 的指令相同。

并且您很可能可以使用足够相似的工具来至少为该指令提供相同的汇编源。但是可执行文件格式,不仅包含要执行的字节,还包含其他内容,在操作系统之间是不同的。不同的工具用于创建不同的可执行文件/容器。也就是说,如果您正在尝试执行一个完整的程序。如果您有病毒或其他恶意程序利用操作系统中的某些 malloc 有一种方法可以让操作系统执行代码,那么该代码的字节将不包含此可执行包装器,这些字节是只是你想要运行的指令。所以从这个意义上说,它们将再次是相同的字节,但是进入操作系统(或驱动程序)的漏洞,

于 2010-07-23T21:28:04.713 回答