Protection
  ASPack 2000  

Les Protections Renforcées

 Outils
  ProcInfo Wdasm SoftIce  

http://www.xdsoft.com/

 Cible
  3D Exploration  

By Christal

3D Exploration 1.2.54

Ouaip, heu !
Salut…
Dis, comment qu'on peut faire pour cracker 3D Exploration ?


Aller sur Astalavista ?

Ouaip, non, hé !
Moi ce que je veux c'est apprendre comment qu'y faut faire…


Motivé, hein ?
Bon, imaginons que la cible soit malade…
Par quoi faudrait il commencer…

Heu, ben…
Aller voir un toubib ?


C'est toi le toubib !

Heu, éditer les faire-parts de décès ?

Un peu radical !
On peut pas lui laisser une chance de guérir, à ton programme ?

Ben, alors on regarde ce qui va pas…

C'est parti !

La phase Diagnostic :

Prenons la température du patient:

Infection :

UNREGISTERED

dans le bandeau d 'écran

Un item
REGISTER dans le menu HELP, et

UNREGISTERED VERSION
Please register your personal copy.

Dans la boite About

Ca pourrait être une poussée d'urticaire…
Classique, en somme…

Voyons du coté de la boite d'enregistrement.
Dites Haaaaaaaaa !
Mais, mais, mais….
Je vois une tâche, là….
Le bouton " REGISTER " est grisé.

Essayons un truc simple :
Remplir l'unique champ de la boite d'enregistrement par un sérial, en espérant que le bouton va se dégriser…

Bon, fausse alerte !
Au onzième caractères, le bouton devient actif.
On valide, et

3D Exploration must be rebooted to check some key data.
Please restart 3D Exploration.

Fâcheux comme réaction !
Une recherche de serial (serial fishing) risque de poser un soupçon de difficulté…

Passons le malade au spectromètre :
Pas Glop ! Pas Glop !

Wdasm plante !

Mais en fait, c'est qu'il aurait peut être bien une chtouille carabinée, votre malade…
Utilisons un scanner

ProcDump by G-RoM, Lorian et Stone :

.text      0006C000    00001000    0002C600    00000600    C0000040
.data      0000D000    0006D000    00002E00    0002CC00    C0000040
.tls       00001000    0007A000    00000200    0002FA00    C0000040
.rdata     00001000    0007B000    00000200    0002FC00    C0000040
.idata     00003000    0007C000    00000C00    0002FE00    C0000040
.edata     00001000    0007F000    00000400    00030A00    C0000040
.reloc     00004000    000E1000    00000000    00046000    C0000040
.aspr      0001F000    000E5000    0001EC00    00046000    C0000040
.rsrc      00001000    00104000    00000000    00064C00    C0000040

Oula !
Mais c'est qu'il est pas en forme ce programme :
Toutes les sections sont à
C000040, et une section .aspr est présente.
Ca m'a tout l'air d'une attaque ASPackienne aiguë, ce truc…

Et bien, on va commencer par opérer en douceur, en manuel

La phase Curative:

A l'aide de ProcInfo, by TeeJi, on va modifier les
caractéristiques de la première section :

Name
VirtuaI Size
VirtuaI Address
Size Of Raw Data
Pointer To Raw Data
Pointer To Relocation
Pointer To Linenumber
Number Of Relocations
Number Of Linenumbers
Characterstics
.text
0006C000
00001000
0002C600
00000600
03E4B1FD
03E4B20B
B219
03E4
E0000020

Après cette petite anesthésie locale, voyons ce qu'on va découvrir :

:004E5001  60                  PUSHAD
:004E5002  E801000000          CALL    004E5008
:004E5007  90                  NOP
:004E5008  5D                  POP     EBP

Une classique entrée de programme packé. Rien d'alarmant pour le moment.
Rassurez la famille !

En avançant pas à pas, (infirmière, passez-moi F10) :

3D Exploration File corrupted !

Ouch !
Tension les gars, va nous faire un arrêt cardiaque !

Bene !
Le prog à un CRC.
Méchante chose ça.
Très contagieux en ce moment qui plus est !

En va enlever la tumeur, mais pour commencer, voyons si l'infection est généralisée :

BPX GetProcAddress :
Glop !

Droit dessus

:BFF70000 4D 5A 90 00 03 00 00 00-04 00 00 00 FF FF 00 00  MZ..............
:BFF70010 B8 00 00 00 00 00 00 00-40 00 00 00 00 00 00 00  ........@.......
:BFF70020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
:BFF70030 00 00 00 00 00 00 00 00-00 00 00 00 80 00 00 00  ................
:BFF70040 0E 1F BA 0E 00 B4 09 CD-21 B8 01 4C CD 21 54 68  ........!..L.!Th
:BFF70050 69 73 20 70 72 6F 67 72-61 6D 20 63 61 6E 6E 6F  is program canno
:BFF70060 74 20 62 65 20 72 75 6E-20 69 6E 20 44 4F 53 20  t be run in DOS
:BFF70070 6D 6F 64 65 2E 0D 0D 0A-24 00 00 00 00 00 00 00  mode....$.......

L'infection part de l'entête du Header (l'adresse 00400000 du programme dont le contenu a été chargé en BFF70000)
En cherchant quelques lignes plus bas, on repère vite la section
.text dont les caractéristiques ont été modifiées :

:BFF701A0 2E 74 65 78 74 00 00 00-05 C9 04 00 00 90 00 00 .text...........
:BFF701B0 00 D0 04 00 00 90 00 00-00 00 00 00 00 00 00 00 ................
:BFF701C0 00 00 00 00 20 00 00 60-5F 49 4E 49 54 00 00 00 .... ..`_INIT...
:BFF701C0 00 00 00 00 20 00 00 60-5F 49 4E 49 54 00 00 00 .... ..`_INIT...

Histoire de voir si le CRC a infecté l'ensemble des tissus, une petite modification dans les codes du programme (une version " saine "), va démontrer que seul le header est atteint.
C'est un moindre mal.

En sortant de l'API GetProcAddress, un " d edx " va donner :

:004E5B9E 56 69 72 74 75 61 6C 46-72 65 65 00 56 69 72 74 VirtualFree.Virt
:004E5BAE 75 61 6C 50 72 6F 74 65-63 74 00 45 78 69 74 50 ualProtect.ExitP
:004E5BBE 72 6F 63 65 73 73 00 00-00 00 00 75 73 65 72 33 rocess.....user3
:004E5BCE 32 2E 64 6C 6C 00 4D 65-73 73 61 67 65 42 6F 78 2.dll.MessageBox
:004E5BDE 41 00 77 73 70 72 69 6E-74 66 41 00 4C 4F 41 44 A.wsprintfA.LOAD
:004E5BEE 45 52 20 45 52 52 4F 52-00 54 68 65 20 70 72 6F ER ERROR.The pro
:004E5BFE 63 65 64 75 72 65 20 65-6E 74 72 79 20 70 6F 69 cedure entry poi
:004E5C0E 6E 74 20 25 73 20 63 6F-75 6C 64 20 6E 6F 74 20 nt %s could not

Gasp !
Serait ce l'obscure éventualité d'une autre tumeur au niveau de l'Import table ?

Il va falloir opérer dans le vif, et pour commencer trouver le call gérant le CRC et affichant la MessageBoxA "
3D Exploration File corrupted ! ", puis envoyant vers un ExitProcess.
Mieux vaut prévenir la famille que le malade est entre la vie et la mort…

Berck !
Du CCA...
Saleté de code polymorphe !
Infirmière, passez-moi F8, il va falloir tracer dans tous les call, hormis les call [registre+adresse]

Le premier relais est passé en EntryPoint+4DC

:004E54DF  6801F0BF00          PUSH    00BFF001
:004E54E4  C3                  RET

Et là, brusque changement.
Le virus s'installe ailleurs...
Bye bye les adresses 004EXXXX, on descend en 00BFF001.
Et bien baptisons ce 00BFF001, ce sera l'EP2

Le relais suivant est en 00BFF5D0 (EP2+5D4)

:00BFF5C5  61                  POPAD
:00BFF5C6  7508                JNZ     00BFF5D0
:00BFF5C8  B801000000          MOV     EAX,00000001
:00BFF5CD  C20C00              RET     000C
:00BFF5D0  680814BF00          PUSH    00BF1408
:00BFF5D5  C3                  RET

En cherchant un peu à partir de cette adresse, le call MessageBoxA/ExitProcess est en :

:00BF06B5 E816F9FFFF     CALL 00BEFFD0      > cochonnerie here !
:00BF06BA 8B45F8         MOV  EAX,[EBP-08]
:00BF06BD E85A22FFFF     CALL 00BE291C0 

Petite ablation discrète, on place un RET à l'entrée du call en question.
Le CRC est OUT !

Glop ! Glop !

Et on part à la recherche du passage vers l'OEP:

En traçant gentiment dans le code, le programme se lance en passant sur le call suivant :

:00BF0B3F E880F9FFFF CALL 00BF04C4 > here
:00BF0B44 5F         POP  EDI      > ressemble pas un 
:00BF0B45 5E         POP  ESI      > une espèce de
:00BF0B46 5B         POP  EBX      > POPAD,
:00BF0B47 59         POP  ECX      > ca ?
:00BF0B48 59         POP  ECX
:00BF0B49 5D         POP  EBP
:00BF0B4A C20400     RET  0004

Dans le call en question, on trouve vite la dernière bébête à éradiquer :

:00BF04E2 61         POPAD
:00BF04E3 EB01       JMP  00BF04E6
:00BF04E5 E850EB02E9 CALL E9C1F03A
:00BF04EA 17         POP  SS
:00BF04EB C3         RET  

Avec EAX egal à un Entry Point Classique : 00401000
Voilà de quoi être sur que l'opération va réussir

Il ne reste plus qu'à changer le ret par un jmp EIP, et faire un Dump Full avec ProcInfo (by TeeJi), puis à remplacer l'OEP :

Entry Point

00001000

Image Base

00400000

L'opération a réussi :
Le dump passe au spectroscope de Wdasm sans sourciller, avec toutes les options Strings Data

Glop ! Glop !
Prévenez la famille, le patient est sauvé !

Et maintenant, lève toi et marche...
Aie !
Y a 2000 ans, ça marchait mieux !

Le dump ne se lance pas, le programme plante ; Prévenez la famille, le patient est handicapé !

A moins que ?
Un instrument n'aurait il pas été oublié dans les codes du malade ?

Pt'et ben que ca s'rait du coté de l'Import Table ?

Vi, vi, scarabée,on va allez voir...

:bpx getprocaddress


Break due to BPX KERNEL32!GetProcAddress

Rapide analyse :
:d edi

:0047CBEE 52 65 67 43 6C 6F 73 65-4B 65 79 00 00 00 52 65 RegCloseKey...Re
:0047CBFE 67 43 72 65 61 74 65 4B-65 79 45 78 41 00 00 00 gCreateKeyExA...
:0047CC0E 52 65 67 44 65 6C 65 74-65 4B 65 79 41 00 00 00 RegDeleteKeyA...
:0047CC1E 52 65 67 44 65 6C 65 74-65 56 61 6C 75 65 41 00 RegDeleteValueA.
:0047CC2E 00 00 52 65 67 4F 70 65-6E 4B 65 79 45 78 41 00 ..RegOpenKeyExA.
:0047CC3E 00 00 52 65 67 51 75 65-72 79 56 61 6C 75 65 45 ..RegQueryValueE
:0047CC4E 78 41 00 05 00 00 52 65-67 53 65 74 56 61 6C 75 xA....RegSetValu
:0047CC5E 65 45 78 41 00 00 00 00-43 6C 6F 73 65 48 61 6E eExA....CloseHan:

Et ca, c'est quoi ca?
Une table d'import qui se fait modifier...
On relève l'adresse du début de celle ci: 0047C000
et on noppe les bidouille que ASPack fait à l'IAT:

:00BF0396 8908     MOV [EAX],ECX
:00BF0398 8B45D8   MOV EAX,[EBP-28]
:00BF039B 8B55E8   MOV EDX,[EBP-18]
:00BF039E 8910     MOV [EAX],EDX > ici
:00BF03A0 EB08     JMP 00BF03AA
:00BF03A2 8B45D8   MOV EAX,[EBP-28]
:00BF03A5 8B55F4   MOV EDX,[EBP-0C]
:00BF03A8 8910     MOV [EAX],EDX > et ici
:00BF03AA 83C604   ADD ESI,04

Il ne resteplus qu'à modifier l'adresse de l'import table (7C000)

Export Table
Import Table
Resource
Exception
Security
Relocations
Debug Datas
Description
GlobaI PTR
TLS table
Load Config
Bound lmport
IAT
0007F000      000002B4
0007C000      000001E4
00080000      00060200
00000000      00000000
00000000      00000000
000E5B74      00000008
00000000      00000000
00000000      00000000
00000000      00000000
000E5CB4      00000018
00000000      00000000
00000000      00000000
00000000      00000000

Allez, on recoud le tout, un p'tit effort…
Prévenez la famille, le patient est guéri !

Quels vont être ces premiers mots ?
UNREGISTERED

Bon, tant pis, on laisse tomber !



Interview de 3DExploration 1.2.54 sur son lit de mort
Par notre reporter spécial: Wdasm

Wdasm: Pourriez-vous vous décrire?

3DExploration: Je suis une Registered Version, c'est à dire que je dois recevoir un code pour continuer à exister.

Wdasm: Comment ca ?

3DExploration: Et bien j'ai une petite boite d'enregistrement, où il faut entrer un code de 11 caractères , pour prolonger mon existence, sinon je suis voué à être remplacé, changé, éradiqué....

Wdasm: Et il n'y a rien à faire?

3DExploration: Si, mais c'est une opération qui présente des risques, et qui est interdite par la loi.

Wdasm: Mais encore?

3DExploration: Voyez-vous, il existe parfois des âmes charitables qui cherchent à nous donner la vie éternelle. C'est totalement immoral.

Wdasm: Comment font-ils?

3DExploration: Voilà. Pour commencer, ils font des examens poussés avec un désassembleur. Ils cherchent l'origine de tous mes maux, comme par exemple le "UNREGISTERED", qui dans mon cas est très grave. Ils utilisent des "String Data Références" pour découvrir à quel endroit exactement le mal se développe. Pour moi tout commence en 0043E834…
Ensuite, ils recherchent comment la tumeur peut se développer. Ils ont rapidement trouvé un jne euthanasiaque en 0043E83B.

:0043E834 E83D41FFFF              call 00432976
:0043E839 85C0                    test eax, eax
:0043E83B 7511                    jne 0043E84E
* Possible StringData Ref from Data Obj ->" - UNREGISTERED"
                                  |
:0043E83D 68EE214700              push 004721EE
:0043E842 8D8DFCFEFFFF            lea ecx, dword ptr [ebp+FFFFFEFC]
:0043E848 51                      push ecx

Wdasm: Vite, la suite!

3DExploration: Doucement, c'est presque la fin! Donc ce saut aurait pu être évité par un test EAX,EAX favorable. Cette opération m'aurait permis de durer éternellement puisque je n'aurais jamais su que je n'étais pas ce que les gens appelle pudiquement "buggé", sans doute une histoire de subconscient...

Wdasm: Pourquoi ne pas l'avoir fait?

3DExploration: Parce que ca n'était pas satisfaisant. Dés le départ j'annonce ma fin à venir avec un rappel Shareware de ma condition dans le bandeau d'écran, dans la boite About, dans le menu Help, et ces tristes rappels auraient probablement fini par m'affliger au plus au point.

Wdasm: Qu'est qu'il aurait fallu faire?

3DExploration: L'idéal aurait été de me faire oublier tout ce qui pouvait faire référence à ma maladie, et dans le call 00432976, il y avait des manipulations sur EAX qui me paraissaient bien prometteuses. Mais ils n'ont rien voulu savoir!

:00432976 55          PUSH EBP
:00432977 8BEC        MOV  EBP,ESP
:00432979 E82BFFFFFF  CALL 004328A9
:0043297E 85C0        TEST EAX,EAX
:00432980 0F94C0      SETZ AL
:00432983 83E001      AND  EAX,01
:00432986 5D          POP  EBP
:00432987 C3          RET

Pourtant il aurait été facile de regarder d'un peu plus près ce AND EAX,01, et de s'intéresser aux conséquences d'une modification de son état en 00432983

Wdasm: Est ce que vous voulez dire que de forcer le registre EAX à 01 vous aurez sauvé?

3DExploration: Peut-être bien qu'un mov AL,01/ NOP...
Remplacer un tout petit 83E001 par un B00190...
Je ne le saurais jamais...

Ce texte est dédié à la personne qui m'avait demandé de l'aider à "visiter" 3D Exploration, et dont j'ai perdu les coordonnées.
Quelle veuille bien m'en excuser.

Bonne Journée

Christal