| 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: 42000040Program 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: C2000080Program 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ôneQuelques 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