сборка на машинах X86, Windows vs Linux - PullRequest
7 голосов
/ 24 июля 2010

Они одинаковые?

Более длинная версия:

Скажем, я написал в сборке на машине с Windows небольшое приложение, которое все, что он делает, это добавляет 1 + 1 и сохраняет его в регистре. ПОТОМ, я пишу точно такой же код на машине Linux. Будет ли это работать?

Я думаю, что да, потому что на аппаратном уровне это та же самая машина, поэтому «язык аппаратного обеспечения» (простите за неточность) будет таким же.

Так что я думаю, что вирус, нацеленный на Windows, но написанный на ассемблере, не будет просто вирусом Windows.

Ответы [ 10 ]

11 голосов
/ 24 июля 2010

Вирус наверняка должен взаимодействовать с операционной системой и использовать ее API. Следовательно, он сильно зависит от платформы.

Кроме того, исполняемый файл также имеет заголовок, и это будет зависеть от целевой ОС. Если вы создадите более или менее пустой EXE-файл в Windows, он не будет работать (даже не запускаться) в Linux.

9 голосов
/ 24 июля 2010

Да и нет.

Небольшой фрагмент, который добавляет 1 + 1 и сохраняет его в регистре, будет точно таким же машинным кодом, то есть код, который выполняется на процессоре, являетсяТо же самое, независимо от операционной системы.

Однако вам нужно окружить этот код другими битами, которые взаимодействуют с ОС, чтобы сделать вашу программу значимой - вы никогда не узнаете, что ваш код действительно правильно хранится 2в eax, если он не выводится, например, куда-либо.

Интересно, что проекты, такие как Wine, допускают межплатформенную совместимость, предоставляя в Linux те же API-вызовы, которые программа ожидает найти под Windows, а также предоставляя соответствующую логику, чтобы позволить Linux правильно декодировать исполняемый файл Windows.Таким образом, с поддержкой Wine некоторые вирусы Windows могут фактически работать под Windows.Это может потребовать некоторой работы, но вы можете сделать это.

И нет, Wine не нужно перекомпилировать программы Windows - он фактически запускает машинный код, хранящийся в EXE-файлах, непосредственно впроцессор.

5 голосов
/ 24 июля 2010

программы, написанные на ассемблере на окнах, не совместимы в двоичном формате с Linux ... вам нужно скомпилировать (собрать) их снова на Linux, но имейте в виду, что между ассемблерами есть различия ... они по-разному обрабатывают, например, части для объявлениякод, данные, bss

execs windoes не работают на linux (вы можете запустить их в Wine, но они будут в песочнице)

2 голосов
/ 24 июля 2010

Сам язык почти такой же, но инструкции оператора другие.Учебное пособие по http://asm.sourceforge.net/intro/hello.html имеет довольно хорошее объяснение этого.

section    .text
    global _start           ;must be declared for linker (ld)

_start:                 ;tell linker entry point

    mov edx,len ;message length
    mov ecx,msg ;message to write
    mov ebx,1   ;file descriptor (stdout)
    mov eax,4   ;system call number (sys_write)
    int 0x80    ;call kernel

    mov eax,1   ;system call number (sys_exit)
    int 0x80    ;call kernel

section .data

msg db  'Hello, world!',0xa ;our dear string
len equ $ - msg         ;length of our dear string

Это отличается от программы DOS hello world из-за особенностей ОС (например, int 0x80).

1 голос
/ 24 июля 2010

Инструкции x86 будут делать то же самое.

Но расположение вещей в памяти будет другим и то, к чему ваш код сможет получить доступ. Службы операционной системы будут отличаться от того, как вы их вызываете.

Так что, если бы вы могли получить одинаковый двоичный код на обоих, вы могли бы, например, написать код, чтобы сложить все числа от 1 до 100, и это сработало бы, но механизм распечатки этого мог бы значительно отличаться.

1 голос
/ 24 июля 2010

Язык ассемблера во многом такой же и похожий. Однако ни Windows, ни Linux не будут пытаться выполнить произвольный файл. Большинство современных операционных систем отказывается выполнять программу, если у нее нет подходящих исполняемых заголовков (например, PE или ELF).

В Windows файл должен иметь правильное расширение (например, .exe, .dll, .com), а файл должен иметь формат, соответствующий формату Portable Executable (PE), прежде чем Windows даже попытается выполнить файл.

В Linux файл должен соответствовать формату ELF (Исполняемый и Связываемый формат) и иметь бит разрешения на выполнение (может быть установлен / снят с помощью chmod).

На практике это означает, что Windows, которая не распознает формат ELF, откажется выполнять программу Linux; и Linux откажется выполнять программу PE / Windows, если у вас нет Wine. Вирус, написанный на ассемблере, необходимо пересобрать (запустить через ассемблер) в правильный исполняемый формат (PE или ELF), соответствующий ОС.

После этого возникает проблема различий между вызовами функций между Windows и Linux (и даже между разными версиями Windows и разными версиями Linux); также различный набор системных вызовов API и различные методы для выполнения системных вызовов даже для самых простых вещей. На практике практически невозможно написать ассемблерный код, переносимый между Windows и Linux, поскольку даже базовые операции, такие как печать ввода / вывода, отличаются.

1 голос
/ 24 июля 2010

Несмотря на то, что вы, возможно, пишете сборку x86, вы все равно будете использовать другой ассемблер в зависимости от используемой операционной системы, и они будут иметь разные функции, поэтому запись на ассемблере в Windows не обязательно будет одинаковой как то, что вы написали бы в Linux, хотя я бы предположил, что они будут довольно похожи.

0 голосов
/ 24 июля 2010

Это тот же процессор и, как следствие, те же инструкции для добавления 1 + 1 да.

, и вполне вероятно, что вы можете использовать достаточно похожие инструменты, чтобы иметь по крайней мере тот же источник сборкидля этой инструкции.Но формат исполняемого файла, который содержит не только байты, которые должны быть выполнены, но и другие вещи, отличаются в разных операционных системах.Различные инструменты используются для создания различных исполняемых файлов / контейнеров.Это если вы пытаетесь выполнить полную программу.Если у вас есть вирус или другая злая программа, которая использует преимущества некоторого malloc в операционной системе, где есть способ заставить ОС выполнять код, то байты этого кода не будут содержать эту исполняемую оболочку, эти байтытолько инструкции, которые вы хотите запустить.Таким образом, в этом смысле они снова будут теми же байтами, но эксплойт для проникновения в операционную систему (или драйвер), скорее всего, зависит от операционной системы, а ваш эксплойт будет зависеть от операционной системы.

0 голосов
/ 24 июля 2010

Сборка для всех операционных систем может быть одинаковой, при условии, что есть уровень переносимости с реализациями для каждой поддерживаемой операционной системы.

Хотя, если вы планируете использовать супер-совместимые двоичные файлы, как я..Формы ELF и PE полностью отличаются друг от друга, и это не позволит запускать один и тот же исполняемый файл в разных операционных системах.Хотя это можно решить, написав портативный загрузчик программ.

0 голосов
/ 24 июля 2010

Ниже приведены цитаты из: Введение в Linux Язык ассемблера Intel

  • В других операционных системах все аналогично.Например, при использовании компиляторов Microsoft или Turbo исходные файлы ассемблера имеют суффикс .asm, объектные файлы имеют суффикс .obj и т. Д.

  • NASM isдоступно как для Unix, так и для MS Windows.В этом отношении даже как может использоваться в Windows, поскольку он является частью пакета gcc и доступен для Windows под именем cygwin.

...