|
3D Exploration
Thanks for your interest in 3D Exploration.
Version 1.03
(dit le Jules)
C'était encore une de ces nuits dégeulasses , il tombait des hallebardes à pas mettre un Suisse
du Vatican dehors, et il valait mieux savoir nager que marcher pour circuler dans cette ville pourrie.
J'avais rencard dans un clandé avec une voix. Ce genre de voix qui vous appelle au beau milieu de la nuit
et qui vous fait courir à l'autre bout du monde sans plus d'hésitations qu'un chacal devant une charogne
bien puante.
La fille était gironde. On pouvait pas dire mieux, une espèce de croisement entre Marilyne Monroe
et Pamela Anderson à vous donner envie de vous réincarner en soutien pare-chocs…
J'avais du mal à me concentrer sur son problème, et le mien commençait à prendre des
proportions embarrassantes dans mon pantalon.
Ce que j'avais pu retenir de ce que m'avait dit la poule, c'est qu'elle avait des soucis avec un Jules qui refusait
de l'enregistrer, et elle n'avait plus que trente jours pour trouver une solution.
Marlowe renfonça ses yeux dans ses orbites, ramassa sa langue qui pendait sur la table, et lui posa deux
trois questions. Le Jules qui lui posait un problème exigeait qu'on lui remplisse un formulaire avec un
nom, une adresse mail, et un numéro d'enregistrement. En échange, il enlevait tous les "UNREGISTERED
VERSION! Please register your personal copy." présent un peu partout, dans le bandeau d'écran,
et levait la Time Limit.
Marlowe se frotta les mains, à défaut de pouvoir le faire sur les courbes de la blonde incendiaire.
L'affaire se présentait facile, et il pensa qu'il lui faudrait pas plus de temps pour résoudre cet
enigme, qu'un voleur à la tire pour vous secouer votre morlingue.
Tôt le lendemain matin, je suis allé voir le Jules et demanda à remplir un formulaire du même
type que celui de ma cliente. Comme je pouvais décemment pas y mettre mon blaze, je décidais d'y
graver le premier nom qui me passa par la tête. Dans le premier champ j'écrivis "Bave de Crapeaux",
dans le second serpent@plumes, mais le troisième me posa un cas de conscience. Le bouton qui me permettrait
de valider mon formulaire était grisé. Fallait improviser.
Au flan, je tentais de rentrer un code bidon en observant les réactions du julot. Au 12ème chiffre,
je vis un éclair s'allumer dans le regard vitreux du gras-double strongominé, et le bouton s'activa.
Mais rien à faire, on me balança un message d'erreur. Je rangeais mes cannes et décidais de
trouver mieux.
Dans le bar d'à coté, je demanda au loufiat qui trônait derrière son comptoir, astiqué
comme un miroir de bordel, de bien vouloir me donner la liste des String Datas References, mais même en montrant
de façon ostentatoire mon Wdasm calibre 8.93, je n'obtins rien du tout.
L'affaire allait être plus compliquée que prévue. Le Jules semblait bénéficier
de protections…
J'allais voir mon vieux pote ProcDump, inspecteur à la crime, pour lui soutirer l'information suivante:
CODE 00043000 00001000 0001E800 00000400 C0000040
DATA 00008000 00044000 00002200 0001EC00 C0000040
.tls 00001000 0004C000 00000000 00020E00 C0000040
.rdata 0004D000 00000200 00020E00 00020E00 C0000040
.INIT 00002000 0004E000 00000A00 00021000 C0000040
.idata 00001000 00050000 00000400 00021A00 C0000040
.edata 00001000 00051000 00000400 00021E00 C0000040
.reloc 00003000 00052000 00000E00 00022200 C0000040
.rsrc 0004D000 00055000 00012E00 00023000 C0000040
PEPACK! 00003000 000A2000 00001200 00035E00 C0000040
D'un coup d'œil, je visais le PEPACK!. Une p'tite frappe tout juste bonne à
détrousser les vieilles, derrière une poubelle. Une vielle connaissance aussi, le genre qui vous
compresse un Jules pour cacher la misère…
Histoire de savoir à qui j'avais affaire exactement, je fis un détour par le bureau de HexWorkShop,
qui me donna le pédigré exact de PEPACK:
.. -=. PE-PACK v1.0
-.- (C) Copyright 19
98 by ANAKiN .=- ...
Discrètement, j'échangea les C000040 par des E0000020, et retourna
voir le bistroquet. Cette fois ci en lui enfonçant mon Wdasm dans le groin, j'obtins un peu plus d'informations.
C'est fou comme on respire mieux quand on a les naseaux grand ouvert…
/******************** Program Entry Point ********
:0041F74A 7400 je 0041F74C
Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041F74A(C)
|
:0041F74C E9AF280800 jmp 004A2000
:0041F751 00000000000000000000 BYTE 10 DUP(0)
:0041F75B 00000000000000000000 BYTE 10 DUP(0)
:0041F765 00000000000000000000 BYTE 10 DUP(0)
:0041F76F 00000000000000000000 BYTE 10 DUP(0)
Mais toujours pas de Strings Data, et des codes pas très engageants…
Pour avoir déjà connu une situation comme celle ci je savais qu'un Dump du Jules en mémoire
ne me permettrait pas de faire tourner le soft ni vu ni connu, mais que j'obtiendrais la liste convoitée.
Pour commencer, il fallait retrouver la trace que laissait toujours derrière lui PEPACK. En fouillant dans
un vieux script de ProcDump, je remis la main dessus: 61 FF E0.
Il restait plus qu'à chercher un peu avec un hexéditeur, poser un CC (int 03) à la place du
61 (Popad), et de planquer en attendant de prendre la p'tite gouape la main dans l'sac.
Equipé d'un BPINT 03 et de mon SoftIce calibre 4.1, j'ai attendu patiemment. Pas longtemps:
017F:004A225F 8B8557050000 MOV EAX,[EBP+00000557]
017F:004A2265 03858B050000 ADD EAX,[EBP+0000058B]
017F:004A226B 8944211C MOV [ESP+1C],EAX
017F:004A226F 61 POPAD > à remettre à la place du CC
017F:004A2270 FFE0 JMP EAX
017F:004A2272 8D85CE050000 LEA EAX,[EBP+000005CE]
017F:004A2278 50 PUSH EAX
Ce genre de petite frappe se déballonne en moins de temps qu'il n'en faut
pour qu'une pro vous fasse une gâterie sous une porte cochère, le pantalon sur les chevilles…
En deux temps trois mouvements, j'avais remplacé le jmp EAX par un jmp EIP, et envoyé PEPACK tourner
sur lui-même comme une girouette par une nuit de tempête.
Au passage je lui avait soutiré une info, dans EAX j'avais trouvé l'adresse de la porte d'entrée
du julot: 00401000, un classique!
Pendant que PEPACK jouait au chien qui se mord la queue, je me suis précipité chez ProcDump. En entrant
dans son bureau, j'ai repéré le Jules par la fenêtre des tâches, et demandé un
DUMP FULL, avec l'option Rebuilt new Import, puis j'ai sauvé le nouvel exécutable. Le gras du bide
pris encore du poids est passa de 224 à 631 ko. PEPACK ne m'étant plus d'aucune utilité pour
le moment, je l'ai envoyé au pays de Morphée en faisant un Kill Task brutal.
A partir de ma copie décompressée du Jules, j'ai pu entrer dans son antre sans l'ombre d'un problème,
et obtenir enfin la liste des String Data references. L'une d'elles retint immédiatement mon attention:
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:OO426C5A(U), :O0426C89(U), :OO426CA3(C)
|
:O0426CAD 803DOB59440000 cmp byte ptr [OO4459OB], OO > Flag Utilisateur?
:00426CB4 7511 jne OO426CC7
* Possible StringData Ref from Data Obj ->" - UNREGISTERED"
|
:O0426CB6 688C664400 push 0044668C
:O0426CBB 8D8DFCFEFFFF lea ecx, [ebp+FFFFFEFC]
:00426CCl 51 push ecx
:OO426CC2 E87BCD0100 cal1 00443A42
Et là, ca a fait tilt dans ma cafetière. Du premier coup j'avais sous
les mirettes tout ce qui ressemblait à un beau drapeau Utilisateur.
Histoire de piéger le Jules, j'ai posé un Break on Memory (BPM) sur 0044590B, et je me suis remis
en planque avec mon SoftIce:
:OO42EF99 52 push edx
:0042EF9A 8D8D4OFFFFFF lea ecx, [ebp+FFFFFF4O]
:0042EFAO 51 push ecx > notre code
:O042EFA1 E87D5COOOO call 00434C23 > vérif du code
:0042EFA6 83C408 add esp, 00000008
:O042EFA9 A20B594400 mov [OO44590B], al > 0 ou 1 en fonction du statut
:OO42EFAE 25FFOOOOOO and eax, 000000FF
:O042EFB3 EB02 jmp 0042EFB7
Encore mieux!
Un couple de secondes plus tard, j'avais coincé l'un des portes flingue du Julot
Le code bidon que j'avais fourgué au Jules, étant dans la poche d'ECX. Clair que le call suivant
était celui dans lequel il fallait faire une descente, et trouver ce qui pouvait bien se maquer dans AL!
En descendant les marches qui menaient au Call, j'avais enlevé mes pompes, et ces en F10 que je continuais
ma recherche.
017F:00434C95 50 PUSH EAX
017F:00434C96 E84DED0000 CALL 004439E8
017F:00434C9B 83C40C ADD ESP,0C
017F:00434C9E 8B5508 MOV EDX,[EBP+08] > adresse de notre code dans EDX
017F:00434CA1 8A0A MOV CL,[EDX] > 1er caract du code dans cl
017F:00434CA3 3A4DF8 CMP CL,[EBP-08] > compare avec contenu de ebp-8 (0)
017F:00434CA6 7512 JNZ 00434CBA > modif possible
017F:00434CA8 8B4508 MOV EAX,[EBP+08] > notre code dans EAX
017F:00434CAB 8A5001 MOV DL,[EAX+01] > 2eme caractère du code
017F:00434CAE 3A55F9 CMP DL,[EBP-07] > compare avec 8
017F:00434CB1 7507 JNZ 00434CBA > c'est ok ?
017F:00434CB3 B801000000 MOV EAX,00000001 > Eax=1 Glop!
017F:00434CB8 EB02 JMP 00434CBC > évite le Xor
017F:00434CBA 33C0 XOR EAX, EAX > Eax=0 Pas Glop!
Etc...
017F:00434CC2 C3 RET
D'un seul coup, je tombe sur le paletot de deux minables en train de faire joujou
avec mon code bidon.
En leur agitant mon SoftIce sous le nez, y se sont mis à table plus vite que la vérole saute sur
le bas clergé. [EBP-08] avait juste à comparer le premier caractère de mon code, et [EBP-07]
le second. En secouant un peu les deux gigolpinces, il crachèrent le morceau. Si le code que j'avais entré,
calculé à partir de mon nom et de mon mail, avait commencé par 08 suivi de 10 chiffres bidon,
j'aurais pu obtenir le "protection passed", et un beau diplôme à la clé:
félicitations
Version 1.03 Jul 16 1999
Copyright (c) 1999 X Dimension Software
This program is licensed to:
Bave de Crapeaux Email:serpent@plumes
Je l'aurais rangé avec les autres dans mon tiroir HKEY_LOCAL_MACHINE/Software/
X Dimension/3D Exploration/Register
Mais c'est pas pour moi que je bossais, mais pour les yeux d'une blonde. J'avais plusieurs solutions, Eax étant
toujours égale à 2 en arrivant sur le Xor Eax, Eax, je pouvais faire:
017F:00434CBA 48 DEC EAX
017F:00434CBB 90 NOP
Pour obtenir un AL égale à 1, ou encore de détourner l'aiguillage en 00434CA6 par un 750B
JNZ 00434CB3, de nopper les deux branchements, de faire un jmp 00434CB3 en 00434CBA …
Dans ces cas là, faut faire comme on l'sent!
Il restait à convaincre le Jules de se faire modifier sans qu'il s'en rende compte.
Comme ca faisant un bout que je voulais essayer un truc d'un copain, j'ai décidé de me créer
une planque dans la dernière section du Jules, au bout de mon pote PEPACK.
Pour ça, j'avais qu'à insérer 0x1000 bytes a la fin du fichier, en utilisant HexWorkShop,
et placer mon curseur à la queue de tout ça. En cliquant avec le bouton droit de ma souris, j'ai
sélectionné "Insérer". J'ai mis un 1000, en cochant Hexa, et j'ai fais OK pour rajouter
du code.
Après ça, je suis repassé chez ProcDump, pour cliquer sur PE Editor et sélectionner
le nom du Jules modifié. Un Clic sur Section, puis un Right-click sur PEPACK et j'ai pu modifier les PSize
et VSize à 2000. J'avais maintenant toute la place nécessaire pour y faire les noubas que je voulais
sans que les voisins débarquent…
Restait juste deux-trois bricoles à régler:
004A225F 8B8557050000 MOV EAX,[EBP+00000557]
004A2265 03858B050000 ADD EAX,[EBP+0000058B]
004A226B E9070D0000 JMP 004A2F77 > vers l'@ du patch
004A2270 FFE0 JMP EAX
004A2272 8D85CE050000 LEA EAX,[EBP+000005CE]
004A2278 50 PUSH EAX
D'abord détourner l'attention, en envoyant PEPACK vers mon nid d'amour, avant
qu'il aille chez le Jules
Patch
004A2F75 0000 ADD [EAX],AL > place dispo
004A2F77 66C705BA4C43004890 MOV WORD PTR [00434CBA],9048 > modif
004A2F80 8944241E MOV [ESP+1E],EAX > octets écrasés
004A2F84 90 NOP
004A2F85 FFE0 JMP EAX > passe le relais au Soft
004A2F87 0000 ADD [EAX],AL > place dispo
Et ensuite, balancer ma petite modif, replanter le décor en commençant
par réécrire les orpions que j'avais écrasés, et envoyer le tout au Jules.
En trainant dans les bars à la recherche de mon égérie, j'ai fini par tomber dessus.
Y a des moments ou la vie peut être bath. Elle m'a sauté au cou, en m'annonçant que son Jules
la considérait comme
This program is licensed to:
Bave de Crapeaux Email:serpent@plume
Et que toutes les limitations étaient levées.
Je vous raconte pas comment j'en ai profité pour me balader sur le terrain…
Philippe Marlowe
|