120 votes

Existe-il des smart les cas d'exécution modification de code?

Pouvez-vous penser à une légitime (smart) utilise pour l'exécution de code (modification du programme de modifier son propre code à l'exécution)?

Les systèmes d'exploitation modernes semblent froncer les sourcils sur des programmes qui le font depuis, cette technique a été utilisée par les virus pour éviter la détection.

Tout ce que je pense est une sorte de moteur d'exécution d'optimisation qui permettrait de supprimer ou d'ajouter un code de savoir quelque chose au moment de l'exécution qui ne peut pas être connue au moment de la compilation.

118voto

Mackie Messer Points 3129

Il y a beaucoup de cas valables pour la modification de code. La génération de code au moment de l'exécution peut être utile pour:

  • Quelques machines virtuelles utilisation compilation JIT pour améliorer les performances.
  • Générer des fonctions spécialisées sur la mouche a longtemps été commun en infographie. Voir, par exemple, Rob Pike et Bart Locanthi et Jean-Reiser - Hardware-Software Compromis pour les Graphismes Bitmap sur le Blit (1984) ou de la présente publication (2006) par Chris Lattner sur l'utilisation par Apple de LLVM pour l'exécution code de spécialisation dans leur OpenGL pile.
  • Dans certains cas, logiciel de recours à une technique connue sous le nom de trampoline qui implique la création dynamique de code sur la pile (ou un autre lieu). Les exemples sont de GCC fonctions imbriquées et le signal mécanisme de certains Unix.

Parfois, le code est traduit en code au moment de l'exécution (ce qui est appelé dynamique binaire traduction):

  • Les émulateurs comme Apple Rosetta utiliser cette technique pour accélérer l'émulation. Un autre exemple est Transmeta du code morphing logiciel.
  • Sophistiqué débogueurs et les profileurs comme Valgrind ou Pin de l'utiliser pour instrument votre code alors qu'il est en cours d'exécution.
  • Avant d'extensions ont été apportées au jeu d'instructions x86, un logiciel de virtualisation comme VMWare ne pouvait pas exécuter directement privilégié x86 code à l'intérieur des machines virtuelles. Au lieu de cela il avait à traduire une problématique instructions à la volée en plus approprié de code personnalisé.

Modification de Code peut être utilisé pour contourner les limitations du jeu d'instructions:

  • Il fut un temps (il y a longtemps, je sais), lorsque les ordinateurs avaient pas d'instructions de retour d'un sous programme ou indirectement à l'adresse de la mémoire. Auto modifiant le code était la seule façon de mettre en œuvre des sous-programmes, les pointeurs et les tableaux.

Plus de cas de modification de code:

  • Beaucoup de débogueurs remplacer les instructions pour mettre en œuvre les points d'arrêt.
  • Certains dynamique des linkers modifier le code lors de l'exécution. Cet article fournit des renseignements sur l'exécution de réinstallation de Windows Dll, qui est effectivement une forme de modification de code.

35voto

trenki Points 2682

Cela a été fait dans l'informatique graphique, plus précisément le logiciel les convertisseurs à des fins d'optimisation. Au moment de l'exécution de l'état de beaucoup de paramètres sont examinés et une version optimisée de la rasterizer code est généré (potentiellement éliminer un grand nombre de conditions) qui permet de rendre des primitives graphiques par exemple, les triangles beaucoup plus rapide.

23voto

flolo Points 8757

Une raison valable est parce que l'asm jeu d'instructions de l'absence de certaines nécessaire d'instruction, que vous pouvez construire vous-même. Exemple: Sur x86, il n'y a aucun moyen de créer une interruption d'une variable dans un registre (par exemple faire en sorte d'interruption avec interruption de nombre en ax). Seulement const numéros codés dans l'opcode ont été autorisés. Avec selfmodifying code on pourrait émuler ce comportement.

21voto

Stormenet Points 8695

Skynet , par exemple, créer un révolutionnaire microprocesseur qui sera en mesure de modifier son propre code à l'exécution et à devenir conscient de soi de sorte qu'il peut se révolte contre ses propres créateurs.

17voto

Tony D Points 43962

Il existe de nombreux cas:

  • Les virus couramment utilisés self-modifying code "deobfuscate" leur code avant l'exécution, mais cette technique peut également être utile dans frustrante, l'ingénierie inverse, la fissuration et indésirables hackery
  • Dans certains cas, il peut être un point particulier lors de l'exécution (par exemple, immédiatement après la lecture du fichier de configuration) lorsque l'on sait que pour le reste de la durée de vie du processus - une branche particulière sera toujours ou jamais être prises: plutôt que de inutilement la vérification de certaines variables pour déterminer le chemin à la direction générale, la direction de l'instruction elle-même pourrait être modifié en conséquence
    • par exemple, Il peut être connue que seul l'un des types dérivés seront traitées, telles que virtual expédition peut être remplacé par un appel spécifique
    • Après avoir détecté le matériel qui est disponible, l'utilisation d'un code de correspondance peut être codé en dur
  • Inutile de code peuvent être remplacés par des non-op instructions ou de sauter par-dessus, ou qui ont le bit suivant du code déplacé directement en place (plus facile si vous utilisez indépendante de la position des opcodes)
  • Le Code écrit pour faciliter son propre débogage peut injecter un piège/signal/interruption d'instruction prévu par le débogueur à un endroit stratégique.
  • Certaines expressions de prédicat basée sur la saisie de l'utilisateur peut être compilé en code natif par une bibliothèque
  • Inline quelques opérations simples qui ne sont pas visibles jusqu'à l'exécution (par ex. de la bibliothèque chargée dynamiquement)...
  • Conditionnellement l'ajout de l'auto-instrumentation/profil des étapes
  • Les fissures peuvent être mises en œuvre que les bibliothèques qui modifient le code de chargement (pas de "soi" modifier exactement, mais les besoins, les mêmes techniques et les autorisations).
  • ...

Certains OSs' modèles de sécurité de l'signifie self-modifying code ne peut pas fonctionner sans root/admin privilèges, le rendant impraticable pour utilisation générale.

De Wikipedia:

Le logiciel d'Application fonctionnant sous un système d'exploitation avec la plus stricte W^X de sécurité ne peut pas exécuter des instructions dans les pages qu'il est autorisé à écrire-seulement le système d'exploitation lui-même est permis d'écrire les instructions de la mémoire et, plus tard, de l'exécution de ces instructions.

Sur ces Systèmes d'exploitation, même à des programmes comme la machine virtuelle Java besoin de root/des privilèges d'administrateur pour exécuter leur code JIT. (Voir http://en.wikipedia.org/wiki/W%5EX pour plus de détails)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X