Loriciels to disk 1.0 (c) Tom et Jerry du GPA
*********************
(c) 11/2003
Maj du 27/03/2004 !
Cet archive contient deux utilitaires permettant de transferer de
cassette sur disquette un certain nombre de programmes originaux vendus
par la societe d'edition Loriciels. Ces logiciels utilisent des
"loaders" ou routines de chargement qui ne permettent pas un transfert
classique avec Discology ou Transformateur 3000, par exemple.
LTD permet de copier les programmes Loriciels utilisant un loader maison
generique qui sert aussi de protection.
Important :
Loriciels To Disk ne pretend pas etre exhaustif ! Il existe certains
programmes qui ne peuvent pas etre transferes avec cet outil, car ils
utilisent d'autres routines de chargements (Lorigraph, par exemple).
Comme je n'ai pas tous les programmes Loriciels en originaux, je ne peux pas
vous faire une liste complete des programmes a probleme (les dons sont
acceptes :-) ).
La section 4 contient les programmes non copiables avec LDT que j'ai pu
verifier.
1) Quels programmes Loriciels to Disk peut-il transferer ?
----------------------------------------------------------
LTD permet de traiter deux types de chargeurs K7. Ces loaders se
reperent facilement grace a une page de presentation du programme en
mode 1 affichant le nom du logiciel charge en dessous du dessin d'un
petit chaton jouant avec une balle.
Au cours de sa carriere d'editeur, Loriciels a change de protection.
On distingue deux chargeurs, le type 1 et le type 2.
Loader type 1
-------------
* Le premier fichier est un fichier BASIC protege
* Le deuxieme fichier est un tres court fichier BINAIRE
* Le troisieme fichier (non chargeable directement) contient le loader
avec le chaton.
Le loader de type 1, a ma connaissance, ne permet de charger qu'un seul
fichier, puis de l'executer. Il a ete utilise avec les programmes les
plus anciens publies par Loriciels (1er semestre 1985, en gros). Bref, vous
ne devriez pas trop le rencontrer.
Loader type 2
-------------
* Le premier fichier est un fichier BINAIRE implante en &7530, de taille
&638, et dont le nom est "** LORICIELS **".
Ce chargeur est plus evolue en ce sens qu'il permet de charger a la
suite plusieurs fichiers. Il a ete utilise soit pour mettre en memoire
l'integralite d'un programme, soit pour charger son premier fichier.
Dans ce dernier cas, un autre loader prend la suite des operations. En
general, il s'agit d'un simple appel a la routine &BCA1.
En fonction des programmes proteges, il existe un nombre important de
variantes, voyez a ce sujet la section 3.
Pour plus d'informations sur ces deux chargeurs, consultez le fichier
ANALYSE.TXT. Pour aller plus loin, vous avez meme droit a des dumps memoire
un peu commentes, LOADER1.TXT, LOADER2.TXT et LOADER2B.TXT.
A ma grande surprise, j'ai decouvert en decembre 2003 qu'un logiciel de
transfert pour cette protection existait deja. Il s'agit d'un outil commercial
vendu dans la compilation Nemesis Express ! Il remplit lui aussi son oeuvre
mais ne vous explique pas comment fonctionne la protection Loriciels...
2) Utiliser LORI1.BAS
---------------------
Tout est tres simple et est vraiment a la portee du premier venu, quand
tout se passe bien !
* Copier le fichier LORI1.BAS sur une disquette formatee.
* Placez la cassette originale a transferer dans le lecteur de K7.
* Positionnez la bande de la cassette juste apres le premier fichier
qu'elle contient. Si vous ne savez pas comment faire, tapez
les commandes suivantes en mode direct.
ùTAPE
CAT
Une fois le premier fichier affiche, appuyer sur la touche ESC.
Voila, vous etes au bon endroit !
* Faire un reset du CPC
* Lancer le programme LORI1.BAS
Le CPC vous demande le nom du programme a sauver sur disquette.
Vous pouvez mettre n'importe quel nom, sous reserve qu'il soit valide
(pas plus de 8 caracteres). Faites quand meme en sorte qu'il ait un
rapport avec le programme transfere.
Tout le reste est automatique. Le programme va d'abord charger en
memoire le loader du jeu puis le sauvegarder. Il modifie ensuite son
contenu et l'execute. Vous devez voir la page de presentation du
programme avec le chaton, tandis que la cassette se deroule.
Une fois le programme charge en memoire, il est sauve sur la disquette,
puis le CPC se reinitialise.
Si tout s'est bien passe, vous devez avoir deux nouveaux fichiers sur
votre disquette, ayant les extensions .1 et .2
<fichier>.1 correspond an loader du programme
<fichier>.2 correspond au programme lui-meme.
Pour utiliser ensuite ce logiciel, deux solutions :
Executer avec la commande RUN le fichier <fichier>.2.
Charger en memoire le programme LOADER1.BAS, modifier le nom du
programme en ligne 10, puis le sauvegarder. Vous aurez ainsi la joie de
posseder une version complete de votre programme, avec la page de
presentation Loriciels !
Ce programme a ete teste avec succes sur les jeux suivants :
RALLY II (version 464/664/6128) et 3D-Fight.
3) Utiliser LORI2.
------------------
Sans etre particulierement compliquee, l'utilisation de ce module de
transfert requiert un peu d'attention.
Le debut de la procedure d'utilisation est similaire a LORI1.
* Copier les fichiers LORI2.BAS et LORI2.BIN sur une disquette formatee.
* Placez la bande originale dans votre lecteur de K7 et rembobinez la
completement.
* Lancez le programme LORI2.BAS.
* Si LORI2 est lance pour la premiere fois, il va vous demander le nom
du programme a transferer. Il va ensuite charger en memoire le loader
du jeu, puis le sauvegarder sur la disquette, sous le nom <fichier>.1.
Il va egalement sauvegarder un fichier LORI2.DAT, contenant le nom
que vous avez tape precedemment. Ce fichier sert aussi a indiquer a
LORI2 qu'il doit charger <fichier>.1, analyser son contenu et tenter
de transferer un fichier de cassette sur disquette a partir des
informatons collectees.
Le programme reinitialise ensuite le CPC.
* Relancez LORI2. Le programme lit le fichier <fichier>.1, l'analyse puis
affiche le nombre de fichiers a transferer.
A ce stade, vous devez saisir le numero du fichier a copier (entre 1
et x).
Si aucun fichier n'a encore ete transfere, il faudra taper 1.
* LORI2 charge en memoire le fichier K7, puis le sauvegarde sur le
disque. Si l'adresse d'implantation du fichier est &16F, il
l'enregistrera sous la forme d'un fichier BASIC.
Ensuite, le programme reinitialise le CPC.
En faisant un catalogue de votre disquette, vous devez trouver un
nouveau fichier.
* Il faut relancer LORI2 autant de fois qu'il y a de fichiers K7
a copier sur disquette.
Si le fichier transfere est le dernier, il aura une adresse d'execution
correspondant a celle du programme.
Si pour une raison quelconque, vous voulez reprendre le transfert depuis le
debut, il faut effacer sur la disquette le fichier LORI2.DAT et de lancer
LORI2.BAS.
Une fois la phase de transfert terminee, il ne nous reste plus qu'a
concocter un chargeur permettant de mettre en memoire les fichiers et
executer le programme transfere. La encore, on vous a mache le travail.
* Charger le programme LOADER2.BAS
* Modifier le nom du fichier en ligne 10.
* Sauvez le fichier sous le nom de votre programme transfere.
* C'est fini.
En theorie, si vous etes arrives jusque la, vous devriez avoir un beau
programme en train de fonctionner sur votre CPC. Si cela ne marche pas,
trois explications :
* Vous avez loupe une etape : verifiez le nombre de fichiers transferes
et leurs caracteristiques par rapport a ce que LORI2 vous indique.
* Un des fichiers transferes est loge dans une zone memoire necessaire
au fonctionnement de la routine de sauvegarde. (La zone &A800-&BFFF).
* Le programme est incomplet, l'adresse d'execution du dernier fichier
lance un autre chargeur cassette. Vous devrez dans ce cas en faire
l'etude et faire votre propre routine de transfert, bon courage !
Ce programme a ete teste avec succes sur les jeux suivants :
3D-Sub
------
Transfert standard. L'execution du programme necessite la personnalisation du
fichier LOADER2.BAS.
Billy la Banlieue
-----------------
Transfert (presque) standard. La cassette contient deux fichiers avant le
loader Loriciels. Un Basic et un binaire, tres facile a transferer. Il faut
lancer LORI2.BAS apres ces fichiers. Le fichier <fichier>.2 peut etre lance
directement.
Invitation
----------
Transfert non standard. Comme pour Billy la banlieue, le loader Loriciels se
trouve apres un chargeur Basic et une page ecran. On peut transferer avec
LTD le programme principal, mais ce dernier charge un autre fichier.
Probleme, le fichier principal d'INVITATION est code, donc pas directement
patchable. Dans ma mansuetude legendaire, je vous donne la marche a suivre :
Transferer le dernier fichier avec le programme suivant :
10 OPENOUT"d":MEMORY &3FFF
20 FOR i=&BE80 TO &BE8A:READ A$:POKE i,VAL("&"+a$):NEXT
30 DATA 21,00,C0,11,00,40,3E,5D,C3,A1,BC
40 CALL &BE80
50 SAVE "INVITAT.SC2",b,&C000,&4000
Ensuite, pour pouvoir lancer le jeu, tapez le listing suivant :
10 MODE 0:OPENOUT"d":MEMORY &12EB
20 LOAD "INVITAT.2"
30 LOAD "INVITAT.SC2"
40 POKE &BCA1,&C9:POKE &BC0E,&C9
50 CALL &7A00
Bon, evidemment, pour avoir un programme reproduisant le chargement de
l'original, il vous faudra mixer le loader BASIC original et celui-la.
A noter que le programme se plante sur CPC plus.
Maracaibo
---------
Transfert standard. Le fichier principal est directement executable.
Marius Tresor Foot
------------------
Transfert standard. Une fois les deux fichiers sur disquette, il ne vous
reste qu'a parametrer le fichier LOADER2.BAS. A la limite, vous pouvez
meme executer en mode direct le fichier <fichier>.2.
Pro-Tennis (version anglaise de Tennis 3d)
----------
Transfert non standard. Le loader Loriciels charge une fichier binaire
contenant lui-meme un autre chargeur, non protege. Le plus simple consiste a
detourner ce chargeur en &805A vers une routine de sauvegarde. A vous de
bricoler un peu, apres tout !
Reversi Champion
----------------
Transfert standard. Le fichier <fichier>.2 est un programme BASIC. On ne peut
donc pas utiliser comme modele LOADER2.BAS.
Tapez le listing ci-dessous et sauvez-le sous le nom de <fichier>.BAS.
10 MODE 1:OPENOUT"d":MEMORY &752F
20 LOAD "reversi.1"
30 POKE &75B3,&0:CALL &7552
40 LOAD "reversi.3":LOAD "reversi.4"
50 CALL &BB4E:CLEAR:MEMORY &7FFF:RUN"reversi.2"
Sapiens
-------
Transfert standard. Le fichier principal est executable directement, mais vous
auriez tort de vous priver de la page de copyright Loriciels. Personnalisez
donc le fichier LOADER2.BAS.
4) Les recommandations du chef
******************************
Avant de vous lancer tete baissee dans un transfert, verifiez que votre
cassette originale fonctionne correctement.
N'oubliez pas que la plupart des programmes sont enregistres sur les
deux faces de la cassette !
Si votre programme ne se charge pas correctement :
* Loader de type 1 : c'est foutu !
* Loader de type 2 : s'il y a plusieurs fichiers, essayez de les
transferer a partir de chacune des faces. Avec un peu de chance, les
fichiers endommages ne sont pas les memes.
Dans tous les cas, LTD ne sauvegarde jamais sur disquette un fichier
endommage, car le loader Loriciels fait un reset en cas de probleme de
chargement. L'ecran est alors affuble de soubressauts desagreables !
Loriciels to Disk ne permet pas de transferer les programmes suivants :
---------------------------------------------------------------------
Graftric, Infernal runner, Le diamant de l'ile maudite, Lorigraph,
Planete Base, Tony truand, Turbo Cup, Rally II version 464 (ma version
ne fonctionne pas du tout !).
NOTICE TEXTE n° 2 (8.67 Ko)
Loriciels to disk 1.0 (c) Tom et Jerry du GPA
*********************
(c) 11/2003
Last update 03/26/2004
English user, I apologize for my awful writing, my ugly style... Bu I suppose
a bad english notice is always better than a good french one :-).
This program is a duo of tools which purpose is to copy on disk some tape
programs sold in the eighties by the famous french software house,
Loriciels. This company used to sell protected programs, so that it is not
possible to do a copy easily without a specific program.
Fortunately, LTD can do this awful job ! As I have a game sold in England
with that kind of protection (Pro-Tennis), I have decided to release an
international release (my god !) of this little tools.
Please note !
-------------
LTD is not the ultimate tape to disk program ! Some Loriciels' games are not
protected with the "Cat loader", like Lorigraph. You can find in section four
a list of tested softwares that are not LTD compatible.
1) What kind of program Loriciels to Disk can transfer ?
--------------------------------------------------------
LDT is able to unprotect two kinds of loaders. You can easily locate then
thanks to their introduction screen in MODE 1. It shows a cute little cat
playing with a ball.
Why two loaders ? In fact, Loriciels has totally changed the way its programs
are protected but the looking of the loader is the same !
Loader mark 1 (probably not spreaded out of France).
-------------
* First file is a Basic protected program.
* Second file is a short binary routine (&BCA1 loader).
* Third file (not loadable) is the "real" loader.
This kind of loader can only load one binary file and launch it. It has been
used on some older Loriciels' games (first half-year of 1985). So, it is not
an usual loader.
Loader mark 2
--------------
* First file is a binary program, start in &7530, length of &638 bytes. Its
name is "** LORICIELS **".
This program is more sophisticated because it can load several files, and
has the rare ability to execute Basic code. it has been used in two ways :
* load all files of a program and start it.
* load the first file of a program and launch it.
In the second case, there is in the loaded program another loader,
usually a common &BCA1 routine.
If you like machine code, just have a look on the LOADER1.TXT and LOADER2.TXT
memory dumps. Sorry, only short explanations in french...
I have been quite surprised to discover a commercial tool that do the same
nasty thing as LTD (loader mark 2 only !). It is Nemesis Express.
2) I wanna use LORI1.BAS
------------------------
A really comprehensive tool, everything is automatic ! Read and enjoy :
* Copy file LORI1U.BAS on a blank formatted disk.
* Put the original tape in the recorder.
* Load manually the first Basic file. If you don't know how to do this, type
these instructions :
ùTAPE
LOAD"!"
* When your CPC answer READY, reset it !
* Start LORI1U.BAS program.
The CPC now needs an input, the tape program name. You can choose whatever you
want, but this word can't have more than eight characters.
Now, Arnold will do the job by itself... LORI1U.BAS first loads the game
loader in memory then saves it onto disk. It alters its code and starts it.
You should see the introduction screen with the cat whereas the game loads.
At the end of the process, the program in memory is saved onto disk then your
CPC resets.
After this treatment, you should find two new files on the disk, with the
extension <file>.1 (original loader) and <file>.2 (main program).
There is two way to run the hacked program :
RUN the file <file>.2.
Use the file LOADER1.BAS, put the program name in line 10 (no extension) and
save it as the game loader. Now you have a carbon copy of the program !
LORI1U.BAS has been successfully tested with :
RALLY II (version 464/664/6128) and 3D-Fight.
3) How to use LORI2
-------------------
Well, altought this program doesn't need extremely high intellectual
capabilities, it needs a minimum of attention.
The first steps are basically the same as for LORI1U.BAS
* Copy files LORI2U.BAS and LORI2U.BIN onto a formatted disk.
* Rewind the tape in your recorder.
* Start the program LORI2U.BAS.
* If LORI2U is launched for the first time, it asks you for the name of
the program to hack. Then, it puts in memory the game loader, and saves
it on your 3 inch disk (name <file>.1).
It creates too another file, LORI2.DAT, to store the name you have typed.
Thanks to it, LORI2U knows that the next time it is launched, it must
start the COPY mode. To finish the first event, your CPC resets.
* Start again LORI2U. It looks for LORI2.DAT. If found, it loads LORI2U.BIN,
scans it and displays the number of tape files to transfer.
You have to enter the file number you want to load.
The first time, you must of course type 1.
* LORI2U loads the choosen file in memory then saves it. If the load address
is &16F, the program is considered as a Basic software.
At the end of the save, the CPC resets !
* You have to repeat this process for all the tape files (second file, etc).
The last copied filed has mainly an execution address, the program start.
If, for any reason, you want to start again the process since the first step,
delete the file LORI2.DAT.
Right, the copy process is over. Now, the goal is to make a beautiful disk
loader for the hacked game. One more time, it is a piece of cake !
* Load the LOADER2.BAS file
* Change the name in ligne 10 with the program name.
* Save it.
* Finished !
In theory, everything should be now all right. But, if it not so, I can
give you three good reasons :
* You haven't follow the notice ! Compare the files properties on the disk
with the informations displayed by LORI2U.BAS (start, length).
* One of the game file uses a system area of the memory (&A800-&BFFF)
* The transfered program is imcomplete, and try to load another tape file.
In this case, take your disassembler and your courage...
LORI2U.BAS has been successfuly tested with the following softwares :
3D-Sub
------
Billy la Banlieue
-----------------
Almost standard procedure. The tape has two standards files (Basic loader
and screen) before the Loriciels loader.
Invitation (french adventure game)
----------
Non-standard. The Loriciels loader is the third file on the tape. With LTD,
the main program can be copied, but this one searches a screen file.
Damned, the screen loader is protected ! Ok ok, here is the solution to copy
the final game's screen.
10 OPENOUT"d":MEMORY &3FFF
20 FOR i=&BE80 TO &BE8A:READ A$:POKE i,VAL("&"+a$):NEXT
30 DATA 21,00,C0,11,00,40,3E,5D,C3,A1,BC
40 CALL &BE80
50 SAVE "INVITAT.SC2",b,&C000,&4000
Now, type the listing below to use the game :
10 MODE 0:OPENOUT"d":MEMORY &12EB
20 LOAD "INVITAT.2"
30 LOAD "INVITAT.SC2"
40 POKE &BCA1,&C9:POKE &BC0E,&C9
50 CALL &7A00
Gosh, the game crashes on my CPC plus... But its ok on an old one !
Maracaibo
---------
Marius Tresor Foot (I don't know the english name of this sport game)
------------------
Pro-Tennis
----------
Non-standard. Loriciels' loader put in memory a screen and a little loader.
It is not protected. So you can fix it by yourself to save the game. The
easier technic is to patch the loader in &805A. It is time to learn how to
use the &BCCE, &BC98, &BC8C and &BC8F vectors !
Sapiens
-------
Reversi Champion
----------------
File REVERSI.2 is a BASIC program. So we can't use the LOADER2.BAS file
as a model.
Type the listing below and save it as the main loader.
10 MODE 1:OPENOUT"d":MEMORY &752F
20 LOAD "reversi.1"
30 POKE &75B3,&0:CALL &7552
40 LOAD "reversi.3":LOAD "reversi.4"
50 CALL &BB4E:CLEAR:MEMORY &7FFF:RUN"reversi.2"
4) Chief's tips
***************
* Test your tape software before trying to hack them !
* Do not forget that most programs are recorded on both sides of the tape !
* If the program does not load correctly !
Loader mark 1 : damned, the dustbin will be happy...
Loader mark 2 : if the program loads more than one file, try to copy
each file from both sides. If you are lucky, the damaged files are
not the same...
In all cases, LTD never saves a bad file. In fact, the Loriciels's loader
hangs if there is a problem during the loading process. The screen is then
not synchronised and flickers !
Loriciels to Disk can't copy this games
---------------------------------------
Graftric, Infernal runner, Le diamant de l'ile maudite, Lorigraph,
Planete Base, Tony truand, Turbo Cup, Rally II 464.
Rally II has also been selled in England by Amsoft. I suppose it has no
protection...
NOTICE TEXTE n° 3 (8.48 Ko)
Analyse protection cassette Loriciels
-------------------------------------
La protection cassette Loriciels est un chargeur protege qui a
ete employe sur une bonne partie des programmes vendus par cet
editeur francais. Il se reconnait aisement par la presence d'une
page ecran avec un petit chat.
A ma connaissance, il existe deux versions de cette protection.
Le petit laius qui suit vous donne des explications utiles sur
le fonctionnement de cette protection pas ininteressante.
Version 1
*********
L'etude ci-dessous a ete faite avec le jeu 3d-Fight, celebrissime
jeu de tir spatial !
Etape 1
-------
Lorsque l'on essaie de transferer ce jeu, on est de prime abord
confiant. La cassette contient deux fichiers "standards".
* un loader Basic protege.
* une routine binaire, dont la fonction est de charger un fichier
sans en-tete qui est le "vrai" loader du programme.
Un desassemblage de la routine binaire confirme cette impression,
elle utilise le vecteur &BCA1, qui permet de charger en memoire
un fichier sans en-tete.
Probleme, lorsque l'on a transfere ces fichiers et qu'on essaie de
les utiliser, il ne se passe rien ! La routine contenue dans le
loader binaire n'est rien d'autre qu'un piege a couillon...
En etudiant de plus pres le chargeur Basic, on s'apercoit que ce
dernier contient des lignes cachees.
Ligne 20 : POKE &9FFF,55:POKE &9FFE,55
Ligne 35 : IF PEEK(&BC66)=&70 THEN CALL &B807+28 ELSE CALL &B11F+28
Faites les apparaitre avec les POKE suivants en mode direct :
POKE &170,10
POKE &192,9
Nouveau souci : les adresses appelees par ces lignes ne contiennent
pas de code valide. Le loader doit donc exploiter une astuce pour
faire en sorte qu'il y ait des instructions dans ces cases memoires.
Afin d'en etre sur, modifions le chargeur Basic en rajoutant
une ligne 31 comme suit (pour un CPC 664 ou 6128) :
31 FOR i=0 TO 70:POKE &BE80+i,PEEK(&B11F+28+i):NEXT:END
Une fois modifie, lancez-le et quand le loader binaire est charge,
desassemblez en &BE80. On obtient ceci :
BE80 F3 DI
BE81 01 E9 B0 LD BC,&B0E9 ; vecteur systeme ?
BE84 CD 65 BC CALL &BC65 ; Init du MOS
BE87 21 68 90 LD HL,&9068
BE8A 11 36 03 LD DE,&336
BE8D 3E E0 LD A,&E0
BE8F CD A1 BC CALL &BCA1 ; vecteur systeme chargement
BE92 D2 00 00 JP NC,&0000 ; fichier monobloc
BE95 21 A0 90 LD HL,&90A0 ; adresse d'execution du loader
BE98 18 E8 JR &BE82
BE9A C3 E5 91 JP &91E5
Si on desassemble en &BE82, on trouve l'instruction suivante :
BE82 E9 B0 JP (HL)
Cela ressemble furieusement au programme binaire charge en xxxx, a ceci
pres que l'octet de synchronisation lors de l'appel de la routine &BCA1 est
different. Si on lance en mode direct la routine, ca marche !
D'ou viennent ces donnees ? Elles sont tout simplement stockees dans le header
du fichier "!". Pour vous en persuader, demarrez le TRANSFORMATEUR 3000 de
chez MBC, et chargez l'editeur d'en-tetes K7.
Bien, nous savons donc maintenant charger correctement en memoire le loader
principal. Il ne nous reste plus qu'a comprendre comment ce dernier
fonctionne. Sans entrer dans les details, une rapide analyse permet de deviner
qu'il est facile a detourner, et qu'il contient toutes les informations dont
nous avons besoin pour sauvegarder sur disquette le programme charge.
Nous avons :
en &9068 : l'adresse d'implantation du fichier charge
en &906A : la longueur du fichier charge
en &906C : l'adresse d'execution (codee) du fichier.
en &906E : le nom du fichier.
Pour sauvegarder le fichier une fois en memoire, il suffit de detourner la
routine decodant l'adresse d'execution (en &91D2). Pour le reste, sachez que
le loader utilise directement des routines de chargement situees dans la ROM
inferieure du CPC, dans la zone correspondant au MOS. Autre bizarrerie, le
petit chat n'est pas un sprite, mais bien une serie de caracteres redefinis !
Pour voir tout cela par vous meme, jettez un oeil sur le fichier LOADER1.TXT
Version 2
*********
L'etude ci-dessous a ete faite avec le jeu 3d-Sub, un jeu tres peu connu.
Accrochez-vous, les explications ne sont probablement pas tres claires, mais
la protection est elle-meme assez tordue !
Contrairement au loader de type 1, le source LOADER2.TXT ne contient pas
une etude exhaustive du chargeur, car il s'avere beaucoup plus complexe et
evolue au cours de son execution.
Ce programme se compose d'un unique fichier binaire, habtuellement nomme
** LORICIELS ** sur la cassette l'utilisant.
Quand on commence a desassembler le programme, il apparait qu'il est code, car
rien ne ressemble a une routine de chargement cassette. Il faut donc passer
par une etude pas a pas du programme.
Apres quelques gentilles attentions, la protection apparait rapidement. La
methode utilisee repose sur du code automodifie. La routine en &7830 lit une
table dont chaque entree se compose de trois octets :
* Une valeur sur 2 octets correspondant a l'octet a modifier. Elle est
stockee dans le registre HL.
* Une valeur sur 1 octet correspondant a l'octet a poker en memoire. Elle
est stockee dans le registre A.
Tout serait tres simple si la routine ne contenait pas en &7842 une commande
XOR decodant l'octet dans A. On ne peut donc pas 'voir' directement quelle
valeur sera au final mise en memoire, il faut faire le calcul.
Pour compliquer les choses, la routine en &8730 est elle-meme affectee par
ces modifications, soit en &7843 (valeur servant a decoder), soit en &7846
(saut vers le debut de la routine de decodage, ou ...).
A noter egalement qu'au bout d'un certain nombre de decodages, c'est carrement
l'ordre de la table lue qui change !
On a au debut du processus :
7833 LD H,(IX+&00)
7836 LD L,(IX+&01)
Apres la 16eme 'passe', la routine de saut pointe sur &7847, qui contient a
ce moment la un CALL vers &77C9. Celle routine modifie le code en &7833 comme
suit :
&7833 LD L,(IX+&01)
&7836 LD H,(IX+&00)
La question qui se pose est, comment decoder ce genre de programme ?
La seule solution consiste a reproduire une routine identique ailleurs en
memoire ou a detourner la routine existante. Il faut ensuite executer "pas
a pas" cette routine pour comprendre quelles sont les modifications effectuees
sur le code et leurs consequences. Je vous l'accorde, c'est tres chiant et
long a faire. On peut donc dire bravo au programmeur qui s'est fendu de cette
protection. Il a du passer pas mal de temps a se triturer les meninges pour
arriver a ce resultat.
Notre homme a pourtant commis une maladresse qui rend le decodage un peu moins
difficile que prevu, la table des adresses a poker n'est pas totalement codee.
On a tot fait de reperer les endroits ou la routine de decodage est modifiee
pour lancer l'execution d'une autre routine :
en &7851
en &787E
etc...
La technique consiste alors a compter le nombre de tours ou la boucle de
decodage fait des modifications sans "sortir" vers une routine externe afin
de l'intercepter et d'avoir du code comprehensible en memoire.
Le detournement se fait avec une routine du style :
BE80 LD HL,&7851 ; debut de la table de code automodifie
BE83 LD B,&10 ; &10 = (&78781-&7851) / 3
BE85 PUSH BC
BE86 CALL &7833
BE89 POP BC
BE8A DJNZ &BE85
BE8C RET
On met un RET en &7845 et on lance la routine. On obtient alors en memoire
du code modifie, qu'il faut etudier.
Bref, je vous fais grace du processus, la routine au final implante un loader
basee sur le vecteur &BCA1 en &0040, apres avoir fait une reinitialisation
des vecteurs systemes. Il n'est a priori pas possible de la detourner, mais,
enorme defaut, le loader final est toujours le meme, a l'octet pres, quel que
soit le programme protege. Une fois que l'on a reussit a isoler ce loader,
on peut s'en reservir les yeux fermes avec d'autres logiciels proteges de la
meme facon.
Les parametres utiles au chargement d'un logiciel sont implantes en &7944 et
ne sont meme pas codes. Il devient donc facile de creer un programme de
transfert generaliste...
A noter qu'on ne peut pas utiliser un simple logiciel capable de lire les
fichiers sans en-tete, car les fichiers sont codes. Voir a ce sujet le
fichier LOADER2B.TXT, qui decrit la routine de chargement finale.
Petite surprise interessante, ce chargeur est capable d'executer du code
BASIC. Cette particularite a ete utilisee pour le jeu REVERSI CHAMPION.