7
votes

Assemblage sur les machines X86, Windows VS Linux

sont-ils les mêmes?

Version plus longue:

Dites que j'ai écrit, en montage, sur une machine à Windows, une petite application que tout ce qu'elle fait est d'ajouter 1 + 1 et le stocke dans un registre. Ensuite, j'écris exactement le même code sur une machine Linux. Cela fonctionnerait-il?

Je pense que oui, car au niveau du matériel, c'est le même appareil, de sorte que la «langue du matériel» (pardonnez à l'inexactitude) serait la même.

Donc, je pense à un virus ciblant des fenêtres mais écrits dans l'assemblage ne serait que un virus Windows.


5 commentaires

Quelqu'un a lu quelque chose de Neal Stephenson!


Non, Neil Stephenson aurait suggéré un virus informatique qui peut vous donner une fièvre.


Je n'ai jamais entendu parler de Neal Stephenson, mais le cherchera la prochaine fois que je suis à la bibliothèque.


Question de suivi: J'apprendrait à apprendre les deux (à un degré élevé, au moins)? Ou sommes-nous des pommes et des oranges. Depuis les réponses jusqu'à présent, son acte de compilation qui génère une grande partie de la différence.


@Jason: Oui, si vous apprenez à écrire du code de montage pour Windows, vous connaissez beaucoup de code de montage d'écriture pour toute plate-forme. Mais si vous avez l'intention d'écrire un programme plus sophistiqué, vous aurez probablement besoin d'utiliser les API de la plate-forme, ce qui pourrait être très différent.


10 Réponses :


11
votes

Un virus devra très certainement interagir avec le système d'exploitation et utiliser son API. Par conséquent, il est fortement dépendant de la plate-forme.

De plus, un exécutable a également un en-tête, ce qui dépendra du système d'exploitation ciblé. Si vous créez un fichier EXE plus ou moins vide dans Windows, cela ne fonctionnerait pas (pas même de départ) sous Linux.


2 commentaires

Les personnes ont écrit des vers de la preuve de concept et des virus qui exploitent une plate-forme inter-plate-forme, que ce soit en tirant parti d'un environnement de haut niveau qui peut être largement présent ou en faisant de la détection de la plate-forme et en exécutant la partie appropriée d'une charge utile multi-plateformes. 2600 avait un article sur un verso il y a 10 ans et j'ai vu un livre blanc depuis lors.


Le ver Original Morris en 1988 était multi-plate-forme, courant sur VAX BSD et sur des soleils.



5
votes

Les programmes écrits dans l'assembleur sous Windows ne sont pas compatibles binaires avec Linux ... Vous devez compiler (assembler)-les à nouveau sur Linux, mais gardez à l'esprit qu'il existe des différences entre les assembleurs. Ils manipulent différemment par exemple de pièces pour déclarer Code, données, BSS

Windoes Execs ne fonctionne pas de manière native sur Linux (vous pouvez les exécuter dans du vin, mais ils vont être de bac à sander)


0 commentaires

3
votes

La langue elle-même est à peu près la même chose, mais les instructions de l'opérateur sont différentes. Le tutoriel de http://asm.sourceforge.net/intro/hello.html A une très bonne explication de cela.

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


2 commentaires

Que signifie "les instructions de l'opérateur sont différentes" signifie?


@stakx - Je pense qu'il voulait dire "instructions du système d'exploitation".



1
votes

Bien que vous puissiez écrire un assembleur X86, vous utiliserez toujours un assembleur différent selon lequel le système d'exploitation que vous utilisez, et ils auront des fonctionnalités différentes, donc écrire dans l'assembleur sous Windows ne serait donc pas nécessairement la même chose. Comme ce que vous écririez sous Linux, je suppose qu'ils seraient plutôt similaires.


1 commentaires

Les caractéristiques de l'assembleur n'auront pas d'importance, car la traduction de l'assemblage au code de la machine devrait être la même. C'est l'autre chose, comme le format de fichier et les appels système, qui seront différents.



0
votes

Les citations suivantes sont des citations de: Introduction à Linux Intel Assembly Language

  • Les choses sont similaires dans d'autres systèmes d'exploitation. À l'aide des compilateurs Microsoft ou Turbo, par exemple, les fichiers source de la langue d'assemblage ont le suffixe .asm, les fichiers d'objets ont le suffixe .Obj, etc.

  • nasme est disponible pour les fenêtres UNIX et MS. Pour cette affaire, même comme peut être utilisé sous Windows, car il fait partie du package GCC et qui est disponible pour Windows sous le nom. Cygwin.


0 commentaires

0
votes

L'ensemble de tous les systèmes d'exploitation peut être identique, en supposant qu'il existe une couche de portabilité avec des implémentations pour chaque système d'exploitation que vous prenez en charge.

Cependant, si vous planifiez des fichiers binaires super compatibles comme je le fais. Elf et PE -Formats sont tout à fait différents les uns des autres, ce qui empêchera la même exécutable d'exécuter sur différents systèmes d'exploitation. Bien que cela puisse être résolu en écrivant un chargeur de programme portable.


0 commentaires

1
votes

La langue d'assemblage est largement identique et similaire. Cependant, ni Windows ni Linux n'essaieraient d'exécuter un fichier arbitraire. Le système d'exploitation le plus moderne refuse d'exécuter un programme, sauf si elle dispose des en-têtes exécutables appropriés (par exemple PE ou ELF).

Dans Windows, un fichier doit avoir la bonne extension (par exemple, .exe, .dll, .com) et le fichier doit être conforme au format exécutable portable (PE) avant que Windows tente même d'exécuter le fichier.

sous Linux, un fichier doit être conforme au format ELF (format exécutable et lié) et avoir le bit d'autorisation d'exécution (peut être défini / non défini à l'aide de Chmod).

En pratique, cela signifie que Windows qui ne reconnaît pas le format Elf refuserait d'exécuter un programme Linux; Et Linux refusera d'exécuter un programme PE / Windows à moins que vous n'ayez de vin. Un virus écrit en montage devrait être réassemblé (être exécuté à travers l'assembleur) au format exécutable correct (PE ou ELF) en fonction du système d'exploitation.

Après cela, vous avez le problème de la convention différente des appels de fonction entre Windows et Linux (et même entre différentes versions de Windows et une version différente de Linux); Un ensemble différent d'appel d'appel système et différentes méthodes pour effectuer des appels de système pour même les choses les plus fondamentales. En pratique, il est presque impossible d'écrire un code d'assemblage portable entre Windows et Linux, car même des opérations de base telles que l'entrée d'impression / sortie sont différentes.


0 commentaires

1
votes

Les instructions X86 feront la même chose.

Mais où les choses sont situées en mémoire seront différentes et ce que votre code peut accéder. Les services du système d'exploitation seront différents car vous les invoquez.

Donc, si vous pouvez obtenir le même code binaire sur les deux, vous pouvez par exemple écrire le code pour ajouter tous les numéros de 1-100 et cela fonctionnerait, mais le mécanisme d'impression de celui-ci varierait considérablement.


0 commentaires

0
votes

C'est le même processeur et en conséquence les mêmes instructions pour faire votre ajout 1 + 1 Oui.

Et il est probablement possible que vous puissiez utiliser des outils suffisants similaires pour avoir la même source d'assemblage au moins pour cette instruction. Mais le format de fichier exécutable, qui contient non seulement les octets à exécuter, mais d'autres choses sont différentes entre les systèmes d'exploitation. Différents outils sont utilisés pour créer les différents fichiers / conteneurs exécutables. C'est si vous essayez d'exécuter un programme complet. Si vous avez un virus ou un autre programme maléfique qui tire parti de certains MALLOC dans le système d'exploitation où il existe un moyen d'obtenir le système d'exploitation d'exécuter du code, les octets de ce code ne contiennent pas ce wrapper exécutable, ces octets sont Juste les instructions que vous souhaitez exécuter. Donc, dans ce sens, ils seraient à nouveau les mêmes octets, mais l'exploitation d'entrer dans le système d'exploitation (ou un pilote) est probablement dépendante du système d'exploitation et votre exploitation serait dépendante du système d'exploitation.


0 commentaires

9
votes

oui et non.

Le petit extrait qui ajoute 1 + 1 et le stocke dans un registre va être exactement le même code de machine - c'est-à-dire que le code qui exécute sur le processeur est identique quel que soit le système d'exploitation.

Cependant, vous devez entourer ce code avec d'autres bits qui interagissent avec le système d'exploitation pour rendre votre programme significatif - vous ne sauriez jamais que votre code est bien stocké correctement 2 dans EAX < / code> s'il n'a pas été émis à quelque part, par exemple.

Fait intéressant, des projets tels que le vin permettent une interopérabilité inter-plate-forme en fournissant sous Linux les mêmes appels d'API que le programme s'attendrait à trouver sous Windows, ainsi que de fournir à la logique appropriée pour permettre à Linux de décoder correctement une exécutable Windows. Ainsi, avec support de vin, certains virus de Windows peuvent réellement exécuter sous Windows. Cela peut prendre du travail, mais vous pouvez y arriver.

et non, le vin n'a pas à recompiler les programmes Windows - il exécute en fait le code de la machine stocké dans les exès directement sur le processeur.


1 commentaires

Il y a des années, j'ai joué dans le monde de Warcraft sur une boîte Linux en utilisant du vin. Cela a fonctionné presque parfaitement, mais les jambes du personnage n'échoueraient pas correctement pour une raison quelconque.