| Protection | Néolite 2 |
Les Protections Renforcées |
||
| Outils | ProcDump | |||
| Cible | Explor 2000 1.34 |
by TaMaMBoLo |
Disponibilité :http://www.cmaufroy.com
Protections : Crypted & compressed with Neolite 2
Standart protections (nag,trial period)
Cible : Eplor2000.exe (949Kos)
Outils: Procdump 1.5
Softice 4.0
Explor2000 est un soft comme windows commander : il gère deux explorateurs et
apportent des améliorations sommaires à leur fonctionnement.L'auteur a trouvé
intelligent de compresser son exécutable avec Neolite2. Ce dernier permet de gagner
de la place et par la même occasion, crypte l'exécutable.
Nous allons voir comment décompresser un .exe en mémoire et comment le sauvegarder
(dump) une fois décompressé.Une fois décompressé nous pourrons utiliser windasm
à loisir pour décompiler le code principal.
Step 1 :
Prenez Symbol Loader et chargez Explor2000 en mémoire.Cliquez sur les engrenages
pour lancer le debuging. Pas de chance, softice ne se déclenche pas comme c'est le
cas habituellement. Il est possible que le format PE de l'exécutable soit un peu modifié.
Prenez Procdump 1.5 et allez dans l'option PE Editor. Choisissez votre exécutable
(Explor2000.exe) et allez dans l'option 'sections'. Faites un click droit sur la
section 'Code' et faites 'Edit section'. En bas à droite de l'écran de Procdump vous
avez les caracteristques de la section : section Characteristics = C0000080. Il faut
savoir que C0000080 c'est pas normal comme caractéristique... Normalement les caractéristiques
doivent avoir la valeur E0000020. Remplacez donc le C0000080 par E0000020.
Reprenez Symbol loader et refaite l'opération du début : ce coup-ci softice se déclenche
bien ...
Step 2:
Maintenant que l'on est au point d'entrée du programme, on peut le tracer pour voir
où il décompresse le code.En traçant le programme avec la touche F10, on arrive à
ceci:
15f:006ac3db mov eax,[esp+04]
15f:006ac3df and eax,[006ac341]
15f:006ac3e5 call 006ac75b ----------> Decrunching !
15f:006ac3ea inc byte ptr [006ac3da]
15f:006ac3f0 jmp eax ----------------> Hey! What's this ??
A l'adresse 6ac3e5 il y a un call 6ac75b : c'est ce call qui décompresse le programme...
Juste derrière, à l'adresse 6ac3f0, il y a un jmp eax plutôt bizarre...Quand vous
arrivez à l'adresse 6ac3f0, ne l'executez pas : Faites ? EAX sous softice pour avoir la
valeur de EAX. Notez le résultat sur un papier (chez moi EAX=53ae04) .Ce jmp eax est en fait
le point d'entrée d'Explor2000 une fois que celui est décompressé ...C'est pourquoi il est important
de le noter car nous en aurons besoin plus tard.Maintenant que nous savons que lorsque le
prog se trouve à l'adresse 6ac3f0 (juste avant de lancer explor2000 décompressé) , le
programme est décompressé , il ne reste plus qu'a 'dumper' le prog ...
Step 3
On reprend symbol loader et on ouvre explor2000. Sous softice , on tape BPX 6ac3f0
pour poser un Breakpoint juste avant d'éxecuter Explor2000. On relance le tout avec
la touche F5 et le prog se bloque bien en 6ac3f0. On va remplacer le jmp eax de cette adresse
par un jmp eip : de cette façon le prog va faire une boucle infinie sans exécuter Explor2000
(EIP correspond à l'adresse courante du prog, donc ,en le faisant sauter éternellement à
l'adresse ou il se trouve, on exécute pas les instructions suivantes et notre proggy est
toujours en mémoire...)...Pour cela on tape sous softice : A 6ac3f0 (entrée)
jmp eip (entrée,puis escape)
Maintenant que notre prog est bloqué à l'adresse 6ac3f0, on va le dumper .
Prenez Procdump 1.5 . Normalement ce dernier doit vous indiquer tous les programmes qui
tournent en ce moment dans windoze. On repère facilement Explor2000.exe dans la liste .
Faites un click droit sur Explor2000 et choisisez l'option 'Dump (Full)' .Procdump
va sauvegarder l'exe sur votre disk dur.
Donc nous avons un exe qui fait maintenant 2551 Kos... Comparé aux 949Kos du début, on en
déduit que notre exe est bien décompressé... Le problème c'est qu'il faut remettre le bon
point d'entrée , celui n'étant plus le même puisque ce dernier est décompressé. Vous vous
souvenez de la valeur EAX que nous avions noté au début de l'article (EAX=53ae04) ?C'est
notre point d'entrée du prog decompressé. Sachant que ' l'image base' est 400000 , comment
faire pour calculer le point d'entrée ? Tout simple : 53ae04-400000=13ae04 .
Notre point d'entrée est donc 13ae04...On reprend procdump est on fait 'PE Editor'.
Dans 'Entry Point' on entre notre valeur (13ae04) et on quitte procdump.Et nous avons
maintenant notre exe décompressé avec le bon point d'entrée : lancez le pour vérifier.
Nous pouvons alors nous attaquer aux protections standarts...
Step 4
La principale protection ,sans compter Neolite2, est un nagscreen qui fait
attendre l'utilisateur non-enregistré à chaque démarrage.Pour l'enlever ,j'y
suis allé avec la méthode bourrain : j'ai tracé le prog depuis le début (la
version d'explor2000 qu'on a dumpé bien sur!) jusqu'au moment où celui-ci
affiche le nag.
On prend symbol loader et on ouvre Explor2000 décompressé. On commence a tracer
avec la touche F10 . Il faut rentrer à l'intérieur de quelques Calls avec la touche
F8 avant d'arriver à cette boucle :
15f:0044ffa2 mov eax,[ebp-04]
15f:0044ffa5 call 44fd90---------------------> call qui initialise le prog
15f:0044ffaa mov eax,[ebp-04]
15f:0044ffad cmp byte ptr [eax+0000084],00
15f:0044ffb4 jz 44ffa2 ----------------------> loop EnD ?
Cette boucle commence en 44ffa2 et se termine en 44ffb4 . Le call 44fd90 à l'addresse
44ffa5 est exécuté 3 fois avant de lancer le proggy. Sous softice ,tapez BPX 44ffa2 pour
mettre un breakpoint.Quittez Explor2000 et relancez-le. Ce dernier se bloque en 44ffa2,
on exécute le call 44fd90 2 Fois et à la troisième fois on appuie sur F8 pour rentrer dans le
call .On arrive à ceci :
15f:0044fd90 push ebx
15f:0044fd91 add esp,-1c
15f:0044fd94 mov ebx,eax
15f:0044fd96 mov edx,esp
15f:0044fd98 mov eax,ebx
15f:0044fd9a call 0044fce0-------> post nagscreen
Le call de l'addresse 44fd9a (call 44fce0) envoie le nag, mais en partit seulement : plusieurs
calls déclenche le nag mais le premier est forcément dans le 44fce0... On quitte explor2000
et l'on le relance . Il se bloque encore en 44ffa2 et on refait la manip précédente (passez
deux fois sur le call et rentrer dedans avec F8 au troisième passage). Arrivé en 44fd9a on
appuie sur F8 pour aussi rentrer dans le call 44fce0. On continue la trace avec F10.
Rapidement on arrive à ceci :
15f:00517d59 mov edx,edx
15f:00517d5b mov eax,edx
15f:00517d5d call 5259d0--------> déclenche le prog
Cette fois c'est le call 5259d0 qui déclenche le proggy. On efface les breakpoints précédent
(BC sous softice) et on met un nouveau breakpoint : BPX 5259d0 .On quitte explor2000 et on
le relance tout de suite .Il se bloque en 5259d0 et en traçant encore avec F10 ,on voit
l'interface d'explor2000 s'afficher et enfin notre nagscrenn !Vous devriez arriver à ceci :
15f:00525d5e mov eax,[EBP-04]
15f:00525d61 mov eax,[EBP+0000067c]
15f:00525d5e call 4ca72c ------> Nagscreen !
On arrive enfin à l'addresse 525d5e qui déclenche notre nagscreen. Remplacez le call 4ca72c
par 5 nops (Sous Softice tape E 525d5e et rentrer 90,90,90,90,90) et relancez : le nag
ne s'affiche plus !
Step 5
L'autre protection du soft est une période d'essai de 30 jours. Si vous avez cracké le
premier nag (step 4) et que vous avancez votre horloge de 30 jours, un nouveau nag
s'affiche vous disant que la période d'essaie est terminée. Pour cracker ce nag il suffit
de faire la même chose que le step 4 : tracer le prog du début jusqu'au call qui affiche
le nag et de le remplacer par 5 nops. Vous pouvez aussi virer 'version non enregistrée' dans
la boite 'about' en désassemblant le code (l'exe decompressé bien sur!) avec windasm et en
allant dans 'string data reference' vous trouverez 'version non enregistrée'. Après c'est un
jeu d'enfant de patcher cette partie du prog...
Step 6
Pour cracker ce soft vous pouvez patcher le dump que vous avez fait puisque celui-ci
est décompressé. Personnellement, je trouve que patcher un dump n'est pas pratique : notre
explor2000 décompressé fait 2551Ko , ce qui n'est pas très facile à faire circuler sur le
web... J'ai donc utilisé un 'memory patcher' qui permet de charger un exe et de cracker
directement le prog en mémoire. C'est très pratique car cela fait un crack de 4 Kos, plus
simple à diffuser...Ce source vient d'un tutorial de tKC fait par R!sc (hi master!).
-----------------------------------------------------------Cut here---------------------------------------------------------------
; based on original loader.exe by Hayras [tNO '98] used in
; Hayras's Neolite v1.22 memory patcher.
;
; Special thanks to TNO for graciously allowing me to use this
; source on behalf of Hayras, who has now retired from the scene.
; Yes, Hayras's loader reversed by R!SC, then totally re-written
; & released to the public, so everyone can learn this shit :)
; Requires Tasm 5.0 & import32.lib to compile
; tasm32 /ml loader.asm
; tlink32 /Tpe /aa /c loader,loader,, <path to> import32.lib
; replace <path to> with whatever...
; (c)1999 R!SC (see what i do instead of cracking...duh) yey Prophecy!
;
.386
.MODEL FLAT,STDCALL
locals
jumps
UNICODE=0
.DATA
Extrn WaitForInputIdle:PROC
Extrn WriteProcessMemory:PROC
Extrn ReadProcessMemory:PROC
Extrn CreateProcessA:PROC
Extrn CloseHandle:PROC
Extrn ExitProcess:PROC
Extrn VirtualFree:PROC
Extrn EndDialog:PROC
Extrn MessageBoxA:PROC
MEM_DECOMMIT equ 00004000h
;-=-Normal data-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
CSiR_Tag db ' SamSouL CRaCKiNG CReW ',0
CSiR_Error db 'ERRor!!!',0
CSiR_Error1 db 'Yup!',0
OpenERR_txt db 'FiLE Not Found !',0
ReadERR_txt db 'Read Memory Error !',0
WriteERR_txt db 'Write Memory Error !',0
VersionERR_txt db 'Incorrect Version of application :(',0
CSiR_ProcessInfo dd 4 dup (0) ;process handles
CSiR_StartupInfo db 48h dup (0) ;startup info for the process were opening
CSiR_RPBuffer db 10h dup (0) ;read buffer, for checking data
;-=-Patch datas-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
CSiR_AppName db 'explor2000.EXE',0
fuck dd 6ac3e5h ; address to read data from for version checking
sizeof dd 10 ; in the new process
checkbytes db 0e8h,071h,003h,000h,00h ; the bytes to check for
db 0feh,005h,0dah,0c3h,06ah ; if there not there, we have the wrong version??
patch_data_1 db 0e9h,08eh,000h,000h,000h ; CRACK #1
patch_size_1 dd 5
patch_addr_1 dd 4ca733h
patch_data_2 db 0ebh ; CRACK #2
patch_size_2 dd 1
patch_addr_2 dd 4cb875h
patch_data_3 db 090h,090h ; CRACK #3
patch_size_3 dd 2
patch_addr_3 dd 5261fch
patch_data_4 db 090h,090h,090h,090h,090h,090h ; CRACK #4
patch_size_4 dd 6
patch_addr_4 dd 511143h
fhandle dd 0
fsize dd 0
memptr dd 0
hwnd_ dd 0
.CODE
Start:
push offset CSiR_Tag
mov dword ptr [CSiR_StartupInfo],44h ; (the size in bytes of the structure)
push offset CSiR_ProcessInfo ; Typedef struct _PROCESS_INFORMATION
push offset CSiR_StartupInfo ; Pointer to STARTUPINFO structure
push 0
push 0
push 20h ; Creation flags
push 0
push 0
push 0
push 0
push offset CSiR_AppName ; Pointer to name of executable mod
call CreateProcessA
test eax,eax
jz OpenERR
Wait4Depack:
push LARGE-1 ; Timeout (in milliseconds, -1 = infinate)
push dword ptr [CSiR_ProcessInfo]
call WaitForInputIdle
Check_Data:
push 0 ; BytesRead
push dword ptr [sizeof] ; Length
push offset CSiR_RPBuffer ; Destination (to read them to)
push dword ptr [fuck] ; Source
push dword ptr [CSiR_ProcessInfo] ; Process whose memory we are to read
call ReadProcessMemory
test eax,eax
jz ReadERR
;...
;int 03 ;-)
cld
lea esi, CSiR_RPBuffer
lea edi, checkbytes
mov ecx, 10
rep cmpsb
jnz VersionERR
;...
Patch_the_mother:
push 0 ; Pointer to byteswritten (i like null though)
push dword ptr [patch_size_1] ; Length
push offset patch_data_1 ; Source
push dword ptr [patch_addr_1] ; Destination
push dword ptr [CSiR_ProcessInfo] ; Process whose memory we are to patch
call WriteProcessMemory ; Call Kernel32!WriteProcessMenory
test eax,eax
jz WriteERR
push 0 ; Pointer to byteswritten (i like null though)
push dword ptr [patch_size_2] ; Length
push offset patch_data_2 ; Source
push dword ptr [patch_addr_2] ; Destination
push dword ptr [CSiR_ProcessInfo]
call WriteProcessMemory ; Call Kernel32!WriteProcessMenory
test eax,eax
jz WriteERR
push 0 ; Pointer to byteswritten (i like null though)
push dword ptr [patch_size_3] ; Length
push offset patch_data_3 ; Source
push dword ptr [patch_addr_3] ; Destination
push dword ptr [CSiR_ProcessInfo]
call WriteProcessMemory ; Call Kernel32!WriteProcessMenory
test eax,eax
jz WriteERR
push 0 ; Pointer to byteswritten (i like null though)
push dword ptr [patch_size_4] ; Length
push offset patch_data_4 ; Source
push dword ptr [patch_addr_4] ; Destination
push dword ptr [CSiR_ProcessInfo]
call WriteProcessMemory ; Call Kernel32!WriteProcessMenory
test eax,eax
jz WriteERR
Close_This_app:
push dword ptr [CSiR_ProcessInfo]
call CloseHandle
push dword ptr [CSiR_ProcessInfo+4]
call CloseHandle
Exit_Proc:
Push LARGE-1
Call ExitProcess
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
VersionERR:
lea eax, VersionERR_txt
jmp abort
ReadERR:
lea eax, ReadERR_txt
jmp abort
OpenERR:
lea eax, OpenERR_txt
jmp abort
WriteERR:
lea eax, WriteERR_txt
abort:
push 0
push offset CSiR_Error ; Title
push eax ; Message
push 0
call MessageBoxA
push dword ptr [CSiR_ProcessInfo]
call CloseHandle
push dword ptr [CSiR_ProcessInfo+4]
call CloseHandle
call EndDialog, hwnd_, 0
jmp theend
eka:
call VirtualFree, memptr, fsize, MEM_DECOMMIT
ech:
call CloseHandle, fhandle
theend:
Push LARGE-1
Call ExitProcess
ends
end Start
-----------------------------------------------------------Cut here---------------------------------------------------------------
TaMaMBoLo