Protection   PEPack   Les ProtectionsRenforcées
Outils   ProcDump Wdasm SoftIce    
Cible   NotePad  

By Christal

Disassembly of File: Notepad.exe
Code Offset = 00001000, Code Size = 00003000
Data Offset = 00004000, Data Size = 00001000

Number of Objects = 0006 (dec), Imagebase = 00400000h

   Object01: .text    RVA: 00001000 Offset: 00001000 Size: 00003000 Flags: C0000040
   Object02: .data    RVA: 00005000 Offset: 00004000 Size: 00001000 Flags: C0000040
   Object03: .idata   RVA: 00006000 Offset: 00005000 Size: 00001000 Flags: C0000040
   Object04: .rsrc    RVA: 00007000 Offset: 00006000 Size: 00006000 Flags: C0000040
   Object05: .reloc   RVA: 0000D000 Offset: 0000C000 Size: 00001000 Flags: C0000040
   Object06: PEPACK!! RVA: 0000E000 Offset: 0000D000 Size: 00001000 Flags: C0000040

A la fin de le compression, PEPack va donner les informations suivantes:
les sections CODE, Data, Import, et les ressources (y compris l'icône contrairement a ce qu'il prétend) ont été compressées, et la section FixUps a été encryptée/compressée.

Vous aurez probablement remarqué que toutes les sections ont C0000040 comme caractéristique, ce qui, normalement, vous empêche de désassembler l'exécutable, ou d'obtenir un break en passant par le Symbol Loader de SoftIce.
En modifiant la première section (.text), et en remplaçant C0000040 par E0000020 à l'aide de ProcDump, vous pourrez reprendre la main avec SoftIce, et obtenir un listing, sans les ressources (String Data...), avec Wdasm.

Pour pouvoir disposer d'un listing avec les ressources, il va falloir créer un dump de l'exécutable compacté/crypté. ProcDump est sensé pouvoir le faire de façon automatique, mais dans ce cas précis l'opération à échouée (une faiblesse du script?). Par contre ProcDump va quand même donner quelques informations que l'on réutilisera un peu plus tard.
Pour remédier à cet inconvénient, il va falloir réussir un Dump "à la main".

1er étape: trouver le moment où la décompression est terminée.

Un grand nombre d'encrypteur/compresseur commence par sauvegarder le contenu des registres (Pushad) avant de commencer leur boulot, et les restitue à la fin de celui ci (Popad). Bien souvent, dans ce cas, vous aurez le passage de relais du Loader à l'application d'origine, dans les parages.

A l'aide du listing que vous aurez obtenu, même sans les références, vous allez faire une recherche sur Popad. Vous n'en trouverez qu'un seul:

0177:0040E26F  61             POPAD
0177:0040E270  FFEO           JMP     EAX
0177:0040E272  8D85CE050000   LEA     EAX,[EBP+000005CE]

Avec un peu d'habitude, on en sait assez: Le JMP EAX est très couramment utilisé pour brancher vers les codes du programme original.
Vous pouvez en avoir la confirmation en regardant dans le fichier script.ini de ProcDump:

[PEPack]
L1=LOOK 61,FF,E0
L2=BP
L3=STEP
OPTL1=00000000
OPTL2=01000001
OPTL3=01010001
OPTL4=00030000
OPTL5=00000000

Vous retrouvez la signature (61 FF EO) de PE Pack. A l'aide d'une information comme celle ci, il est facile de remplacer, avec un Hexéditeur, le 61 (Popad) par un CC (opcode pour l'INT 3), et de pouvoir forcer un break à la bonne adresse en posant un BPINT 03 dans SoftIce. Il faudra, par contre, penser à remplacer le CC par le code 61, au break, à moins que vous ne soyez un adepte des "Break Due to General Protection Fault!"

Une autre solution, plus simple dans le cas présent, est de lancer l'application via le Symbol Loader de SoftIce, et à condition que vous ayez modifié les caractéristiques de .text, vous aurez un break sur l'Entry Point du Loader. Vous pourrez alors, tranquillement, poser un Bpx 0040E270.

Petite interrogation rapide du contenu de EAX, et vous aurez l'Entry Point de l'application décompressée.
Revenons sur une information que nous avait donnée ProcDump. Au moment de la tentative pour créer un Dump automatique, et avant de voir l'écran "Y a un Problème!", ProcDump aura quand même eu la possibilité d'afficher l'adresse de l'Entry point du Loader (0040318D), et celle où il aura mis la main sur la signature de PE Pack (0040E26F).
Concernant l'Entry point du Loader, Wdasm nous avait déjà passé l'information:

+++++++++++++++++++ ASSEMBLY CODE LISTING ++++++++++++++++++
//********************** Start of Code in Object .text **************
Program Entry Point = 0040318D (Notepad.exe File Offset:0000718D)

Et ceci, que ce soit dans sa version avant modification de la caractéristique de .text, ou après désassemblage de la version "améliorée"...

2eme étape: création du Dump

Quand vous serrez en 0040E270, dans SoftIce, vous passerez en mode assembleur ("a"), pour remplacer le jmp Eax par un jmp EIP, forçant ainsi le programme à boucler sur lui même.
Quittez SoftIce (F5), et ouvrez une nouvelle session de ProcDump. Choisissez le bouton [Options], puis "Rebuild Import table". Sélectionnez ensuite le programme/cible dans la fenêtre des taches de ProcDump, et avec un clic_droit sur son nom, prennez l'option Dump (Full).
Il ne vous restera plus qu'à sauvegarder le nouvel exécutable. Celui ci pourra être désassemblé avec Wdasm, et vous aurez enfin les références et ressources habituelles. Par contre, cet exécutable plantera au lancement, même si vous réajustez la valeur de l'Entry Point.

3ème étape: trouver de la place

Pour pouvoir y glisser les quelques lignes de votre patch.
Bien souvent, par flemme, je m'installe sur un petit bout de l'icône. Dans le cas de PE Patch, celle ci a également été codée, et les Borland Ressources WorkShop ne pourront pas vous aider a en trouver la chaîne.

Partant du principe qu'un compileur complète toujours la fin d'une section par des octets nuls (00 00), vous allez descendre dans le listing, avec l'ascenseur de la fenêtre des codes, jusqu'au moment où vous verrez apparaître des INVALID: Vous avez quitté la section XXX!PEPACK:

0177:0040EFF7  0000         ADD       [EAX],AL  > octets nuls
0177:0040EFF9  0000         ADD       [EAX],AL
0177:0040EFFB  0000         ADD       [EAX],AL
0177:0040EFFD  0000         ADD       [EAX],AL
0177:0040EFFF  00FF         ADD       BH,BH
0177:0040F001  FFFF         INVALID
0177:0040F003  FFFF         INVALID             > fin de la section

Calculez rapidement la taille que devra avoir votre patch, et choisissez l'adresse de son début en fonction. Dans mon cas, je vais m'installer en 0040EFC2.
Un petit BPM sur cette adresse va me confirmer qu'apparemment elle n'est pas utilisée à un moment ou à un autre, lors de la décompression.

Il n'y a plus qu'à écrire le Patch:

0177:0040EFC0  0000                 ADD  [EAX],AL  > octets nuls
0177:0040EFC2  C70570E24000FFE08D85 MOV  DWORD PTR [0040E270],858DE0FF
0177:0040EFCC  C70574E24000CE050000 MOV  DWORD PTR [0040E274],000005CE
0177:0040EFD6  66C705CA1F40007534   MOV  WORD PTR [00401FCA],3475
0177:0040EFDF  FFE0                 JMP  EAX       > saut vers l'EP 
0177:0040EFE1  0000                 ADD  [EAX],AL  > octets nuls

Histoire de jouer un peu, je me suis amusé à réécrire les codes de la zone 0040E270 à 0040E277, plus une petite modification dans la partie décompressée du programme/cible.

4eme étape: détourner le programme

Pour obliger le loader à se rendre à ce patch, il va falloir faire la modification suivante:

et remplacer

0177:0040E26F  61             POPAD
0177:0040E270  FFEO           JMP     EAX
0177:0040E272  8D85CE050000   LEA     EAX,[EBP+000005CE]

par

0177:0040E26F  61             POPAD
0177:0040E270  E94D0D0000     JMP     0040EFC2  > vers le patch
0177:0040E275  90             NOP               > rééquilibrage
0177:0040E276  90             NOP
0177:0040E277  90             NOP
0177:0040E278  50             PUSH EAX          > retour à la normale

Par précaution faites un premier test en mémoire. Arrivée à l'adresse de votre Patch, interrogez les adresses que vous voulez modifier (d 00401FCA) pour vous assurer que les valeurs que vous voulez changer sont bien présentes, tracez pas à pas votre Patch pour détecter une éventuelle "General Fault", interrogez de nouveau les adresses/cible pour être certain de ne pas avoir fait d'erreur (une inversion par exemple) dans les codes patchés. et si tout c'est bien passé, modifiez définitivement l'exécutable avec un éditeur hexadécimal.

Refaites un contrôle avec l'exécutable patché.
Ca marche ?

BINGO!

A vous de jouer,
Christal