53 votes

Quelles sont les utilisations de l'auto modifiant le code?

Est-il réellement utiliser pour l' auto-modifiant le code?

Je sais qu'ils peuvent être utilisés pour construire des vers/virus, mais je me demandais si il y a un peu raison qu'un programmeur peut utiliser l'auto modifier le code.

Des idées? Des situations hypothétiques sont aussi les bienvenus.

52voto

Zach Scrivena Points 15052

S'avère que l'article de Wikipédia sur le "self-modifying code" a une grande liste:

  1. Semi-automatique d'optimisation d'un état dépendant de la boucle.
  2. Exécution de génération de code, ou de spécialisation d'un algorithme dans d'exécution ou loadtime (qui est populaire, par exemple, dans le domaine de graphiques en temps réel) comme un général trier utilitaire de la préparation du code pour effectuer la comparaison clé décrit dans un spécifique invocation.
  3. La modification de inline à l'état d'un objet, ou la simulation de haut-niveau la construction de fermetures.
  4. Des correctifs d'adresse du sous-programme appelant, comme cela se fait généralement au moment du chargement des bibliothèques dynamiques, ou, sur chaque l'invocation de la correction du sous-programme de l' références internes à ses paramètres afin d'utiliser leurs adresses. Si cela est considéré comme 'self-modifying code" ou pas, c'est une affaire de la terminologie.
  5. Évolution des systèmes informatiques tels que la programmation génétique.
  6. Cacher le code pour empêcher l'ingénierie inverse, que par l'utilisation d'un désassembleur ou dans le débogueur.
  7. Cacher le code pour échapper à la détection par un virus/spyware logiciel de numérisation et la comme.
  8. Le remplissage de 100% de la mémoire (dans certaines architectures) avec un rouleau à motif de répéter les opcodes, pour effacer tous les des programmes et des données, ou de burn-in matériel.
  9. La Compression de code pour être décompressé et exécuté au moment de l'exécution, par exemple, lorsque la mémoire ou l'espace disque est limitée.
  10. Très peu de jeux d'instructions laissent pas d'autre choix que d'utiliser self-modifying code à atteindre certains la fonctionnalité. Par exemple, un" Instruction Set Computer" machine qui utilise uniquement les soustrayez-et-branche-si négatif "l'instruction" ne peut pas faire indirectement copier (quelque chose comme l'équivalent de "*a = **b" dans la programmation en C de la langue) sans l'aide de l'auto-modifiant code.
  11. Modifier les instructions pour la tolérance de panne

Sur le point à propos de déjouer les pirates à l'aide de self-modifying code:

Au cours de plusieurs mises à jour du firmware, DirectTV lentement assemblé un programme sur leur carte à puce pour détruire les cartes qui ont été piraté illégalement recevoir des impayés canaux. Voir Jeff le Codage de l'Horreur de l'article sur le Noir du dimanche de Hack pour plus d'informations.

15voto

Alnitak Points 143355

J'ai vu self-modifying code utilisé pour:

  1. optimisation de la vitesse, par le fait que le programme d'écrire plus de code pour lui-même à la volée

  2. obsfucation, faire de l'ingénierie inverse beaucoup plus difficile

10voto

Kosi2801 Points 9487

Dans les temps anciens où la RAM est limitée, auto modifiant le code a été utilisé pour économiser de la mémoire. Aujourd'hui, par exemple l'application utilitaires de compression comme UPX sont utilisés pour décompresser/modifier le code après le chargement d'une image compressée de l'application.

7voto

Peter Morris Points 2402

Parce que le Commodore 64 n'a pas beaucoup de registres et a un 1Mhz processeur. Lorsque vous avez besoin de lire une adresse de mémoire compensée par une valeur qu'il est plus facile de modifier le code source.

@Reader:
LDA $C000
STA $D020
INC Reader+1
JMP Reader

C'est la dernière fois que j'ai écrit self-modifying code de toute façon :-)

7voto

luser droog Points 9030

Années 1960-ère de l'assemblée langues utilisées self-modifying code pour implémenter les appels de fonction sans pile.

Knuth, v1, p.182:

MAX100  STJ   EXIT   ;Subroutine linkage
        ENT3  100    ;M1. Initialize
        JMP   2F
1H      CMPA  X,3    ;M3. Compare
        JGE   *+3
2H      ENT2  0,3    ;M4. Change m
        LDA   X,3    ;(New maximum found)
        DEC3  1      ;M5. Decrease k
        J3P   1B     ;M2. All tested?
EXIT    JMP   *      ;Return to main program

Dans un programme plus vaste contenant ce codage comme une sous-routine, la seule instruction "JMP MAX100" serait la cause d'enregistrer Un être réglé à la valeur maximale actuelle des emplacements X + 1 et X + 100, et la position du maximum apparaissent dans rI2. Sous-routine d'entraînement dans ce cas est réalisé par les instructions de la section "MAX100 STJ EXIT" et, plus tard, "la SORTIE de JMP *". En raison de la façon dont la J-registre fonctionne, l'instruction exit va ensuite passer à l'emplacement suivant l'endroit où la référence d'origine MAX100 a été faite.

Edit: Il peut être difficile de voir ce qui se passe, même avec une brève explication ici. Dans la ligne MAX100 STJ EXIT, MAX100 est une étiquette pour l'instruction (et donc pour l'ensemble de la procédure), STJ moyen de STOCKER le saut s'inscrire (où nous venons de), EXIT signifie que l'emplacement de la mémoire de l'étiquette "SORTIE" est la cible de la banque. EXIT, nous verrons plus tard est l'étiquette de la dernière instruction. Donc, c'est l'écrasement de code! Mais, de nombreuses instructions (y compris STJ ici) implicitement remplacer uniquement l'opérande partie de l'instruction word. Si l' JMP reste intacte, et l' * est un faux jeton, car il n'y a vraiment rien d'intéressant à y mettre, il n'avait écrasés.


Self-modifying code est également utilisé lorsque inscrivez-adressage indirect n'est pas disponible, et pourtant l'adresse que vous avez besoin est assis juste là dans le registre. PDP-1 LISP:

dap .+1  ;deposit address part of accumulator in (IP+1)
lac xy   ;load accumulator with (ADDRESS) [xy is a dummy symbol, just like * above]

Ces deux instructions effectuez ACC := (ACC) par la modification de l'opérande de l'instruction de chargement.

Des Modifications de ce genre sont relativement à l'abri, et sur les architectures antiques, ils sont nécessaires.

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