Professional Documents
Culture Documents
98 et private versions
1 . INTRODUCTION / AVERTISSEMENTS........................................... 3
2 . LE LOADER DE TELOCK 0.98....................................................5
a . Schma du loader sans les protections................................................ 5
b . Schma du loader avec les anti-dumps/anti-debuggers............................ 6
c . Schma complet du loader............................................................... 7
d . Reconstruction de l'IAT du loader...................................................... 8
e . Reconstruction de l'IAT de l'exe.......................................................13
f . Techniques d'anti-debuggage/dsassemblage....................................... 14
1
2
3
4
5
6
.
.
.
.
.
.
Le CCA.................................................................................14
Les Obfuscations.....................................................................14
Les layers de dcryptage...........................................................15
L'anti Software Break Point (BPX) (Protection silencieuse)...................15
L'anti Software Break Point sur APIs..............................................15
L'anti Hardware Break Point (BPM) .............................................. 16
a ) Les Debugs Registers............................................................
b ) Le CONTEXT.......................................................................
c ) Passage de Ring 3 Ring 0 par SEH............................................
L'EXCEPTION_RECORD et le CONTEXT record.............................
7 . CheckSum du header................................................................25
g . Le dcryptage/dcompression des sections du PE................................. 28
0
1
1
2
.
.
.
.
h . Techniques anti-unpacking/anti-dump...............................................31
1 . le mutex.............................................................................. 31
2 . effacement du loader...............................................................31
Page 1
3 . modification du header.............................................................31
Modifier le nombre de sections avec VirtualProtectEx........................
Modifier l'ImageSize en accdant au PEB........................................
4 . redirection de l'IAT/ Effacement des imports.................................. 32
4 . MANUAL UNPACKING........................................................... 36
a . Trouver l'OEP..............................................................................36
Trouver l'OEP avec LordPE ...............................................................
Utiliser ShaOllyScript plugin v0.92 by ShaG............................................
Utiliser le script de loveboom pour les versions 1.xx.................................
b . Dumper l'exe.............................................................................. 39
Comparer les dumps faits avec ProcDump OllyDump LordPE
(Dans les entrailles de ProcDump 1.6f)
c . Reconstruire les imports................................................................ 41
5 . REMERCIEMENTS/SOURCES.................................................... 42
Page 2
1 . INTRODUCTION / AVERTISSEMENTS
Je vous prsente la suite de mon tude sur le packer tElock. Il ne s'agit pas d'une
rptition du travail sur tElock 0.51 et pour preuve, je considre comme acquis ici
toutes les notions vues dans le prcdent article. Ceci s'adresse donc des crackers d'un
niveau intermdiaire qui ont quelques bases en unpacking.
L'tude porte principalement sur tElock 0.98, dernire version publique de ce
petit packer de PE. En tudiant certains Keygens rcents de TMG (septembre 2003), on
peut constater qu'ils sont protgs par une version private de tElock que l'on baptisera
ici tElock 1.xx. Nous tudierons galement les ajouts de ces versions 1.xx.
J'ai d'abord ax mon travail sur la reconstruction des imports (contrairement la
version 0.51 o je n'en ai pas du tout parl). J'ai ensuite travaill sur les nouvelles
techniques d'anti-debuggage, savoir les ANTI-BPM, Les OBFUSCATIONS, les dtections
de certains process via les noms de leurs classes. J'ai encore une fois tudi calc.exe
que j'ai pack en modifiant les options suivant les effets voulus.
Avant de commencer, je vous propose un bref historique des diffrentes versions
publiques de tElock :
???? :
???? :
20 septembre 2000 :
05 octobre 2000 :
12 dcembre 2000 :
27 dcembre 2000 :
28 dcembre 2000 :
6 avril 2001 :
11 juillet 2001 :
18 juillet 2001 :
6 octobre 2001 :
16 octobre 2001 :
18 octobre 2001 :
26 octobre 2001 :
Version
Version
Version
Version
Version
Version
Version
Version
Version
Version
Version
Version
Version
Version
tElock
tElock
tElock
tElock
tElock
tElock
tElock
tElock
tElock
tElock
tElock
tElock
tElock
tElock
0.41b
0.41c
0.42
0.51
0.60
0.70
0.71
0.80
0.85f
0.90
0.92a
0.95
0.96
0.98
A cette petite liste s'ajoutent les versions privates qui comme leur nom l'indique
ne sont pas accessibles au public. Il existe de source sr les versions 0.81, 0.84,
0.99...introuvables sauf peut-tre sur certains keygens de TMG !
Les changements d'une version l'autre ne diffrent que par la place des
procdures, le nombre de layers, le type de SEH. On note quand mme partir de la
Page 3
version 0.98 un anti-BPM. A cela s'ajoute, sur les dernires versions privates de tElock,
un Anti-Olly, Anti-WinDasm, Anti-FileMon, Anti-DD.
Comment reprer tElock ?
Pour chaque version publique de tElock, il existe un unpacker. De plus, PEID
dtecte toutes les versions et les unpacke aisment. En gros, il n'y a quasiment aucun
intrt pratique tudier ce packer sauf peut-tre pour unpacker les private versions !
Le schma de toutes les versions de tElock est toujours le mme : chaque section de
l'exe est crypte, compresse et renomme l'exception des ressources (sauf si l'option
est coche). Le loader est install dans une section ajoute la fin de l'exe. On peut
reprer facilement tElock aux noms des sections. Elles sont nommes de 3 faons
possibles :
Premier cas :
Nom
Nom
Nom
Nom
de
de
de
de
la
la
la
la
section
section
section
section
1
2
3
4
:
:
:
:
1
2
3
4
:
:
:
:
Deuxime cas :
Nom
Nom
Nom
Nom
de
de
de
de
la
la
la
la
section
section
section
section
Autres cas : Les sections n'ont pas de noms ou les sections ont toutes le mme nom. En
ralit, tout ceci dpend de l'option choisie au moment de la compression.
Page 4
Page 5
Page 6
Page 7
Page 9
0101F1DC
0101F1DD
0101F1DE
0101F1E0
0101F1E2
0101F1E4
0101F1EA
0101F1EC
0101F1F3
0101F1F5
0101F1FC
0101F1FE
0101F203
0101F204
0101F205
0101F206
0101F209
0101F20A
0101F20C
0101F20F
0101F212
0101F214
0101F218
0101F21B
0101F21C
0101F21D
0101F21E
0101F220
0101F226
0101F22C
0101F22E
0101F235
0101F237
0101F23E
0101F240
0101F245
0101F247
0101F24D
0101F24F
0101F256
0101F258
0101F25F
0101F261
0101F265
INC EBX
Compteur ECX = 928 fonctions
DEC ECX
JL SHORT calc98.0101F1C6
MOV EAX,DWORD PTR DS:[ESI]
ADD EAX,EDX
CMP DWORD PTR DS:[EAX],64616F4C
JNZ SHORT calc98.0101F226
LoadLibraryA
CMP DWORD PTR DS:[EAX+4],7262694C
JNZ SHORT calc98.0101F226
CMP DWORD PTR DS:[EAX+8],41797261
JNZ SHORT calc98.0101F226
PUSH 3C3
POP EAX
POP EAX
PUSH EAX
SUB ESP,4
PUSH EBX
Remplit l'IAT
ADD EAX,EDX
MOVZX EBX,WORD PTR DS:[EBX]
MOV EBX,DWORD PTR DS:[EAX+EBX*4]
ADD EBX,EDX
MOV EAX,DWORD PTR SS:[ESP+4]
MOV DWORD PTR DS:[EAX+EBP],EBX
POP EBX
POP EAX
DEC EDI
JNZ SHORT calc98.0101F1D8
JE calc98.0101F40B
CMP DWORD PTR DS:[EAX],74697845
JNZ SHORT calc98.0101F247
ExitProcess
CMP DWORD PTR DS:[EAX+4],636F7250
JNZ SHORT calc98.0101F247
CMP DWORD PTR DS:[EAX+8],737365
JNZ SHORT calc98.0101F247
PUSH 3C7
JMP SHORT calc98.0101F203
CMP DWORD PTR DS:[EAX],74726956
JNZ SHORT calc98.0101F26E
CMP DWORD PTR DS:[EAX+4],416C6175
VirtualAlloc
JNZ SHORT calc98.0101F26E
CMP DWORD PTR DS:[EAX+8],636F6C6C
JNZ SHORT calc98.0101F26E
CMP BYTE PTR DS:[EAX+C],0
JNZ SHORT calc98.0101F26E
Page 10
0101F267
0101F26C
0101F26E
0101F274
0101F276
0101F27D
0101F27F
0101F286
0101F288
0101F28D
0101F292
0101F298
0101F29A
0101F2A1
0101F2A3
0101F2AA
0101F2AC
0101F2B1
0101F2B6
0101F2BC
0101F2BE
0101F2C5
0101F2C7
0101F2CE
0101F2D0
0101F2D5
0101F2DA
0101F2E0
0101F2E2
0101F2E9
0101F2EB
0101F2F2
0101F2F4
0101F2FB
0101F2FD
0101F304
0101F306
0101F30B
0101F310
0101F316
0101F318
0101F31F
0101F321
0101F328
PUSH 3CB
JMP SHORT calc98.0101F203
CMP DWORD PTR DS:[EAX],74726956
JNZ SHORT calc98.0101F292
CMP DWORD PTR DS:[EAX+4],466C6175
JNZ SHORT calc98.0101F292
CMP DWORD PTR DS:[EAX+8],656572
JNZ SHORT calc98.0101F292
PUSH 3CF
JMP calc98.0101F203
CMP DWORD PTR DS:[EAX],61657243
JNZ SHORT calc98.0101F2B6
CMP DWORD PTR DS:[EAX+4],754D6574
JNZ SHORT calc98.0101F2B6
CMP DWORD PTR DS:[EAX+8],41786574
JNZ SHORT calc98.0101F2B6
PUSH 3D3
JMP calc98.0101F203
CMP DWORD PTR DS:[EAX],6E65704F
JNZ SHORT calc98.0101F2DA
CMP DWORD PTR DS:[EAX+4],636F7250
JNZ SHORT calc98.0101F2DA
CMP DWORD PTR DS:[EAX+8],737365
JNZ SHORT calc98.0101F2DA
PUSH 3DB
JMP calc98.0101F203
CMP DWORD PTR DS:[EAX],43746547
JNZ SHORT calc98.0101F310
CMP DWORD PTR DS:[EAX+4],65727275
JNZ SHORT calc98.0101F310
CMP DWORD PTR DS:[EAX+8],7250746E
JNZ SHORT calc98.0101F310
CMP DWORD PTR DS:[EAX+C],7365636F
JNZ SHORT calc98.0101F310
CMP DWORD PTR DS:[EAX+10],644973
JNZ SHORT calc98.0101F310
PUSH 3D7
JMP calc98.0101F203
CMP DWORD PTR DS:[EAX],74726956
JNZ SHORT calc98.0101F33D
CMP DWORD PTR DS:[EAX+4],506C6175
JNZ SHORT calc98.0101F33D
CMP DWORD PTR DS:[EAX+8],65746F72
JNZ SHORT calc98.0101F33D
Page 11
VirtualFree
CreateMutexA
OpenProcess
GetCurrentProcessID
VirtualProtectEx
0101F32A
0101F331
0101F333
0101F338
0101F33D
0101F343
0101F345
0101F34C
0101F34E
0101F355
0101F357
0101F35C
0101F361
0101F367
0101F369
0101F370
0101F372
0101F379
0101F37B
0101F380
0101F385
0101F38B
0101F38D
0101F394
0101F396
0101F39A
0101F39C
0101F3A1
0101F3A6
0101F3AC
0101F3AE
0101F3B5
0101F3B7
0101F3BE
0101F3C0
0101F3C7
0101F3C9
0101F3CF
0101F3D1
0101F3D6
0101F3DB
0101F3E1
0101F3E7
0101F3EE
CreateFileA
CloseHandle
ReadFile
GetModuleFileNameA
GetProcAdress
0101F3F4
0101F3FB
0101F401
0101F406
Page 13
On rcupre l'adresse de la DLL voulue puis celles des fonctions ncessaires que
l'on copie dans l'IAT l'aide d'un simple mov.
f . Techniques d'anti-debuggage/dsassemblage
1 . Le CCA
Comme dans toutes les versions de tElock, le CCA est prsent tout au long du
loader. Cependant, selon moi, il ne prsente pas une relle difficult en soi. Il suffit de
s'y habituer et de tracer suffisamment lentement pour ne pas tre embt. Par contre,
il empche clairement une tude statique !
2 . Les Obfuscations
Je n'ai pas abord cette technique dans la version 0.51 car elle n'tait pas aussi
prsente que dans celle-ci. Le principe est trs simple : il s'agit d'introduire du code
inutile entre les lignes du code du loader. Un exemple :
INC EAX
DEC EAX
Parfaitement inutile, mais coupl avec d'autres codes de la mme espce, le
loader devient assez rapidement difficile lire. Le problme resterait mineur si tE! en
tait rest l. En plus de a, il a rendu son loader non linaire , savoir que le
code est cribl de call et de jump qui nous font sauter peu prs n'importe o. Un peu
droutant la premire fois, je l'avoue ! On ajoute aussi des calls inutiles, des calls sans
Page 14
CALL calc98.0101F119
NOP
POP EAX
INC BYTE PTR DS:[EAX]
CALL calc98.0101F00E
POP ESI
SUB ECX,ECX
POP EAX
JE SHORT calc98.0101F016
INT 20
MOV ECX,1951
MOV EAX,ECX
CLC
JNB SHORT calc98.0101F022
Page 15
Nettement plus nombreux que dans la version 0.51, ils sont l pour dcrypter de
petites portions de code et pour ralentir le cracker. Selon mon dcompte, dans cette
version, ils sont au nombre de 22 contre 3 dans la version 0.51. Ceci tant dit, certains
packers/crypters sont quips de plusieurs centaines voire milliers de layers. L, il ne
s'agit ni plus ni moins que d'empcher une tude statique du loader.
; (exemple : kernel32.OpenProcess)
; adresse de l'API suivante
; rcupre le premier octet dans eax
; lui ajoute 34h
; vrifie s'il y a une retenue (CF = 1)
Page 16
Voil une nouveaut dans les techniques anti-debugger de tElock. Si dans les
versions prcdentes, on pouvait abuser des Hardware Break Point (BPM), ici, ils sont
utiliser avec un peu plus de prcaution puisque le loader tente de supprimer ceux que
vous avez pos. Le dispositif a t mis en place sur le handler de plusieurs SEH. Etudions
comment il est possible de modifier ces Hardware Break Points.
Page 17
ii ) Le CONTEXT
+0 context flags
(used when calling
GetThreadContext)
DEBUG REGISTERS
+4 debug register #0 .........modifi par tElock
+8 debug register #1 .........modifi par tElock
+C debug register #2 .........modifi par tElock
+10 debug register #3 ....... modifi par tElock
+14 debug register #6 ....... modifi par tElock
+18 debug register #7 ....... modifi par tElock
FLOATING POINT / MMX registers
+1C ControlWord
+20 StatusWord
+24 TagWord
+28 ErrorOffset
+2C ErrorSelector
+30 DataOffset
+34 DataSelector
+38 FP registers x 8 (10 bytes each)
+88 Cr0NpxState
SEGMENT REGISTERS
+8C gs register
+90 fs register
Page 18
Page 19
Page 20
Lorsque le handler de la SEH a fini son travail, il rend la main au systme qui
retourne l'eip spcifi dans le CONTEXT. (l o l'exception a eu lieu). Pour comprendre
comment le handler peut accder au CONTEXT, il faut dtailler d'avantage ce qu'il
se passe lorsqu'a lieu une exception. Voici un survol des manoeuvres du systme :
L'EXCEPTION_RECORD et le CONTEXT record
1 ) Lorsqu'une exception se produit, le systme se branche sur le TIB (Thread
Information Block) en FS:[0] pour rcuprer l'offset d'une structure appele
EXCEPTION_REGISTRATION.
En fait, c'est l'utilisateur qui cre cette structure sur la pile au moment de la cration
de la SEH.
Push offset du handler
Push FS:[0]
3 ) Puis, le systme pousse 4 paramtres sur la pile dont l'offset du CONTEXT_record (la
fameuse copie) et se branche sur la fonction du handler. (Matt Pietrek l'appelle callback
function).
4 ) Du handler, on peut modifier le CONTEXT_record et notamment les DR.
5 ) Le handler rend la main au systme qui recharge le CONTEXT avec les valeurs du
CONTEXT_record.
Page 22
Pour tous les dtails sur le fonctionnement d'une SEH, je vous renvoie trois
documentations trs compltes :
DOSSIER N6
du groupe de travail
Revenons tElock 0.98. Pour accder au CONTEXT, tElock va gnrer trois sortes
d'exceptions : Division by zero, Single Step, Break Point. Puis, le handler de ces SEH va
se charger de faire le mnage dans les DR. Voici le code comment de cette fonction :
Dbut de la fonction...................................................................................
D'abord, on rcupre l'offset de la structure EXCEPTION_RECORD (stock sur la pile) :
0101F0C5 MOV EAX,DWORD PTR SS:[ESP+4]
Puis, l'offset de la structure CONTEXT record (stock sur la pile):
0101F0C9 MOV ECX,DWORD PTR SS:[ESP+C]
On augmente EIP de 1 (pour que le retour se fasse sur la ligne de code suivante)
0101F0CD INC DWORD PTR DS:[ECX+B8]
On rcupre le code de l'exception situ dans l'EXCEPTION_RECORD :
0101F0D3 MOV EAX,DWORD PTR DS:[EAX]
On teste ce code : ici, on vrifie si l'exception est une division par zro,
0101F0D5 CMP EAX,C0000094
0101F0DA JNZ SHORT calc98.0101F100
Si vous tes ici, il y a eu une division by zero exception......................................
On augmente EIP de 1 (pour que le retour se fasse sur la ligne de code suivante)
0101F0DC INC DWORD PTR DS:[ECX+B8]
Mise zro de DR0
0101F0E2 XOR EAX,EAX
0101F0E4 AND DWORD PTR DS:[ECX+4],EAX
Mise zro de DR1
Page 23
Page 24
Modification de DR1
0101F12C MOV EAX,DWORD PTR DS:[ECX+B4]
0101F132 LEA EAX,DWORD PTR DS:[EAX+1F]
0101F135 MOV DWORD PTR DS:[ECX+8],EAX
Modification de DR2
0101F138 MOV EAX,DWORD PTR DS:[ECX+B4]
0101F13E LEA EAX,DWORD PTR DS:[EAX+1A]
0101F141 MOV DWORD PTR DS:[ECX+C],EAX
Modification de DR3
0101F144 MOV EAX,DWORD PTR DS:[ECX+B4]
0101F14A LEA EAX,DWORD PTR DS:[EAX+11]
0101F14D MOV DWORD PTR DS:[ECX+10],EAX
Mise zro de eax. Indique au systme de recharger le CONTEXT et de continuer
l'excution du programme.
0101F150 XOR EAX,EAX
Modification de DR6
0101F152 AND DWORD PTR DS:[ECX+14],FFFF0FF0
Modification de DR7
0101F159 MOV DWORD PTR DS:[ECX+18],155
0101F160 RETN
7 . CheckSum du Header.
Il arrive parfois que pour dbugger un exe, on modifie certains paramtres du
header. Par exemple, on peut changer Base Of Code pour debugger avec WinDasm. On
peut aussi et surtout modifier les caractristiques de certaines sections pour les
rendre accessibles. tE! ne le sais que trop bien ! Il a donc jug utile d'interdire ce genre
de modification. Pour a, tElock va faire une copie du header et va effectuer un CRC32checksum dessus. Si le checksum s'est bien pass, il continue et utilise ce CRC32 pour
dcrypter une partie du loader...dans le cas contraire, c'est un exitprocess immdiat !
J'ai fait le test de modifier les caractristiques de la section du loader...c'est sans
appel. Il y a nanmoins un petit bug sous XP : manifestement, tE! avait prvu de
marquer le coup avec une messageBox mais la fonction n'affiche rien ! Voyons
maintenant le code qui fait ce travail :
Copie le header dans le loader.
Page 25
Ouvre le fichier
0101F983
0101F985
0101F98A
0101F98C
0101F98E
0101F990
0101F995
0101F996
PUSH 0
PUSH 80
PUSH 3
PUSH 0
PUSH 1
PUSH 80000000
PUSH EDI
CALL DWORD PTR SS:[EBP+3EB]
PUSH EAX
PUSH 0
PUSH EDI
PUSH EBX
PUSH ESI
Page 26
; CreatFileA
; ReadFile
Ferme le fichier
0101F9A9 CALL DWORD PTR SS:[EBP+3E3]
; CloseHandle
EAX =FFFFFFFF
Polynme gnrateur du CRC32
0101F9DC
0101F9DE
[.......]
0101FC4B
0101FC51
0101FC52
0101FC57
0101FC5C
0101FC5D
0101FC5F
0101FC60
0101FC62
NOT EAX
XOR DWORD PTR SS:[EBP+1B5F],EAX
Soustraction !
Page 28
0101FD4E
0101FD50
0101FD52
0101FD54
0101FD56
0101FD58
0101FD5A
0101FD5C
0101FD5E
0101FD60
0101FD62
0101FD64
0101FD66
0101FD68
0101FD6A
0101FD6C
0101FD6E
0101FD70
0101FD72
0101FD74
0101FD76
0101FD78
0101FD7A
0101FD7C
0101FD7E
0101FD80
0101FD82
0101FD84
0101FD86
0101FD88
0101FD89
0101FD8A
0101FD8B
0101FD8C
0101FD8E
0101FD91
0101FD92
0101FD98
0101FD99
0101FD9B
0101FD9D
0101FD9F
0101FDA5
0101FDA7
OR CL,CL
XOR AL,9
XOR AL,9D
OR EAX,EAX
ADD AL,1
ADD AL,CL
TEST EDI,EDI
NEG AL
INC AL
OR ESI,ESI
ROR AL,CL
NOT AL
NOT AL
ADD AL,1
LEA EDX,DWORD PTR DS:[EDX]
LEA EBX,DWORD PTR DS:[EBX]
MOV EAX,EAX
ADD AL,DL
ROR AL,CL
ROR AL,CL
ADD AL,21
LEA EBX,DWORD PTR DS:[EBX]
ADD AL,CL
ADD AL,8B
NEG AL
ADD AL,CL
XOR AL,BL
NOT AL
MOV BL,BL
NOP
NOP
NOP
NOP
XOR AL,DL
ROR AL,1
STOS BYTE PTR ES:[EDI]...stockage de AL l'adresse EDI !
IMUL EDX,EDX,4BCDB0A5
STC
JB SHORT calc.0101FD9D
INT 20
ROL EDX,1
IMUL EBX,EBX,6AEE1F70
ADD EBX,EDX
DEC ECX
Page 30
0101FDA8 JG calc.0101FD09
c ) . Deuxime dcryptage
Je ne reviens pas dessus voir tElock 0.51 Il s'agit d'utiliser le CRC32 pour
dcrypter la mme portion de code qui vient de l'tre avec le layer prcdent.
d ) . Dcompression ApLib 0.26
Idem tE! utilise toujours l'algorithme de dcompression de l'ApLib 0.26b. voir
tElock 0.51.
h . Techniques anti-unpacking/anti-dump
1 . le mutex
Mme protection que celles des versions prcdentes, si l'option est coche, le
loader cre un mutex dont la prsence doit tre teste par le logiciel protg. En
l'absence de mutex, le logiciel peut considrer qu'il a t unpack et donc prvoir une
procdure pour se protger. J'ai regard si les keygens de TMG taient quips d'un tel
dispositif....et conclusion : l'quipe de TMG ne se sert pas de cette option !! (Pour plus
de dtails, voir le tutorial sur tElock 0.51). Petite note de l'auteur :
P.S.: Since v0.95 tElock ALWAYS generates a 8-char Mutex Object for each file. You can
find the string used in the Listview control after packing process has been finished. The
string is calculated individually for each file. Example: CMS:: xPkWZ8Ha
2 . effacement du loader
Toujours comme les versions prcdentes, juste avant d'arriver au saut sur l'OEP,
le loader s'efface en remplaant ses donnes par des zros. Le code est le mme que
pour la version 0.51.
3 . modification du header
; kernel32.GetCurrentProcessId
; kernel32.OpenProcess
; kernel32.VirtualProtectEx
dtourner (dixit +The Analyst) ce qui ne concernerait pas les 3 DLLs prcdentes ainsi
que GDI32.DLL.Ceci dit, tE! est bien conscient que c'est inutile face Revirgin ou
ImportReconstructor.
[Enable IAT-Redirection]
That's a useful feature to get rid of some Imports-rebuilding tools which are able to
rebuild the importtable of a dumped PE-File using the fixed addresses in the IAT during
runtime. Info: In the meanwhile there're a few (free) utilities available on the net
which are able to rebuild the imports even if the IAT has been redirected 100 times or
more. (Greetings to MackT and +tsehp)
Page 33
b . Technique antidebugging
l'API GetClassNameA
Voil donc la nouveaut des
versions 1.xx. Le principe est simple :
le loader numre toutes les classes
des process en cours et va rechercher
les classes des applications suivantes :
OLLYDEBUGGER (Classe = OLLYDBG)
WINDASM (Classe = OWL_Window)
Page 34
;GetClassNameA
OLLY
0041B8CC PUSH 0
0041B8CE PUSH 0
0041B8D0 PUSH 10
0041B8D2 PUSH DWORD PTR SS:[EBP+8]
0041B8D5 CALL DWORD PTR DS:[EDI+8]
0041B8D8 XOR EAX,EAX
0041B8DA POP EDI
0041B8DB LEAVE
0041B8DC RETN 8
0041B8DF
0041B8E1
0041B8E2
0041B8E3
0041B8E4
OWL_
TDeD
File
MonC
SendMessageA
PUSH 1
POP EAX
POP EDI
LEAVE
RETN 8
4 . MANUAL UNPACKING
a . Trouver l'OEP
trouver l'OEP avec LordPE (valable pour toutes les versions)
Pour les versions publiques, le problme ne se pose pas puisqu'il existe des
unpackers. En plus, OllyDbg, avec son module SFX permet de trouver l'OEP sans aucune
difficult.
Si vous n'avez pas modifi le nom de la classe de Olly, pour les versions privates
1.xx, la dtection de la classe par l'API GetClassNameA rend le travail plus dlicat. Il
faut faire le travail la main.
Nous allons utiliser une particularit des packers de tElock : lorsque le packer rend
la main au programme (saut l'OEP), la section du loader a t crase grands coups
de zros...mais pas partout ! Aussi trange que cela puisse paratre, tElock a copi au
dbut du loader l'adresse de l'OEP sous forme d'un JMP OEP !! Nous vous y trompez pas,
ceci n'est qu'un leurre puisque ce jump n'est jamais utilis. Ceci dit, nous allons
rcuprer cette adresse sans plus tarder.
1 ) Lancer l'application packe par tElock.
2 ) Faire un Dump Region avec LordPE de la dernire section de l'exe (celle du
loader) lorsque c'est possible. Si vous ne voyez qu'une grosse section contige, c'est
normal, l'ImageSize est zro. Dans ce cas, dumpez quand mme, il faudra juste
chercher la dernire section dans cette copie.
3 ) Ouvrir le dump avec HexDecChar pour lire l'OEP :
Par exemple, si votre section commence en 101F000, vous devriez y voir :
101F000
E9 7034FFFF
JMP 1012475
sub count, 1
jmp lbl1
lbl2:
esti
bprm cbase, csize
eob end
eoe end
run
end:
cmt eip, "OEP"
cob
coe
ret
ShaG dnombre 13h SEHs et malheureusement, sur mon calc.exe, a ne fonctionne
pas car je n'ai que Fh SEHs. Il faut donc pour que a fonctionne modifier ce fameux 13
par F !
Malgr son nom tElock098.txt, ce script fonctionne trs bien pour les versions 1.xx
si on a pris la prcaution de changer le nom de la classe de Olly comme je l'ai prcis
plus haut.
Utiliser le script de loveboom pour les versions 1.xx
Voici un autre script propos par lovedoom qui ncessite galement de changer le
nom de la classe de Olly. Il prcise en entte qu'il faut renommer OLLYDBG.EXE...je n'ai
toujours pas compris pourquoi ! C'est tout simplement inutile. Par contre, il est plus
confortable que le premier script car il ne ncessite aucune intervention de notre part.
Le principe est nanmoins le mme.
/*
//////////////////////////////////////////////////
tElock 0.9 - 1.0 (private) -> tE! OEP Finder v0.1
Author: loveboom
Email : bmd2chen@tom.com
OS : Win2kADV sp2,OllyDbg 1.1b,OllyScript v0.62
Date : 2004-3-29
Config: uncheck all the boxes on the Exceptions tab
in Debugging Options except the topmost one.Rename 'OLLYDBG.EXE'
Modify Classname 'OLLYDBG',I can email you a file patch(Only 1.1b) if you want.
Note : If you have one or more question, email me please,thank you!
//////////////////////////////////////////////////
Page 38
*/
var count //Declare variant
var cbase
var csize
start:
gmi eip,CODEBASE
mov cbase,$RESULT
gmi eip,CODESIZE
mov csize,$RESULT
mov count,f..........ici, loveboom a initialis avec la bonne valeur.
run
lbl1:
cmp count,0
je lbl2
sub count,1
esto
jmp lbl1
lbl2:
bprm cbase,csize
esto
lblend:
bpmc
cmt eip,"OEP found!please dumped it!"
msg "scrip't by loveboom[DFCG],Thank you for using my scrip't!"
ret
b . Dumper l'exe
Nous allons poser un BPM sur l'OEP pour ensuite dumper avec le plugin OllyDump.
Pour poser ce BPM, nous devons faire face trois cas de figure :
ANTI-BPM
GetClassNameA
NON
NON
OUI
NON
OUI
OUI
Page 39
Page 40
c . Reconstruction de l'IAT
Si vous avez dump avec LordPE, comme pour les prcdentes versions, l'IAT est au pire
redirig donc un simple Trace Level 3 sous ImpRec suffit pour rsoudre tous les imports.
Du point de vue du unpacker, tElock 0.98 n'a que peu d'intrt puisque les antidebuggers sont trs facilement contournables (on n'a mme pas besoin de les
comprendre pour les viter), et le dump se fait tout seul. Comme le prcise tE! luimme, rediriger les imports une fois ou 500 fois ne changera rien pour OllyDump ,
ImportReconstructor ou Revirgin. C'est donc une mthode proscrire sans appel ! Il a
nanmoins le mrite de ralentir les lamers qui dsireraient ripper le code de l'exe ou
juste modifier ses ressources pour le personnaliser .
Voil ! Le second volet sur l'analyse de tElock s'achve. J'espre que ce travail vous
a plu et que vous avez appris quelques bricoles (ne serait-ce que le schma du loader de
tElock). Personnellement, j'ai eu un plaisir immense travailler sur ce petit packer
d'exe.
Page 41
6 . REMERCIEMENTS/SOURCES
Voici mes sources :
1 ) Win32 Exception handling for assembler programmers. de Jeremy GORDON
2 ) A Crash Course on the Depths of Win32 Structured Exception Handling de Matt
PIETREK
3 ) DOSSIER N6 du groupe de travail.(SEH)
4 ) DOSSIER N8 du groupe de travail.(CRC32)
5 ) Documentation Intel sur l'IA-32.
Merci tE! Pour avoir imagin ce petit packer d'exe trs intressant.
Je remercie normment tous ceux qui ont pris de leur temps pour me donner un lien,
une doc, une explication sur un dtail technique qui ont t des aides prcieuses sans
lesquelles, je le reconnais, je n'aurais pas pu crire ceci. Merci donc eXXe, Darus,
Lautheking, elooo, +The Analyst, Kaine, Gbillou, Kharneth, Thierry The One, Neitsa.
Un grand merci galement Cyber Daemon et r!sc pour leur travail sur le unpacker
gnrique des versions de tElock 0.41b, 0.42c et 0.51.
Merci ShaG et loveboom pour leur travaux sur OllyScript.
Merci J.GORDON, M.PIETREK et au Groupe de Travail pour leurs docs remarquables sur
les SEHs.
Merci Ross N. Williams pour son excellent travail sur le CRC32.
Enfin, un grand coucou et un grand merci tous les membres actifs de forumcrack.
MERCI tous ceux qui contribuent au dveloppement de la connaissance en matire de
cracking.
Page 42