Pourquoi ne pouvons-nous pas comprendre le contenu d'un fichier binaire après avoir compilé?


11

Pour autant que je sache, chaque programme se compose d'un pack d'instructions du processeur avec des variables de données spécifiques (float, int, char ...) pour travailler sur les registres du processeur .

Donc, la première chose à laquelle j'ai pensé (il y a longtemps) est que si vous savez que la valeur ASCII de %¨#$¨#(juste un exemple aléatoire) pourrait être interprétée comme l'adresse du registre de pointeur de pile (juste un exemple) d'un x86 processeur. Si cela est vrai, chaque fois que vous trouvez cette valeur "illisible" lors de la lecture du contenu d'un fichier binaire, vous pouvez interpréter que le registre de pointeur de pile est utilisé pour gérer certaines variables de données.

Malheureusement, cela ne se produit pas. Ci-dessous, un exemple du contenu du ping.exeprogramme de Windows ouvert avec notepad.exe:

Ping.exe vu dans le Bloc-notes MS

C'est un fichier binaire et ses données sont incompréhensibles pour nous les humains (elles sont compréhensibles pour les machines). Cela n'a de sens pour personne même s'ils connaissent le code d'assemblage (le plus bas niveau de langage machine).

Donc, si j'ai tout compris correctement, quelqu'un pourrait-il expliquer

  1. Pourquoi un code binaire ne peut pas revenir au code Assembly dans la mesure où ils sont, en profondeur, la même chose?
  2. Si l'on peut comprendre le code assembleur, pourquoi le binaire compilé résultant de ce code n'est-il plus "lisible"?

12
Vous pouvez, vous avez juste besoin d'un démonteur .
David Schwartz

Je peux donc démonter n'importe quel fichier .exe ??? Je savais juste que cela fonctionne avec du code managé ...
Diogo

13
Vous pouvez démonter tout exécutable. Si vous pouvez donner un sens à la sortie démontée, c'est une autre histoire.
David Schwartz

5
La compilation ou l'assemblage supprime de nombreuses informations importantes pour l'homme telles que les noms de variables, les étiquettes de branche, etc. Le désassemblage obtient le flux d'instructions, mais vous avez encore beaucoup à comprendre.
mpez0

1
L' obscurcissement du code peut également entraver le démontage.
math

Réponses:


13

Premièrement, les registres n'ont pas d'adresse. Chaque instruction dans n'importe quel langage d'assemblage se traduit par un opcode. Les codes d'opération dans x86 peuvent être un, deux, trois ou même plus d'octets (dans certains autres processeurs, ils sont de «largeur fixe»). Habituellement, l'opcode identifie l'instruction, le mode d'adressage et les registres impliqués. Le "mode d'adressage" détermine si le CPU a besoin de plus que l'opcode, c'est-à-dire que le mode d'adressage "immédiat" signifie qu'il y a des données supplémentaires juste après (ou "immédiatement après") l'instruction pour cette instruction - les modes d'adressage "absolus" signifient qu'un l'adresse mémoire suit l'instruction et est utilisée par cette instruction.

Vous pouvez trouver l'opcode de quelque chose de similaire MOV AL,SPou similaire, puis le rechercher. x86 a beaucoup d'instructions qui fonctionnent sur le pointeur de pile.

Mais s'il vous plaît, veuillez cesser d'utiliser le Bloc-notes et utiliser un éditeur hexadécimal à la place. Je recommanderais HxD, bien qu'il y en ait beaucoup d'autres.

Et @David Schwartz a raison. Un désassembleur parcourra un fichier et traduira les opcodes en texte lisible. Ce que vous voulez faire est totalement possible.

Cependant, vous devez savoir où commencent les instructions dans le fichier car si vous commencez à la mauvaise adresse, certaines données qui devraient être les "opérandes" des opcodes (telles que les instructions qui prennent une adresse pour un opérande ou un "argument") pourraient être mal interprété comme opcodes. Sachant cela, il faut connaître le format de l'exécutable, qui est pour Windows le format "Portable Executable" ou PE (et est souvent ELF pour les systèmes Linux). Je suis sûr qu'il y a des désassembleurs qui comprennent le PE, etc., mais je n'en connais aucun.


1
L'IDA est l'un des dissembleurs de PE les plus courants. Fonctionne également avec les fichiers Linux et Mac. La version 5.0 est toujours disponible en tant que freeware
Scott Chamberlain

1
> si vous commencez à la mauvaise adresse,… pourrait être mal interprété. C'est pourquoi toutes les occurrences de %¨#$¨#ne seront pas nécessairement une référence au pointeur de pile; ce pourrait être juste le milieu de deux commandes différentes : _3p%¨#et $¨#b5F( _3p   %¨#$¨#   b5F).
Synetech

12

Donc, si j'ai tout compris correctement

Pas assez.

C'est un fichier binaire et ses données sont incompréhensibles pour nous les humains

En règle générale, un fichier binaire est incompréhensible pour l'homme et la machine, en particulier lorsque le but du fichier est inconnu. Notez que tous les fichiers binaires ne sont pas des fichiers exécutables. De nombreux fichiers binaires sont des fichiers de données qui ne contiennent aucune instruction machine. C'est pourquoi les extensions de fichiers sont utilisées pour nommer les fichiers (dans certains systèmes d'exploitation). Le . L' extension com a été utilisée par CP / M pour désigner un fichier exécutable. Le . L' extension exe a été ajoutée par MS-DOS pour désigner un autre format de fichier exécutable. * nixes utilise l'attribut execute pour indiquer quels fichiers peuvent être exécutés, bien qu'il puisse s'agir d'un script ou d'un code.

Comme déjà mentionné par d'autres, les fichiers binaires, qui contiennent des nombres, doivent être visualisés par un programme de vidage hexadécimal ou un éditeur hexadécimal et non par une visionneuse de texte.

il y a un exemple du contenu du programme ping.exe

Ce fichier est en fait un programme déplaçable et toutes les données de ce fichier ne représentent pas le code machine. Il y a des informations sur le programme telles que les bibliothèques dynamiques dont il a besoin, les routines qui doivent être liées, les exigences de pile et de mémoire de programme et de données, et le point d'entrée du programme. Les opérandes d'adresse dans le fichier peuvent être des valeurs relatives qui doivent être calculées en valeurs absolues ou des références qui doivent être résolues.

Le "fichier programme" auquel vous pensez probablement s'appelle un fichier image binaire ou un vidage de la mémoire programme. Un tel fichier ne contiendrait que du code machine et des données, avec toutes les références d'adresse correctement définies pour l'exécution.

même s'ils connaissent le code d'assemblage (le plus bas niveau de langage machine).

Le langage d'assemblage n'est pas le même que le langage machine . Le processeur typique (comme pour exclure les ordinateurs de haut niveau) accepte le code machine en entrée, une instruction à la fois. Les opérandes sont soit des registres, soit des adresses de mémoire numérique. Le langage d'assemblage est un langage de niveau supérieur qui peut utiliser des étiquettes symboliques pour les emplacements et les variables des instructions, ainsi que remplacer les codes d'opération numériques par des mnémoniques. Un programme en langage assembleur doit être converti en langage / code machine avant de pouvoir être exécuté (généralement par des utilitaires appelés assembleur, éditeur de liens et chargeur).

L'opération inverse, le désassemblage, peut être effectuée sur des fichiers de programme avec un certain succès et une perte d'informations symboliques. Le démontage d'un vidage de mémoire ou d'un fichier image de programme est plus d'essai et d'erreur, car les emplacements de code et de données doivent être identifiés manuellement.

BTW il y a des personnes qui peuvent lire et coder le code machine (numérique). Bien sûr, cela est beaucoup plus facile sur un processeur ou un microcontrôleur 8 bits qu'un processeur CISC 32 bits avec une douzaine de modes d'adresse mémoire.


3

Vous ne pouvez pas voir l'encodage approprié et prévu d'un fichier binaire via le Bloc-notes. Veuillez le consulter pour référence future. La plupart des programmes d'édition de texte n'analysent pas les formats de codage binaires et sont censés analyser la mise en forme du code de caractères ASCII.

Ainsi, l'ouverture d'un fichier binaire dans un éditeur de texte produira des caractères ASCII équivalents qui n'ont aucun sens du format d'origine des données binaires analysées par l'éditeur de texte. Comme mentionné, les éditeurs hexadécimaux, et certains ont des fonctionnalités binaires, pour afficher le contenu au format binaire pur.

Vous avez tort que le contenu d'un fichier binaire ne puisse pas être compris. Bien qu'ils soient difficiles, et dans les architectures informatiques modernes extrêmement difficiles à démonter manuellement du binaire seul en instructions appropriées reconnues par le CPU pour l'exécution (ou CPU émulé / virtuel), etc., cela peut être fait.

Comment pensez-vous que les émulateurs sont programmés? Le développeur aurait besoin de connaître les opcodes pour pouvoir programmer le système fictif afin qu'il reconnaisse et se comporte comme le ferait le matériel réel d'une certaine manière. Les documentations expliquent de nombreuses architectures de CPU, et même les GPU en ont (bien que plus secrètes).

Une autre chose à noter est qu'au niveau le plus bas, bien que corrélatif, les "données binaires" ne sont pas vraiment un tas de zéros et de uns, mais des tensions hautes et basses amplifiées / commutées à travers un circuit électrique en tant que courant.

Le binaire est généralement de 1: 1 avec cela, il est donc très logique d'utiliser le système numérique pour cela.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.