блок на машинах X86, Windows по сравнению с Linux

Действительно ли они - то же?

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

Скажите, что я записал, в блоке, на машине окон, небольшое приложение, которое все он делает, добавляют 1+1, и хранит его в регистре. ЗАТЕМ я пишу тот же самый код на машине Linux. Это работало бы?

Я думаю да, потому что на аппаратном уровне, это - та же машина, таким образом, 'язык аппаратных средств' (прощают неточность) был бы тем же.

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

7
задан jason 23 July 2010 в 21:01
поделиться

10 ответов

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

руководители Windoes изначально не работают в Linux (вы можете запускать их в Wine, но они будут изолированы в песочнице)

5
ответ дан 6 December 2019 в 06:02
поделиться

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

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

11
ответ дан 6 December 2019 в 06:02
поделиться

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

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

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

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

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

1
ответ дан 6 December 2019 в 06:02
поделиться

Да и нет.

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

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

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

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

9
ответ дан 6 December 2019 в 06:02
поделиться

Сам язык почти такой же, но инструкции оператора разные. В руководстве по адресу 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 из-за особенностей ОС (например, int 0x80).

2
ответ дан 6 December 2019 в 06:02
поделиться

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

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

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

1
ответ дан 6 December 2019 в 06:02
поделиться

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

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

0
ответ дан 6 December 2019 в 06:02
поделиться

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

1
ответ дан 6 December 2019 в 06:02
поделиться

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

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

0
ответ дан 6 December 2019 в 06:02
поделиться

Ниже приведены цитаты из: Введение в Linux Intel Assembly Language

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

  • NASM доступен как для Unix, так и для MS Windows. Если уж на то пошло, то даже as можно использовать под Windows, поскольку он является частью пакета gcc, который доступен для Windows под именем cygwin.

0
ответ дан 6 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: