Question

Je ne connais pas bien la magie du compilateur. Le fait de transformer le code lisible par l'homme (ou pas vraiment Instructions de montage lisibles) en code machine est, pour moi, la science de fusée combiné avec la sorcellerie.

Je restreindra le sujet de cette question à executables Win32 (.exe). Quand j'ouvre ces fichiers dans un lecteur spécialisé, je peux trouver des chaînes (généralement 16b par caractère) dispersés à différents endroits, mais le reste est juste ordures. Je suppose que la partie illisible (majorité) est le code de la machine (ou peut-être des ressources, telles que des images, etc ...).

est-il un moyen simple de lire le code de la machine? Ouverture de l'exe comme un flux de fichier et le lire octet par octet, comment pourrait-on transformer ces octets individuels en Assemblée? Y at-il une correspondance directe entre ces octets instruction et l'instruction de l'Assemblée?

Comment le .exe écrit? Quatre octets par instruction? Plus? Moins? Je l'ai remarqué certaines applications peuvent créer des fichiers exécutables comme ça: par exemple, dans ACD Voir, vous pouvez exporter une série d'images dans un diaporama. Mais cela ne doit pas nécessairement être un diaporama SWF, ACD See est également capable de produire des présentations Executable. Comment cela se fait?

Comment puis-je comprendre ce qui se passe à l'intérieur d'un fichier EXE?

Était-ce utile?

La solution

OllyDbg est un outil génial qui démonte un fichier EXE dans des instructions lisibles et vous permet d'exécuter les instructions de un par un. Il vous indique également quelles fonctions API utilise le programme et si possible, les arguments qu'il fournit (tant que les arguments se trouvent sur la pile).

D'une manière générale, les instructions CPU sont de longueur variable, certains sont un octet, d'autres sont à deux, quelque trois, environ quatre, etc. Cela dépend principalement du type de données que l'instruction attend. Certaines instructions sont généralisées, comme « mov » qui indique à l'unité centrale de traitement pour transférer des données à partir d'un registre de CPU à un endroit en mémoire, ou vice versa. En réalité, il y a beaucoup de différents « mov » instructions, celles pour le traitement de 8 bits, 16 bits, les données 32 bits, les données pour le déplacement de différents registres et ainsi de suite.

Vous pouvez chercher le Dr Paul Carter PC Langue Assemblée Tutoriel qui est un livre de niveau d'entrée libre qui parle de la façon dont le montage et le processeur Intel 386 fonctionne. La majeure partie est applicable même jour moderne consommation CPU Intel.

Le format EXE est spécifique à Windows. Le point d'entrée (à savoir la première instruction exécutable) se trouve généralement au même endroit dans le fichier EXE. Il est tout un peu difficile à expliquer à la fois, mais les ressources que j'ai fournies devrait aider à guérir au moins une partie de votre curiosité! :)

Autres conseils

Vous avez besoin d'un désassembleur qui transformera le code de la machine en langage assembleur. Cette lien Wikipedia décrit le processus et fournit des liens vers désassemblé libres. Bien sûr, comme vous dites que vous ne comprenez pas le langage d'assemblage, ce ne peut pas être très instructif - qu'est-ce que vous essayez de faire exactement ici

Le fichier exécutable que vous voyez est Microsofts PE format (Portable Executable). Il est essentiellement un conteneur, qui contient un système d'exploitation des données spécifiques sur un programme et les données de programme lui-même divisé en plusieurs sections. Pour exemple de code, les ressources, les données statiques sont stockées dans des sections séparées.

Le format de la section dépend de ce qui est en elle. La section de code contient le code de la machine selon l'architecture cible exécutable. Dans les cas les plus courants est ce Intel x86 ou AMD-64 (comme EM64T) pour les fichiers binaires Microsoft PE. Le format du code de la machine est CISC et trouve son origine vers le 8086 et plus tôt. L'aspect important du SCRC est que sa taille d'instruction n'est pas constante, vous devez commencer à lire au bon endroit pour obtenir quelque chose de précieux sortir. Intel publie de bons manuels sur le jeu d'instructions x86 / x64.

Vous pouvez utiliser un désassembleur pour voir le code machine directement. En combinaison avec les manuels que vous pouvez deviner le code source la plupart du temps.

Et puis il y a MSIL EXE: Les exécutables .NET tenant Microsofts Intermediate Language, ceux-ci ne contiennent pas de code spécifique de la machine, mais le code CIL .NET. Les spécifications qui sont disponibles en ligne à l'ECMA.

Ceux-ci peuvent être considérés avec un outil tel que réflecteur.

Le contenu du fichier EXE sont décrits dans Portable Executable. Il contient le code, les données et instructions pour OS sur la façon de charger le fichier.

Il y a un mappage 1: 1 entre le code machine et l'assemblage. Un programme de désassembleur effectuera l'opération inverse.

Il n'y a pas un nombre fixe d'octets par instruction sur i386. Certains sont un seul octet, certains sont beaucoup plus.

Vous pouvez utiliser le débogage à partir de la ligne de commande, mais qui est difficile.

C:\WINDOWS>debug taskman.exe
-u
0D69:0000 0E            PUSH    CS
0D69:0001 1F            POP     DS
0D69:0002 BA0E00        MOV     DX,000E
0D69:0005 B409          MOV     AH,09
0D69:0007 CD21          INT     21
0D69:0009 B8014C        MOV     AX,4C01
0D69:000C CD21          INT     21
0D69:000E 54            PUSH    SP
0D69:000F 68            DB      68
0D69:0010 69            DB      69
0D69:0011 7320          JNB     0033
0D69:0013 7072          JO      0087
0D69:0015 6F            DB      6F
0D69:0016 67            DB      67
0D69:0017 7261          JB      007A
0D69:0019 6D            DB      6D
0D69:001A 206361        AND     [BP+DI+61],AH
0D69:001D 6E            DB      6E
0D69:001E 6E            DB      6E
0D69:001F 6F            DB      6F

Si c'est comme étranger à vous comme il semble, je ne pense pas qu'un débogueur ou désassembleur va aider - que vous devez d'abord apprendre la programmation assembleur; étudier l'architecture du processeur (beaucoup de téléchargement de documentation d'Intel). Et puis, puisque la plupart du code machine est généré par les compilateurs, vous aurez besoin de comprendre comment les compilateurs générer du code -. La façon la plus simple d'écrire beaucoup de petits programmes, puis de les démonter pour voir ce que votre C / C ++ est transformé en

Quelques livres qui vous aideront à comprendre: -

Pour avoir une idée, mettre un point d'arrêt sur un code intéressant, puis allez dans la fenêtre CPU.

Si vous êtes intéressé plus, il est plus facile de compiler des fragments courts avec Free Pascal en utilisant le paramètre -al.

FPC permet de produire l'assembleur généré dans une multitude de formats assembleur (TASM, MASM, GAS) en utilisant le paramètre -A, et vous pouvez avoir le code pascals d'origine intercalées dans les commentaires (et plus) pour CrossReference facile.

Parce qu'il est compilateur assembleur généré, par opposition à assembleur de .exe démontées, il est plus symbolique et plus facile à suivre.

le format Win32 exe sur MSDN

Je vous suggère de prendre un peu de code source Windows C et construire et démarrer le débogage dans Visual Studio. Passer à l'affichage de l'étape de démontage et sur les commandes. Vous pouvez voir comment le code C a été compilé en code machine -. Et regarder courir étape par étape

Juste relatif à cette question, personne lire encore des choses comme CD 21?

Je me suis souvenu Sandra Bullock dans un spectacle, la lecture en fait un plein écran de nombres hexadécimaux et comprendre ce que fait le programme. Un peu comme la version actuelle de la lecture du code de Matrix.

si vous ne lisez des choses comme CD 21, comment rappelez-vous les différentes combinaisons différentes?

Tant votre curiosité et votre niveau de compréhension est exactement où je me trouvais à un moment donné. I très Code: Le langage caché du matériel informatique et logiciels . Ce ne sera pas répondre à toutes les questions que vous posez ici, mais il éclairera quelques-uns des aspects magiques tout à fait noir d'ordinateurs. Il est un livre épais, mais très facile à lire.

ACD Voir prend probablement avantage du fait que les fichiers .EXE ne pas le contrôle d'erreur sur la longueur du fichier ou quoi que ce soit au-delà de la longueur de la partie attendue du fichier. En raison de cela, vous pouvez créer un fichier .EXE qui ouvrira son auto et charger tout au-delà d'un point donné que les données. Ceci est utile car vous pouvez alors faire un .EXE qui fonctionne sur un ensemble de données en tout virement de bord que les données sur la fin d'un .EXE convenablement écrit

(Je ne sais pas exactement ce que ACD See est prendre pour que avec un gros grain de sel, mais je faire savent que certains programmes sont générés de cette façon.)

Familiarité avec l'assemblage de bas niveau (et je veux dire l'assemblage de bas niveau, pas des « macros » et que le taureau) est probablement un must. Si vous voulez vraiment lire le code de la machine elle-même directement cru, vous généralement utiliser un éditeur hexadécimal pour cela. Pour comprendre ce que les instructions font, cependant, la plupart des gens utiliseraient un désassembleur pour le convertir dans les instructions de montage appropriées. Si vous êtes l'un de la minorité qui veut comprendre le langage de la machine elle-même, je pense que vous voulez que le Intel® 64 et IA-32 Architectures Logicielles Manuels de développeur . Volume 2 couvre spécifiquement le jeu d'instructions, qui se rapporte à votre requête sur la façon de lire le code de la machine elle-même et la façon dont concerne l'assemblage lui.

Chaque instruction est en code machine maintenu dans une zone de mémoire spéciale dans le cpu. Premiers livres ont donné le code INTEL de la machine pour leurs instructions, donc il faut essayer d'obtenir ces livres pour comprendre. Il est évident que la machine aujourd'hui CODEIS pas facilement disponibles. Ce qui serait bien est un programme qui peut inverser hex au code de la machine. Ou faire manuellement _ !!  fastidieux

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top