| 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: C0000040A 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=00000000Vous 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 sectionCalculez 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 nulsHistoire 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 remplacer0177: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 normalePar 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