Protection   pETITE 2.1  

PACKED PROGRAM

Tools   ProcDump Wdasm SoftIce    
Target   NotePad  

By Christal

Petite is a Win32 (Windows 95/98/2000/NT) executable (EXE/DLL/etc...) compressor. The compressed executables decompress themselves at run time, and can be used just like the original uncompressed versions. Petite also adds virus detection to the compressed executables - they will check themselves for infection every time they are executed.

Petite n'est pas rééllement une protection. Son rôle est simplement de créer un exécutable de moindre taille. En fait de compresseur, il n'est pas aussi performant que d'autres comme ASPack ou Néolite. Comme la plupart des programmes de ce type, vous n'obtiendrez pas de String Data Références en désassemblant l'application. Dans le meilleur des cas (Wdasm 8.5 et Wdasm 6.9) vous aurez un listing sans les ressources habituelles, et avec Wdasm8.93 vous n'obtiendrez rien du tout.

Dans la famille "compresseur", il est celui le plus facile à modifier.

Voici les différentes informations données par WDasm:

Avant compression :

Disassembly of File: NOTEPAD.exe
Code Offset = 00000400, Code Size = 00003A00
Data Offset = 00003E00, Data Size = 00000400

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

Object01: .text    RVA: 00001000 Offset: 00000400 Size: 00003A00 Flags: 60000020
Object02: .bss     RVA: 00005000 Offset: 00000000 Size: 00000000 Flags: C0000080
Object03: .data    RVA: 00006000 Offset: 00003E00 Size: 00000400 Flags: C0000040
Object04: .idata   RVA: 00007000 Offset: 00004200 Size: 00000E00 Flags: 40000040
Object05: .rsrc    RVA: 00008000 Offset: 00005000 Size: 00003200 Flags: 40000040
Object06: .reloc   RVA: 0000C000 Offset: 00008200 Size: 00000A00 Flags: 42000040
Program Entry Point = 00401000 (NOTEPAD.exe File Offset:00004E00)

Après le passage de Petite :

Disassembly of File: Notepad.exe
Code Offset = 00001C00, Code Size = 00002A00
Data Offset = 00000000, Data Size = 00000000

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

Object01: .text    RVA: 00001000 Offset: 00001C00 Size: 00002A00 Flags: E0000020
Object02: .bss     RVA: 00005000 Offset: 00000000 Size: 00000000 Flags: C0000080
Object03: .data    RVA: 00006000 Offset: 00000000 Size: 00000000 Flags: C0000040
Object04: .rsrc    RVA: 00008000 Offset: 00004600 Size: 00003200 Flags: 40000040
Object05: .reloc   RVA: 0000C000 Offset: 00000000 Size: 00000000 Flags: C2000040
Object06: .petite  RVA: 0000D000 Offset: 00000400 Size: 00001800 Flags: E2000060
Object07:          RVA: 0000F000 Offset: 00000000 Size: 00000000 Flags: C2000080
Program Entry Point = 0040D10B (Notepad.exe File Offset:0000050B)

Entre autre nouveauté, vous avez une section .petite qui apparaît, et dans laquelle se trouve l'Entry point du programme compressé et du Loader (EPL).

Pour trouver à quel moment et de quelle façon le Loader va céder la place à l'application d'origine (ici, NotePade.exe), j'ai commencé à tracer avec F10 dès que la Symbol Loader de SoftIce m'a rendu la main. A chaque fois que l'écran de Notepad apparaissait, j'ai posé un Breakpoint sur le call incriminé (F9), et j'ai recommencé depuis le début.

Contrairement à d'autre compresseur, le relais est passé comme ceci:

0137:0040D1D3  55                  PUSH    EBP
0137:0040D1D4  8BEC                MOV     EBP,ESP
0137:0040D1D6  8807                MOV     [EDI],AL         > lancement de NotePad
0137:0040D1D8  81ECD8BA0000        SUB     ESP,0000BAD8
0137:0040D1DE  8D8D887FFFFF        LEA     ECX,[EBP+FFFF7F88]

Mais attention, vous aurez 5 passage sur cette adresse, avec des valeurs différentes à chaque fois. Au quatrième passage vous trouverez la valeur 400000 (Image base), et au cinquième, Al rajoutera la valeur de l'entry point du programme d'origine: 1000.
400000 + 1000 = 401000 soit l'entry point classique de la majorité des programmes "normaux".

PETITE signature, in the version 2.1 can so be 8B EC 88, but with the peculiarity of multiple passages, and that is a problem to ProcDump to realize a dsicompressed Dump.
Leaving of the principle that the entry point of the greatest number of programs is almost always 401000, here is what I propose to you to allow you to patch the original application:

1 To find of the place

Pour éviter les recherches longues et fastidieuses, j'opte désormais pour squatter un petit bout de l'icône de l'application. Dans la mesure ou les modifications apportées sont "discrètes", l'icône n'en est que très peu affectée, et je doute que quiconque puisse s'en rendre compte...
Pour trouver les octets qui la composent, il suffit d'utiliser un éditeur de ressources (type Borland Ressources WorkShop), et de double cliquer sur le nom de l'icône: vous en obtiendrez la chaîne, et que vous n'aurez plus qu'à retrouver à l'aide d'un éditeur hexadécimal du genre Hiew pour en connaître l'offset.

En l'occurrence, je vais installer mon futur patch en 00408770:

0137:00408770 FF00                INC DWORD PTR [EAX]
0137:00408772 0003                ADD [EBX],AL
0137:00408774 800000              ADD BYTE PTR [EAX],00
0137:00408777 0300                ADD EAX,[EAX]
0137:00408779 0000                ADD [EAX],AL
0137:0040877B 0300                ADD EAX,[EAX]
0137:0040877D 0000                ADD [EAX],AL


2- Rediriger vers cette place:

0137:0040D1D3  E998B5FFFF          JMP     00408770        > par un jmp
0137:0040D1D8  81ECD8BA0000        SUB     ESP,0000BAD8
0137:0040D1DE  8D8D887FFFFF        LEA     ECX,[EBP+FFFF7F88]

3- Le patch:

0137:0040876A  0003                ADD     [EBX],AL        > code de l'icône
0137:0040876C  FF00                INC     DWORD PTR [EAX] > code de l'icône
0137:0040876E  0003                ADD     [EBX],AL        > code de l'icône
0137:00408770  55                  PUSH    EBP             > restauration
0137:00408771  8BEC                MOV     EBP,ESP         > octets écrasés
0137:00408773  81FF00004000        CMP     EDI,00400000    > edi = 400000 ?
0137:00408779  7512                JNZ     0040878D        > si non, continu
0137:0040877B  66C705381E40006A00  MOV     WORD PTR [00401E38],006A > oui-> modifie
0137:00408784  8807                MOV     [EDI],AL        > restauration
0137:00408786  E94D4A0000          JMP     0040D1D8        > retour...
0137:0040878B  03C0                ADD     EAX,EAX         > rab de place
0137:0040878D  8807                MOV     [EDI],AL        > restauration des
0137:0040878F  E9444A0000          JMP     0040D1D8        > bytes écrasés et retour
0137:00408794  E000                LOOPNZ  00408796        > code de l'icône
0137:00408796  0003                ADD     [EBX],AL        > code de l'icône
0137:00408798  E000                LOOPNZ  0040879A        > code de l'icône

Quelques explications:

En 00408770 et 00408771, le patch restaure les codes écrasés par le Jmp 00408770 en 0040D1D3.
En 00408773 le test contrôle que Edi contient, ou non, la valeur 400000 (rappelez vous, c'est la valeur de l'image base, que l'on trouve dans Edi à l'avant dernier passage en 0040D1D3)
En 0040877B si Edi = 400000, le patch modifie les octets à l'adresse que vous visiez, l'application étant décompressée
En 00408784 vous restaurez les octets écrasés par le jump, et vous passez le relais à NotePad, Esi étant maintenant égale à 401000.
En 0040878D vous restaurez les codes écrasés par le jmp 00408770 en 0040D1D3
En 0040878F vous retournez au Loader de Petite, comme si de rien n'était...

As you were able to see it, this operation does not present any particular difficulties, and PETITE is the compressor the easiest by far to modify.
There will be possibly a matter: if you modify the characteristics of the sections of the application compressed, you will not be able to launch program, that this considering this intervention as being the track of a viral infection. On the other hand your patch will not put him the smallest problem.

Bonne journée

Christal