home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 18
/
CD_ASCQ_18_111294_W.iso
/
dos
/
prg
/
pas
/
gpro105
/
gpro.doc
< prev
next >
Wrap
Text File
|
1994-10-26
|
29KB
|
727 lines
26 Octobre 1994 - Gpro 1.05
Gpro "le meilleur kit de protection anti-debugging pour les fichiers EXE"
v01.05
Gpro: Un kit anti-debug ??
└──────────────────────────┘
Gpro est un kit anti-déboguage (anti-debug en français). C'est
pas la peine de me regarder avec des grands yeux, je vais vous
expliquer ! Tout d'abord, commençons par vous. Vous êtes un
developpeur indépendant ou même pour le compte d'une boite (par
exemple auteur de sharewares à succés !), voir distributeur,
importateur ou quoi que ce soit d'autre ayant rapport avec la
distribution ou vente de programmes. Je ne vous apprendrez rien
en parlant de piratage. Ce domaine de la micro-informatique est
même connu du grand public. Je ne vous apprendrez rien non plus
en vous disant que qui dit piratage, dit pirate (ça coule de
source, enfin quoi, je vais pas tout vous dire quand même...).
Or, pourtant, il parait que les logiciels qui sortent
actuellement aussi bien dans le commerce que dans le shareware
sont protégés. Par quoi ? Par qui ? Comment ? Ça, souvent, un
cracker ne s'en rend même pas trés bien compte lorsqu'il
rencontre une protection de "grande diffusion". Un loader à
enlever, un jne à remplacer par un nop-nop, ou autres d'une
simplicité équivalente. Certe, on pourra me dire que celà fait
partie de la stratégie de vente, coco. Mais il y a diffusion
limitée et diffusion limitée. Tout d'abord, un protection bridée
n'est pas une protection. Si elle peut être cracké en 3 minutes
par quelqu'un, le logiciel sera sur un board ou dans les boites
postales illico presto. Une bonne protection est une protection
qui est capable de résister relativement longtemps aux attaques
du cracker. Et là, j'affirme qu'aucun protection n'est totale.
Tant qu'il existe une interface entre le programme et la
protection, la protection n'est pas infaible (je pense notemment
aux dongles, qui sont souvent interfacés tellement piètrement
qu'ils sont crackés plus facilement qu'un protection uniquement
logicielle). C'est pourquoi je ne vous dit pas comme beaucoup de
commerciaux que ma protection est la protection "ultime", ou
garantie "unbreakable", mais que c'est la meilleure protection
du moment. Je dis bien "du moment" car une protection s'use
relativement rapidement, surtout avec les progrés des debuggers
et autres sourceurs. Bien souvent on vous parle d'une protection
qui ne nécessite aucun travail de programmation ou de
plug'n'run. C'est là un mensonge que de prétendre pouvoir
protéger un logiciel juste en rajoutant une couche logicielle
car ce qu'un logiciel peut faire, un autre peut le défaire.
Ainsi, s'il est vrai que Gpro est déjà efficace sans
programmation additionnelle, il est vivement conseillé de faire
des appels à GRI (Gpro Resident Interface) (cf le guide du
programmeur).
26 Octobre 1994 - Gpro 1.05 2.
Qui a besoin de Gpro ?
└──────────────────────┘
Gpro peut résoudre beaucoup de vos problèmes. Pour les auteurs
de sharewares, il permet de sécuriser les méthodes
d'enregistrement ( fini les patchs pour rendre la version
shareware en autenthique version enregistrée - suppression des
messages et autres bridages - ), pour les auteurs de logiciels
commerciaux ( jeux ou autres ), il permet d'assurer des
lendemains qui chantent en empechant le debuggage du programme
et en particulier de la protection ( trés utile pour les codes,
en plus du dongle... ) et pour tout le monde vous pourrez
limiter l'accés à votre tout dernier logiciel. Il faut bien se
rendre compte que grâce à Gpro, une demande de code,
_même_par_une_interruption_DOS_, devient une protection
redoutable!! (cf Conseils de sécurité) De plus, comparez le prix
de Gpro aux prix des kits de protection du commerce (en plus pas
super fiables!): gratuit pour un auteur de FreeWare, 90 FF pour
un auteur de ShareWare, 490 FF pour les logiciels commerciaux.
Jetez un oeil sur le formulaire d'enregistrement REGISTER.FRM
avant de sortir quoique se soit de non protégé !!
Conseils de sécurité
└────────────────────┘
Gpro permet de protéger vos programmes contre tout envahisseur
non invité. Même si Gpro est terriblement efficace en lui même,
il y a des règles de sécurités qu'il faut suivre avant de
sortir un programme:
Tout d'abord, GRI n'est pas fait pour les cleps, il _faut_
l'utiliser sinon on va au devant de quelques ennuits. Même si
vous ne l'utilisez pas à donf, appelez de temps en temps un
service de GRI pour vérifier si l'installation est effectuée
correctement, si les flags sont bien renvoyés, si il n'y à pas
un debugger en route ... Il est évident que les appels à GRI
doivent s'accentuer autour des parties à protéger (demande de
codes, sauvegarde...).
Ensuite, il ne faut pas oublier que le cracker est un être
humain, de chair, de sang, et d'adrénaline. Alors, pas de
pitié, jouez de vices, ruses et coups bas. Par exemple, avant
l'appel de GRI, simulez un appel DOS (l'int 3 est détournée pour
l'int 21 dans de trés nombreux schémas de protections, mais pas
dans Gpro, on n'est pas des touristes !), ajoutez des
instructions parfaitement inutiles (genres vous recopiez des
blocks de mémoire les uns sur les autres, vous sauvegardez les
vecteurs d'int, les détournez et finalement les restaurez...).
Le reste est question d'imagination.
De plus, Gpro utilise un cryptage sommaire (qui devait être
rapide mais relativement sûr) pour chiffrer son code et un
morceau du code du programme (le premier segment de code). Par
26 Octobre 1994 - Gpro 1.05 3.
contre, vous devez profiter du fait que Gpro a été
judicieusement écrit pour utiliser un cryptage de votre moule,
ou même, et celà je le conseille, un compresseur: en effet, des
programmes comme LZEXE, PKLITE ou DIET sont les meilleurs
"scrambleurs" que l'on puisse réver. Par contre, vous devez les
utilisez AVANT Gpro, et ceci non à cause d'un problème de
compatibilité (on est dans Gpro, pas dans Windaube !), mais pour
profiter du cryptage dont au sujet duquel je vous parlais
quelques lignes plus haut. Le chargement du code de
décompression, le header, tout quoi!, seront cryptés. Ainsi
impossible de reconnaitre ce qu'il y a aprés Gpro !! Que celà
soit fait exprés ne m'étonnerait pas...
Gpro est idéal si vous utilisez une autre protection ( comme un
dongle, un disk d'installation... ) ou même pour vous permettre
de brider vos versions publiques. Un readln() ou autre est en
effet efficace pour valider un enregistrement ( un cryptage
sommaire, un cmp suffisent ).
Si vous utilisez une protection demandant un code au clavier, ne
laissez jamais en mémoire le code correct en clair, détournez
les interruptions comme Ctrl-Brk, PrintScr... L'idéal est
d'écrire une nouvelle int 9 pour ne laisser jamais la main à un
élément extérieur.
Dans tous les cas n'oubliez pas d'effacer le code de protection
devenu inutile en mémoire.
Pour faire un systeme complet de protection, regardez [7] ou
[8].
Gpro Resident Interface (GRI): Guide du programmeur
└───────────────────────────────────────────────────┘
Gpro, lorsqu'il lance l'application laisse un bout de code en
mémoire (à la fin du block reservé ou "en haut" de la RAM).
Cette mémoire protégée contient divers services résidents que le
programme peut appeler par le biais des interruptions (pour
savoir comment appeler une interruption avec un langage de haut
niveau, zieutez dans la doc, souvent une fonction genre int()
existe, sinon essayez de passer par l'assembleur...). Les
interruptions détournées par Gpro sont principalement les int 3h
et 21h. L'int 3 est utilisée par la plupart des debuggeurs comme
BreakPoint, le fait de s'approprier cette int peu les géner,
mais ce n'est pas la le but premier de la manip (en fait, les
debuggers rafraichissent les ints quand ils "swapent" de
l'application au debugger, ou utilisent le mode v86). C'est
l'int 3 qui va faire l'interface entre Gpro et votre
application. L'avantage de l'int 3 c'est que sont OpCode est de
1 octet (CCh, si je ne m'abuse) et qu'ainsi si le cracker veut
changer tous les appels à l'int 3 par des appels à l'int 62h,
par exemple, qu'il peut mieux maitriser, il modifiera tout le
programme (car un appel à l'int 62h, soit CDh 62h, ne tient pas
à la place d'un appel à l'int 3). Souvent, avec un debugger, le
26 Octobre 1994 - Gpro 1.05 4.
programme s'interrompt à l'appel de l'int 3 et le debugger
refuse de la tracer car il croit que c'est un de ses arrets
internes. Il existe des ruses pour déjouer cet artifice, mais
elle sont peu connues et lourdes à mettre en place. Mais
surtout, ces ruses ne déjouent pas les services eux mêmes de
l'int 3, alors... L'int 21h, elle, est détournée pour
prévenir la sortie du programme avec l'int 21h/4ch. La
routine s'expulse de la mémoire et sort proprement du programme.
Bien, aprés cette introduction où certaines choses ont été
précisées, passons au coté programmation.
GRI est donc basée sur l'exploitation de l'int 3. Toutes les
fonctions ainsi documentées sont prêtes à fonctionner dès le
lancement de votre application. Il n'y a aucune initialisation à
effectuer. Bien, pour appeler un service, mettez le numero de la
fonction dans _BX_. Celà diffère des habitudes de DOS ou du BIOS
où les numeros de fonctions sont dans AX mais c'est fait exprés.
En effet, le cracker, au fait des choses du monde, connait
évidemment la ruse classique de l'int 3. Dans beaucoup de
schémas de protections elle est utilisée (c'est le B.A.BA de la
protection sur PC, et donc, incontournable) en remplacement des
interruptions les plus utilisées (soient 21h et 10h), et ne fait
qu'un jmp à la dite interruption. Bien sûr, pour tracer le
programme, il suffit de regarder l'adresse de l'int directement
et de placer CS:IP où il devrait se trouver "légalement". Si le
cracker peut perdre quelques temps avant de comprendre que l'int
3 est un _nouveau_ service, c'est toujours ça de gagné ! En fait
je vous encourage vivement à tromper l'ennemi: par exemple en
faisant juste avant INT 3 un truc du genre mov ah,30h ou
autres...( bande de vicieux, va! ).
Bon maintenant, les choses serieuses commencent:
================================================================
bx=0000 - StartChrono - Démarre le chronometre
Entrée: néant
Sortie: ax=4848h si tout va bien
Cette fonction permet d'initialiser le chronometre. Le
chronometre permet de mesurer le temps (?!?! je lis ce que
j'écris des fois !!) mis pour l'éxecution d'une commande. Ainsi,
une routine d'analyse d'un code d'entrée ou autre peut savoir si
elle est tracée ou pas. En effet, un cracker mettra forcement
beaucoup plus de temps à regarder les instructions pas à pas que
si la routine était executée "en direct". Elle marche de paire
avec la fonction 0001.
================================================================
bx=0001 - CheckChrono - Vérifie le chronometre
Entrée: cx=temps en 1/18.2 secondes
Sortie: ax=a246h si tout va bien
Retour déguelasse si le temps est écoulé (le but est de
26 Octobre 1994 - Gpro 1.05 5.
planter le debugger !!)
Cette fonction vérifie si le temps écoulé entre 2 points du
programme n'est pas "illégal". L'unité utilisée est 1/18.2
secondes, si la valeur de cx est inferieure au temps écoulé, GRI
rend la main immédiatement, garantissant un plantage systeme
quelques lignes plus loin (c'est le but recherché). Par contre
si le programme se déroule normalement, l'appel de cette
fonction ne se verra même pas.
================================================================
bx=0002 - AppelInt3 - Appel à l'ancien gestionnaire de l'int 3
Entrée: néant
Sortie: ??
Permet au programme d'utiliser un programme résident autre que
GRI qui utilise aussi l'int 3 (c'est trés rare, mais c'est au
cas où). Le registre bx est sacrifié, désolé...
================================================================
bx=0003 - PlanteSys - Plante completement le systeme
Entrée: néant
Sortie: are you jokin' ?
Ouais, vous savez le faire, mais cette routine efface toute
preuve permettant un BackTrace pour localiser la faille et jmp
"aléatoirement" dans la mémoire: plantage assuré pour tout
utilisateur frauduleux !
================================================================
bx=0004 - CheckInstall - Verifie si GRI est bien actif
Entrée: néant
Sortie: ax=726fh si GRI est actif et valide
================================================================
bx=0005 - CheckDebug - Regarde si un debugger est en mémoire
Entrée: ax=0000 : Appel PlanteSys si un debugger est trouvé
ax<>0000 : Résultat dans bx
Sortie: bx=4148h si un debugger est actif
bx=5858h si pas de debugger
================================================================
bx=0006 - StopDebug - Arrete le debugger si présent
Entrée: néant
Sortie: néant
Permet de rendre la main au debugger. L'interet de cette
fonction est d'arreter momentanément le déroulement du
programme. Ce n'est interressant que si le Chronometre est en
26 Octobre 1994 - Gpro 1.05 6.
marche: le cracker laisse écouler un temps qui peut lui être
fatal... Surtout n'appelez pas inconsiderement cette fonction,
par exemple, hors d'une boucle de temps.
================================================================
Int 60h - Verifie l'integrité de GRI
Entrée: néant
Sortie: ax=5343h si tout va bien
Verifie si les fonctionnalités de GRI n'ont pas été modifiées
par un calcum de checksum. Si la somme de contrôle n'est pas
valide, le systeme se plante.
================================================================
Int 21h ah=4c - Terminer le programme
Entrée: al= code de sortie
Sortie: néant
Pour terminer votre programme, la fonction 4c de l'interruption
21h doit être utilisée (c'est la méthode utilisée par la plupart
des compilateurs actuels). GRI s'enlevera de la mémoire et la
place sera nette pour de nouvelles aventures...
NB: Les plantages du systeme des diverses fonctions sont des
plantages "propres" en ce sens ou il n'y a aucun risque de
destruction ou de perte de données hors celles en mémoire du
programme en cours.
Installation de Gpro
└────────────────────┘
L'installation de Gpro au sein d'un programme se fait en deux
temps: tout d'abord vous devez rajouter les fonctionnalités de
GRI un peu partout dans votre programme, ensuite, aprés
compilation, utilisez GPRO.EXE. La syntaxe est la suivante:
GPRO NomDeFichier[.exe]
Ceci modifiera le programme NomDeFichier.exe en ajoutant le
loader (l'installation de GRI est alors automatique).
L'utilisateur n'aura rien de plus à faire qu'avant: entrer le
nom du programme le fait executer immédiatement, pas besoin de
charger de résidents. Pour les programmeurs en Pascal, l'unit
GPRO.PAS vous permetra d'intégrer à vos programmes Pascal Gpro.
Elle fonctionne exactement comme GRI.
26 Octobre 1994 - Gpro 1.05 7.
Validité de la protection
└─────────────────────────┘
Gpro est muni de puissants outils anti-debugging, aussi bien en
interne, lors de la phase de chargement du programme que dans
GRI. Gpro est capable de détecter la présence de debuggers en
mémoire. Il y a deux types de détections: signature et
"heuristic".
La méthode par signature détecte les débuggers courants ( parmi
lesquels Turbo Debugger, Periscope, ICE, les debuggers Phar
Lap...).
La méthode heuristic, reconnais en "dynamique" la présence d'un
débugger ( code douteux en mémoire...). C'est le même systeme
que pour la detection de virus.
J'ai testé en mode signature les debuggers:
* Turbo Debugger 3.2, 4.0
* Turbo Debugger 286 3.2, 4.0
* Turbo Debugger 386 3.2, 4.0
* Periscope (EM) 5.00, 5.31
* Periscope Hard Model 1 rev 3A
* 386|SRCBug
* ADX Debug
En mode heuristic:
* DOS 6.22 DEBUG (??)
* Microsoft Code View 386
* GameTools 3.21
* The Game Wizard
Soit un taux de réussite de 100%, il y a gros à parier que Gpro
marche aussi avec des debuggers que je n'ai pas testé.
Pour ceux qui croient encore dans les sourcers et autres, j'ai
testé Sourcer et même Hacker's View. Pas plus de réussite.
Bugs report
└───────────┘
J'ai porté une grande attention, comme le necessite un programme
comme Gpro, aux diverses erreurs de programmations et autres
bugs. Je n'en ai pas trouvés de flagrants (j'ai testé Gpro avec
des programmes de manipulations de fichier, affichages
graphiques, disagnostiques d'erreurs etc...), mais si vous avez
un probleme quelconque n'hésitez pas à me le faire savoir. Il y
a quelques petites choses à préciser tout de même:
* certains compresseurs d'éxécutables (il n'y en a pas
des masses, vous trouverez facilement desquels je veux
parler...) copie leur code en mémoire, dans un endroit
qui ne leur est pas réservé. Il se peut qu'ils écrasent
GRI et dans ce cas un plantage est assuré. Ce n'est pas
la faute de Gpro, je réserve la mémoire que j'utilise (on
26 Octobre 1994 - Gpro 1.05 8.
ne dirait pas pourtant à la vue du source, eh eh...).
* Pour des raisons d'éléctronique, Gpro n'est pas
completement compatible avec les copro arithmétiques.
Leur présence est completement tolérée, mais leur
utilisation ne garantie pas une stabilité parfaite du
systeme.
* Gpro détourne l'int 4 (interruption d'overflow) pour
éviter quelques mauvais tours de la part du cracker (
cette int aurait put permettre, de part certaines
caractéristiques perverses, de penetrer plus avant dans
le code ). Son utilisation est heureusement rare avec les
compilateur modernes.
* Au lancement, Gpro marque un temps d'arret, c'est
normal, le CPU mouline pendant environ 1/6 de seconde (
insupportable comme attente!! ) avant de rendre la main.
C'est parce que le chargement est si "lent" qu'il est
difficile à tracer.
Enfin, si Gpro marche sur une machine, il marchera sur toutes.
Si le soft est compatible ( ie avec les reserves ci-dessus ),
alors il n'y aura pas de blèmes.
Gpro a été testé sur plusieurs systemes et configurations
différentes:
* Processeurs: 386 DX, 486 DX, i486DX2, AMD 486DX2,
Pentium P90;
* Mémoires: 80ns, 70ns, 4Mo -> 32 Mo;
* BIOS: AMI, Award, Phoenix;
* Bus: ISA, VLB, PCI;
* OS: MSDOS 6.0, MSDOS 6.2, MSDOS 6.22, IBM DOS 6.0;
* Configurations: EMM386, HIMEM etc...
Bibliographie
└─────────────┘
Pour programmer Gpro, il m'a fallu pas mal de docs techniques
dont:
[1] "LA BIBLE PC", Michael TISCHER, Editions Micro Application
ISBN:2-86899-663-9
Pas mal du tout pour les structures DOS, un résumé des
interruptions et tout ce qui concerne la programmation systeme
sur PC
[2] "TURBO ASSEMBLER", Memento et Guide du programmeur, BORLAND
Pour les trous de mémoires, l'optimisation et les OpCodes
[3] "Interrupt List R41", Ralf Brown, ralf@telerama.lm.com
26 Octobre 1994 - Gpro 1.05 9.
Indispensable pour tout connaitre sur les interruptions et le
DOS.
[4] "8086 Bugs list", Harald Feldmann,harald.feldmann@almac.co.uk
[5] "Le Livre d'or PC", Martin ALTHAUS, Editions SYBEX
ISBN:2-7361-0951-1
original: ISBN:3-88745-263-1
Trés bien pour les cotés hardwares et purement techniques.
[6] La série des "CD-ASC" du DP Tool Club
Une mine d'or pour le programmeur avide de renseignements
pointus, techniques ou peu répendus. Contient aussi gavé de
jeux pour calmer les nerfs...
[7] "Plombeur 1.5" Permet de mettre une protection physique sur
une disquette, à l'instar de protections type EVMOVE, mais en
shareware !! Ici aussi l'utilisation de GPRO s'impose vu
qu'aucune protection du logiciel n'est prévue. Contactez:
Pascal Leuwers
52 Bd Basly
62670 Mazingarbe
France
Tel:+33-21-72-50-62
[8] "Protect" Même chose que [7], même sanctions.
Chan Piu Nicolas
28 rue Charles Montaland, Bat 2
68100 Villeurbanne
France
[9] Cette doc est tapée avec Breeze (c) Kevin Solway 1989-93.
Le source assembleur est tapé avec Professional Editor II
d'IBM.
Le code Pascal est fait avec Borland Pascal 7.
26 Octobre 1994 - Gpro 1.05 10.
La minute légale
└────────────────┘
!! ATTENTION !!
L'AUTEUR NE PEUT EN AUCUN CAS ETRE TENU RESPONSABLE DES DOMMAGES
CREES PAR L'UTILISATION DE GPRO. GPRO EST UN LOGICIEL LIVRE DANS
LE SHAREWARE PAR GUILLAUME PERNOT. TOUTE UTILISATION DE GPRO
(INCLUANT LE PROGRAMME ET LES DONNEES) A DES FINS COMMERCIALES
(TELLES QUE LA VENTE DE LOGICIELS TRAITES PAR GPRO ETC) DOIT
FAIRE L'OBJET D'UN ENREGISTREMENT AUPRES DE L'AUTEUR ET
L'ACQUITTEMENT DE LA SOMME DE 490 FF, CECI UNE FOIS POUR TOUTES,
PAR LA PERSONNE PHYSIQUE OU MORALE BENEFICIANT DES VENTES
(EDITEUR OU PROGRAMMEUR). CE DROIT EST ENSUITE VALABLE A VIE, LA
PERSONNE PHYSIQUE OU MORALE AINSI ENREGISTREE POURRA UTILISER
GPRO AVEC TOUS LES LOGICIELS QU'ELLE DESIRE DIFFUSER ET CE
AUTANT DE FOIS QU'ELLE LE DESIRE. AUCUN DROIT D'UTILISATION
RELATIF AUX VENTES OU AUX REVENUS N'EST DU. BREF, VOUS SORTEZ
LA THUNE UNE FOIS POUR TOUTES ET ON EN PARLE PLUS. DANS LE
CAS D'UNE UTILISATION EN VUE DE LA DIFFUSION EN
SHAREWARE, LA LICENSE FIXEE ARBITRAIREMENT A 90 FF SUFFIT
QUELQUE SOIT LE LOGICIEL. LA AUSSI JE VAIS QUAND MEME PAS VOUS
TAPER DES RONDS SUR LE BOULOT QUE VOUS AVEZ FAIT, QUAND MEME.
BON, SI LE PROGRAMME TRAITE PAS GPRO DOIT ETRE LIVRE A LA
COMMUNAUTE INFORMATIQUE SOUS FORME DE FREEWARE OU TOUT AUTRE
DISTRIBUTION SANS REVENUS, ALORS AUCUN DROIT D'ENREGISTREMENT
N'EST REDEVABLE A L'AUTEUR. VOUS ME CROYEZ SI JE VOUS DIT QUE JE
COMMENCE A AVOIR MAL AU PETIT DOIGT DROIT, RIVE SUR LE SHIFT ?
DANS TOUS LES CAS, GPRO, DANS SON ENSEMBLE (PROGRAMME, DONNEE ET
DOCUMENTATIONS) REVIENDRA AU DOMAINE PUBLIC A COMPTER DU 31 AOUT
1996. A PARTIR DE CETTE DATE, AUCUN DROIT D'UTILISATION NE SERA
REDEVABLE, MAIS JE VOUS AVERTIS QUE J'ACCEPTERAIS ENCORE LES
CHEQUES DE GENEREUX MECENES. PAR CONTRE, LES DROITS DU PROGRAMME
ET DU SOURCE SERONT TOUJOURS LA PROPRIETE DE L'AUTEUR. PAR
CONTRE, L'AUTEUR NE POURRAIT ETRE TENU RESPONSABLE DE DEGAS
SUBITS A LA SUITE DE L'UTILISATION DE GPRO.
26 Octobre 1994 - Gpro 1.05 11.
Le mot de la fin
└────────────────┘
Gpro m'a demandé pas mal de boulot. En fait j'y travaille de
temps en temps depuis 2 ans, rajoutant des techniques, des
ruses, etc. La premiere version appelée PRO TEN ne traitait que
les fichiers COM (pas génial, quoi), mais plantait déjà les
debuggeurs en mode protégé et les cartes debuggers (Periscope
et cie). Elle a remporté le Grand Prix catégorie Lycée (eh
ouais, ça fait longtemps...) au concours internationnal "Soft
Qui Peut" de Poitier en Octobre 1992.
Pour les gars qui utilisent Gpro pour leurs logiciels freewares,
ça serait cool qu'ils m'envoient leurs oeuvres ou du moins un
signe de vie (une carte, une lettre, une vache...). Tiens au
fait, si quelqu'un a ses entrées à l'Ecole des Mines de Nantes,
ce serait super sympa de me contacter (pour le concours
1994-1995). Allez, au revoir !
GuILlaUmE