ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» º Programmation d'un crypteur d'executable º ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ Si vous etes un cracker vous savez surement ce que c'est qu'un crypteur d'exe. Ce genre de programme permet de cryter un programme, laissant la possiblite a celui ci de s'autodecrypter une fois en memoire. Un bon packer ou crypteur peut etre une arme redoutable contre les crackers (enfin pas si redoutable que ça mais ça peut etre bien chiant ;) Mon but ici ne sera pas de creer le meilleur crypteur, mais un crypteur tres simple pour faire office d'exemple. Un tel programme se code evidemment en assembleur. Libre a vous de le faire en C++ mais moi je le ferais en asm. Le compilateur utilise sera Tasm et non pas Masm car certains bridages de Masm sont tres chiants. (Masm refuse de compiler du code place dans la section .data alors que d'en notre cas cela sera utile pour ne pas avoir a changer les caracterisiques des sections avec procdump). Treve de bavardage, passons au coding. TiPiaX Strange Crypter ~~~~~~~~~~~~~~~~~~~~~~ Le code source sera divise en 2 parties distinctes. La premiere correspond au programme qui va en ouvrir un autre pour le crypter et la deuxieme partie sera le code que l'on va injecte dans l'executable et qui permettra le decryptage a l'execution. La deuxieme partie s'attachera a l'executable a la maniere d'un virus ce qui explique que le code soit tres similaire a un virus. D'ailleurs si vous ne le comprenez pas je vous conseille vivement de lire la partie "virus" du dernier Hccc (Hccc#5). La premiere partie va afficher une boite de dialogue. Cette boite de dialogue permet d'ouvrir un fichier executable. Ensuite les informations relatives a ce fichier sont donnees ainsi que les caracteristiques de la premiere et de la derniere section (ce sont celles qui nous interessent). L'algorithme de cryptage sera un simple XOR pour commencer. D'ailleurs un des defis de ce numeo d'Hccc est de creer un uncrypter pour ce cher crypteur (ça ne devrait pas etre bien difficile, surtout que les sources sont jointes). Le programme ne cryptera que la premiere section qui est la section de code. Le code de decryptage sera place dans la section que nous allons creer et on modifiera l'EntryPoint de l'hôte pour qu'il pointe sur ce code. (ce qui explique que les fichiers cryptes puissent etre reconnu par les AntiVirus comme "infectes".) Pour avoir acces aux APIs le programme va scanner le kernel a la recherche de l'API. Pour avoir une adresse du kernel on utilise la methode de la pile (voir Hccc#5). La principale difficultee reside dans la creation de la nouvelle section. Pour qu'il n'y ai aucun bug il faut aligner cette section en fonction du SectionAlignement. Par exemple si le RAWOFFSET de la section que nous voulons creer est 00007400 et que le SectionAlignement est de 00001000 alors il faudra arrondir le RAWOFFSET a 00008000. Pour pouvoir faire cela de façon automatisee il suffit de diviser 7400 par 1000. Le quotient obtenue est 7, on ajoute 1 puis on multiplie par 1000: (7+1)*1000 = 8000. Si jamais le reste etait negatif alors la section est deja alignee correctement. Pour creer la nouvelle section il faut savoir où la placer. On prend donc les caracteristiques de la derniere section presente. RawOffset de la derniere section Ainsi RawOffset = + RawSize de la derniere section et: VirtualOffset de la derniere section VirtualOffset = + VirtualSize de la derniere section la taille de la section que nous creeons dependra de la taille du code a injecter. Sa VirtualSize sera equivalente a sa RawSize. Il faut bien entendu modifier tous les autres parametres qui ont besoin d'une modification tel que la Size Of Image qu'il faudra aligner avec le FileAlignement. Le decrypteur va se decrypter a partir du VirtualOffset de la premiere section. Il decrypte autant de bytes que le precise la VirtualSize. Mais le plus simple est encore de regarder le source compose de 2 fichiers: le fichier du crypteur et celui du code a injecter: ; ; StrAnGe CrYpTeR par TiPiaX ; hccc@caramail.com ; ; Code pour Hccc#6. ; Petit coup de gueule: du code c'est ça et pas les merdes en ; VB qu'on voit partout. ; ; Compilateur: Tasm ; Syntaxe: tasm32 -ml -m5 -q crypter.asm ; tlink32 -Tpe -aa -x -c crypter.obj ,,,import32,,crypter.res ; ; lignes de code au total: 693+325 = 1018 ; ; Il n'y a pas besoin de changer les caracteristiques des sections < Les sources sont dans le fichier Sources.zip : crypter.zip > ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» º Programmation d'un crypteur d'executable (suite): Le code injecte º ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ < Les sources sont dans le fichier Sources.zip : crypter.zip > Et beh c'etait bien long a coder ;) moi je vais me descendre un enorme paquet de gateaux. J'ai passe ma journee devant le pc ;) Petite precision: n'essayez pas de crypter un fichier deja crypte par un packer comme UPX ou autres. Cela aboutirait a un mechant plantage. En revanche vous pouvez passer chaque executable plusieurs fois de suite dans le crypter :) Allez j'espere que cette article vous aura plu car il m'a donne beaucoup de mal. J'ai oublie de preciser que j'avais place un petit Anti-Softice avec un vulgaire Int 68h. Si vous avez Softice d'installe vous verrez donc une jolie petite boite de message lors de l'execution d'un executable crypte. Allez tchao TiPiaX/VDS