.--. .----------------------------------------------------------------/ /--. | / / | | Softice, l'outil d'un cracker / / 04 | | / / | '------------------------------------------------------------/ /------' '--' Softice est un logiciel de débogage à temps réel, il en est rendu à sa 4e version distribuée sur WindowsNT et Windows9x. A l'origine Softice est un logiciel utilisé pour trouver les bogues dans les logiciels informatiques, nous par contre nous l'utiliserons dans le seul but de cracker nos programmes cibles. Comme Softice est un des outils les plus utilisé pour cracker, il vaudrait mieux pour vous de bien le connaître enfin si c'est ce que vous recherchez vraiment sinon il y a d'autre texte sur Softice, plus complet pour les programmeurs avertis. Par contre si c'est le cracking qui vous intéresse et que vous ne connaissez pas encore Softice, n'hésitez pas à lire ce texte en entier car mes prochains textes sur le cracking seront relier à Softice dans la plupart des cas. Installez vous confortablement et lisez attentivement certains bouts seront peut-être un peu complexe pour ceux qui ne sont pas familiés avec les processeurs x86. Nous verrons le fonctionnement de Softice, des informations précieuses qu'il peut nous apporter et quelques petits trucs pour vous faciliter l'utilisation de Softice. Softice à été créé par Numega (http://www.numega.com), nous aurons la version 4.05 en téléchargement sur le site web de Mindkind. Une fois téléchargé nous avons notre fichier d'installation qui se nomme SI405w9x.exe, alors maintenant nous allons l'installer, nous cliquons sur le fichier d'installation et nous arrivons à une fenêtre qui nous demande d'entrer notre numéro de série, nous allons entrer 4207-552339 -B9 c'est celui que j'utilise personnellement mais je fournirai un petit générateur de clef qui offre les numéros de série de tous les logiciels que Numega ont créé, sur notre site web. Ensuite à la fenêtre suivante il vous demande l'emplacement que vous aimeriez l'installer, choisissez l'emplacement par défaut c'est-à-dire c:\program file\Numega\Softice95\ et assurez-vous de cocher les "program files" dans la fenêtre suivante et si vous voulez en savoir plus sur Softice cochez les documents, le reste est peu utile. Rendu à la fenêtre suivante vous aurez la configuration de votre carte vidéo et de votre souris, alors si vous ne trouvez pas votre carte vidéo dans cette petite fenêtre il vous suffit d'utiliser le "Standard VGA" avec "Universal Video Driver" et cliquez sur le bouton test pour faire un test de vidéo si tout va bien continuez, une fois fait cochez le port que votre souris utilise et passez à la fenêtre suivante, elle va vous demander si vous voulez ajouter une ligne dans l'autoexec.bat, à ce moment cochez oui et allez à la prochaine fenêtre, à cette fenêtre vous pouvez vous enregistrer en ligne pour avoir plus d'information sur Softice et les nouvelles versions qui pourraient arriver alors faites ce que bon vous chante. Nous avons fini la configuration de l'installation il ne reste plus que le message qui nous demande de redémarrer l'ordinateur mais n'y cliquez pas et sortez de l'installation, nous allons faire quelques modifications à un fichier de Softice avant de redémarrer. L'édition du fichier winice.dat, le fichier de configuration de Softice. Nous allons ouvrir ce fichier avec un éditeur texte comme notepad.exe, il vient avec Windows alors vous l'avez sûrement. Une fois son contenu dévoilé nous verrons les lignes de configuration, je vais vous expliquer que les lignes importantes, le reste laisser le par défaut ou referez vous à la documentation de Softice si vous voulez en savoir plus sur certain paramètre. PHYSMB=32 Cette ligne informe Softice du nombre de mémoire disponible sur votre ordinateur, remplacez donc le 32 qui est par défaut, par le nombre de mémoire vive (RAM) que vous avez. J'ai entendu dire qu'il y avait des problèmes d'affichage qui survenaient quelques fois alors si vous avez un problème de ce genre avec Softice n'hésitez pas à remettre ce paramètre à 32. INIT="X;" Cette ligne est la ligne d'initialisation, Softice exécute les commandes de cette ligne au démarrage. C'est donc dans ce paramètre que vous mettrez votre préférence face à Softice. Je vais nommer ceux que la plupart des gens utilisent mais c'est personnel à chacun. Je commence par ajouter la commande "Faults OFF", cette commande met en sourdine les apparitions de Softice lorsqu'il y a des fautes détectées. J'ajoute aussi la commande "CODE ON", cette commande affiche l'hexadécimal (OPCODE) des commandes ASM. J'ajoute à la suite les grandeurs de la fenêtre principale pour moi qui suis en résolution 1024 j'utilise "Lines 90" et "Width 100" ainsi que les grandeurs des fenêtres tel que la fenêtre des datas "WD 15" et la fenêtre de code "WC 40" et j'ajoute aussi "WR" pour faire apparaître la fenêtre des registres. Pour finir d'ajoute la ligne pour les couleurs personnellement j'aime mieux changer les couleurs alors ça donne ceci "COLOR 0A F 70 7". Alors voici la ligne d'initialisation que j'ai dans mon winice.dat. INIT="Faults OFF;CODE ON;Lines 90;Width 100;WD 15;WC 40;WR;COLOR 0A F 70 7 F;X;" ;EXP=c:\windows\system\kernel32.dll Ces lignes sont les lignes d'exportations, elles vont exporter les apis des fichiers drv/dll/exe. Pour ma part je les exporte tous, pour les rendre exportable enlevez le point-virgule au début de la ligne. Maintenant vous pouvez REDÉMARRER Donc rendu à ce point si vous devriez avoir redémarré et donc avoir Softice en mémoire, il est en tout temps accessible par la combinaison des touches CTRL+D. Softice se présente sous une apparence assez sombre, une fenêtre noire avec beaucoup d'information, de l'information concernant les registres, la mémoire, le code ASM et ses opcodes etc... La fenêtre des registres. On affiche cette fenêtre avec la commande WR. Voici à quoi ressemble la fenêtre des registres: +---------------------------------------------------------------------------+ |EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000000 ESI=00000000 | |EDI=00000000 EBP=00000000 ESP=00000000 EIP=00000000 o d i s z a p c | |CS=0000 DS=0000 SS=0000 ES=0000 FS=0000 GS=0000 | +---------------------------------------------------------------------------+ Cette fenêtre affiche les registres et leur contenu. Pour changer le contenu d'un registre sous Softice il suffit d'utiliser la commande "R". Quelque exemple: R ; ici un curseur apparaît et nous laisse libre de modifier les registres que l'on veut. R EBX ; ici un curseur se positionnera sur le registre EBX pour nous laisser l'éditer. R EAX 0 ; ici le registre eax sera mit à 0. Les registres sont des emplacements "mémoire interne" au processeur, puisque cette mémoire est dans le processeur elle a comme caractéristique d'être très rapide et elle est utilisée continuellement par les programmes. Il y a 4 grands groupes de registre sur les processeurs x86 et un registre 16bits un peu spécial, il y a les registres généraux, les registres d'index, les registres pointeur, les registres de segment et un registre qui se nomme l'indicateur. Tous les registres ont une taille de 16 bits qui ont été attribué dans le temps des processeurs 8086, la naissance des processeurs x86, mais depuis le nouveau processeur 386 il est désormais possible d'utiliser les registres généraux en 32bits et même de les séparer en 8bits (Low,High). Les registres généraux: ------------------------------------------------------------------------ 8bits 16bits 32bits Remarque ------------------------------------------------------------------------ AL, AH AX EAX Accumulateur, sert vraiment à tout. BL, BH BX EBX Base, sert à gérer l'adressage de base. CL, CH CX ECX Compteur, sert souvent dans les boucles. DL, DH DX EDX Données, utiliser dans les résultats calcul. ------------------------------------------------------------------------ Les registres d'index: ------------------------------------------------------------------------ 16bits 32bits Remarque ------------------------------------------------------------------------ DI EDI Destination Index, sert aux copies mémoire et au comparaison. SI ESI Source Index, sert au copie mémoire et au comparaison ------------------------------------------------------------------------ Les registres pointeur: ------------------------------------------------------------------------ 16bits 32bits Remarque ------------------------------------------------------------------------ BP EBP Base Pointer, Associer au registre de segment SS. SP ESP Stack Pointer, Associer au registre de segment SS. IP EIP Instruction Pointer, Pointe sur l'instruction en exécution. C'est le pointeur de la pile. ------------------------------------------------------------------------ Les registres de segments: ------------------------------------------------------------------------ 16bits Remarque ------------------------------------------------------------------------ CS Code Segment, contient les instructions qui seront exécutées. DS Data Segment, contient les données. SS Stack Segment, permet d'accéder à la pile. ES Extra Segment, utilisé lors des copies de bloc. FS Segment Supplémentaire, ressemble beaucoup à ES. GS Segment Supplémentaire, ressemble beaucoup à ES. ------------------------------------------------------------------------ Le registre indicateur: ------------------------------------------------------------------------ O D I S Z A P C Leur Nom | | | | | | | | | | | | | | | +------- Carry Flag | | | | | | +--------- Parity Flag | | | | | +----------- Auxiliary Flag | | | | +------------- Zero Flag | | | +--------------- Sign Flag | | +----------------- Interrupt Flag | +------------------- Direction Flag +--------------------- Overflow Flag C: Si après une instruction de calcul il y a une retenue ce registre est à 1 sinon il est à 0. P: Si après une opération le résultat à un nombre pair de bits à 1 alors il est à 1 sinon il est à 0. ex: 11101101 ici ont à 6 1 donc c'est pair le flag est à 1. A: Relier au carry flag. Z: Si ce flag est à 1 c'est que le résultat de l'opération égale 0 sinon il est mit à 0. ex: 5-5 = 0 le résultat est 0 donc le bit est à 1. S: Si ce flag est à 0 c'est que le résultat de l'opération est positif sinon c'est qu'il est négatif ! I: Permet d'empêcher les interruptions de se déclencher. D: Sert dans les copies mémoires. O: Lors d'opérations sur des nombres signés si le résultat est plus grand que le registre qui contient le résultat ce bit est à 1 sinon c'est 0. ------------------------------------------------------------------------ La fenêtre des datas, On affiche cette fenêtre avec la commande WD. Voici à quoi ressemble la fenêtre des datas: DS:ADDR HEXADECIMAL DATA +------------------------------------------------[ byte ]----------------+ |0000:FFFFFFF0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ......... | |0000:FFFFFFF1 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ......... | |0000:FFFFFFF2 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ......... | |0000:FFFFFFF3 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ......... | |0000:FFFFFFF4 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ......... | |0000:FFFFFFF5 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ......... | |0000:FFFFFFF6 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ......... | |0000:FFFFFFF7 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ......... | |0000:FFFFFFF8 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ......... | +------------------------------------------------------------------------+ Cette fenêtre affiche les adresses, le code hexadécimal et leur équivalent ascii. Vous pouvez défiler la fenêtre des datas en tout temps avec les flèches, pageup, et pagedown en tenant enfoncer ALT en même temps. Il y a plusieurs façons de représenter l'information mémorielle. Voici ces représentations : Byte = db ex: db EAX Long = dl ex: dl EAX Dword = dd ex: dd EAX Word = dw ex: dw EAX Short = ds ex: ds EAX 10 byte = dt ex: dt EAX En générale on utilise le mode Byte(8bits) mais utilisez celui qui vous chante. Pour afficher le contenue d'une adresse il suffit d'utiliser la commande "D ". Quelque exemple: D EBX ; affiche le contenu de EBX. D 00040000 ; affiche le contenu de l'adresse 00040000. Pour éditer l'hexadécimal ou le data utilisez la commande "E . Quelque exemple: E EBX ; positionne un curseur à l'emplacement mémoire de EBX nous laissant le plein pouvoir de l'éditer comme on le veut. E 00040000 ; positionne un curseur à l'emplacement mémoire de 0040000 nous laissant le plein pouvoir de l'éditer comme on le veut. nb: pour pouvoir éditer le data utiliser la touche TAB. La fenêtre de code, On affiche cette fenêtre avec la commande WC. Voici à quoi ressemble la fenêtre de code: CS:ADDR OPCODE ASM +----------------------------------------------------------------------+ |0028:FFFFFFFF C3 RET | |0028:FFFFFFFF C3 RET | |0028:FFFFFFFF 90 NOP | |0028:FFFFFFFF 90 NOP | |0028:FFFFFFFF 90 NOP | |0028:FFFFFFFF 90 NOP | |0028:FFFFFFFF 90 NOP | +----------------------------------------------------------------------+ Cette fenêtre affiche les adresses, le code hexadécimal (OPCODE) et le code ASM. Vous pouvez défiler la fenêtre des datas en tout temps avec les flèches, pageup, et pagedown en tenant enfoncer CTRL en même temps. Pour éditer l'hexadécimal ou le data utilisez la commande "E . Quelque exemple: A ; permet de changer la commande ASM sur l'adresse que le surligneur est positionné. A EAX ; permet de changer la commande ASM que le registre EAX pointe. Évidement quand vous voyez le code il est fixe (en arrêt) et vous avez une ligne qui surligne. Nous avons donc notre fenêtre de code et notre ligne de surlignement, cette ligne est en faite un marqueur pour indiquer à quel ligne de code nous sommes rendu à exécuter. Tracer, tracer c'est l'art d'exécuter le programme ligne par ligne de façon à voir le code ce qui nous permet de l'interpréter en même temps que le processeur. Pour tracer il y a 2 touches: F8: Cette touche va tracer le programme en entrant dans les calls, les calls sont des fonctions appelées. F10: Cette touche va tracer le programme sans entrer dans les calls. La dernière fenêtre n'est qu'une fenêtre d'info avec quoi Softice nous communique des messages et c'est dans cette même fenêtre que l'on tape les commandes. Il y a d'autres fenêtres plus ou moins importante que vous pourrez faire apparaître avec les commandes suivante, WF pour la Floating Point Window, WMSG pour la Windows Messages, WS pour la Call Stack Window, WW pour la Watch Window et WX pour la PII XMM registres, les autres nous les avons vu plus haut. Les FKeys, Softice à des FKeys bien propre à lui avec le temps ils sont devenus un standard en cracking alors ne les changez pas si possible car ils sont configurable dans le fichier winice.dat. F1(Help): Aide F2(WR) : Affiche la fenêtre des registres ou la cache. F3(SRC) : Change pour la source, mixer et code. F4(RS) : Voir l'arrière plan que Softice cache. F5(X) : Quitter Softice. F6(EC) : Aller de la fenêtre de code à la fenêtre de commande. F7(HERE): Aller au curseur activer. F8(T) : Tracer en entrant dans les calls. F9(BPX) : Poser un point d'arrêt sur la ligne surligner. F10(P) : Tracer sans entrer dans les calls. F11(G @SS:ESP) : Sortir du call. F12(P RET) : Met un point d'arrêt après le ret. Alt+F1(WR) : Affiche la fenêtre des registres ou la cache. Alt+F2(WD) : Affiche la fenêtre des datas ou la cache. Alt+F3(WC) : Affiche la fenêtre du code ou la cache. Alt+F4(WW) : Affiche la fenêtre des "Watch" ou la cache. Alt+F5(CLS) : Efface la fenêtre de commande. Alt+F8(XT R) : Entre dans le mode de traçage. Les points d'arrêt, ce qu'il fait la force de Softice est sûrement les points d'arrêt, je vais vous décrire les différents points d'arrêt et vous donner les commandes rattachées à eux et des exemples. Les points d'arrêt sur les exécutions, grâce à eux nous pouvons mettre des points d'arrêt sur des api ou des adresses ce qui nous facilitent la tâche beaucoup plus, au lieu de tracer jusqu'à tel et tel api nous avons juste à lui mettre un point d'arrêt. BPX (Break Point On Execution) BPX address [IF expression] [DO bp-action] Quelque exemple: BPX GetDlgItemTextA ; met un point d'arrêt sur l'api GetDlgItemTextA BPX 00040000 ; met un point d'arrêt sur l'adresse 00040000 BPX EAX ; met un point d'arrêt sur le registre EAX BL (List current breakpoints) BL pour avoir la liste des points d'arrêt qui sont en cours d'utilisation. BC (Clear breakpoint) BC list | * pour effacer tous les points d'arrêt utilisés BC *, pour effacer qu'un point d'arrêt utilisé BC list dont la liste est donnée par BL (ex: BC 00). BD (Disable Breakpoint) BD list | * pour désactiver tous les points d'arrêt utilisés BD *, pour désactiver qu'un seul point d'arrêt utilisé BD list dont la liste est donnée par BL (ex: BD 00). BE (Enable Breakpoint) BE list | * pour activer tous les points d'arrêt utilisés BE *, pour activer qu'un seul point d'arrêt utilisé BE list dont la liste est donnée par BL (ex: BE 00). Les points d'arrêt sur la mémoire, grâce à eux nous pouvons mettre des points d'arrêt direct sur la mémoire de cette manière nous pouvons savoir quand tel et tel adresse ou registre à tel et tel data. BPM (Breakpoint on Memory) BPM[size] address [R|W|RW|X] [debug register] [IF expression] [DO bp-action] Le paramètre size fait référence au grandeur en bits, Byte, Word, Dword, l'access du programme lui peut être R(read), W(write), RW(read & write), X(execution). La mémoire est un peut plus complexe quand vient le temps de mettre des points d'arrêt, car il faut calculer la mémoire linéaire et non juste le seg:offset original. Pour calculer ceci il vous faudra d'abord utiliser la commande "PAGE", elle s'utilise d'une façon simple "PAGE seg:offset" exemple: PAGE 0030:007004CB ainsi ça retourne la mémoire linéaire qui est 007004CB, dans ce cas si elle est pareille mais dans d'autre cas elle sera différente, ensuite pour mettre le point d'arrêt mémoire il faut faire BPM 0030:addr linéaire. Exemple: BPM 0030:007004CB ; met un point d'arrêt sur la zone mémoire 0030:007004CB Les points d'arrêt sur les interrupteurs, ils sont rarement utilisés mais peuvent être très utiles. Un interrupteur on pourrait dire que c'est des procédures pré écrit interne au processeur, elles ont tout leur rôle à jouer et peuvent être intéressantes quand viens le temps de cracker car beaucoup d'interrupteur sont utilisés sans que l'on ne s'en aperçoit. BPINT (Breakpoint on Interruption) BPINT interruption-number [IF expression] [DO bp-action] Exemple: BPINT 21 AH=00 ; met un point d'arrêt sur l'interruption qui dit au système d'exploitation que le programme présent est terminé et qu'il doit être rendu au programme d'appel. nb: je netterrai un .hlp sur notre site web qui contient tous les interrupteurs. Les points d'arrêt sur les Windows Messages, ce sont des points d'arrêt très important et utile quand nous sommes mal pris. BMSG (Bream on Windows Message) BMSG hwnd [L] [begin-msg [end-msg]] [IF expression] hwnd est le handle de la fenêtre pour avoir tous les hwnd il suffit de taper HWND dans Softice vous aurez ainsi la liste, vous pouvez aussi utiliser HWND programme.exe il vous donnera la liste de sens handle personnel. Pour ceux qui ne connaissent pas c'est quoi un handle et bien c'est des étiquettes numériques données aux objets de façon à les identifiés. Exemple: BMSG 0888 WM_QUIT ; met un point d'arrêt le msg WM_QUIT du handle 0888. nb: pour ceux qui ne connaissent pas les WinMSG je ferrai un petit texte bientôt. Les expressions, elles aident beaucoup à augmenter la précision d'une commande qui supporte le [IF expression], de cette manière nous ne faisons plus que mettre des points d'arrêt sur un api général qui peut être nommer des dizaines de fois, nous pouvons mettre une expression pour augmenter la précision de ce même point d'arrêt et donc n'avoir qua le traiter qu'une seule foi au lieu d'une dizaine de fois. Voici la liste des instructions disponibles: +----------------------------------------------------------------------+ |Opérateur d'indirection | | | | Ex: Description: | | -> ebp->8 retourne le dword pointé par ebp+8) | | . ebx.8 retourne le dword pointé par ebx+8) | | * *ecx retourne la valeur dword pointée par ecx | | @ @eax retourne la valeur pointée par eax | | | +----------------------------------------------------------------------+ |Opérateur mathématique | | | | Description: | | / Division | | % Modulo | | << ou >> Décalage de bits | | ?+ Addition d'un nombre en base décimal | | ?- Soustraction d'un nombre en base décimal | | | +----------------------------------------------------------------------+ |Opérateurs logiques | | | | Description: | | ! NOT logique | | && AND Logique | | || OR Logique | | == Comparaison d'égalité | | != Comparaison d'inégalité | | < Plus petit que | | > Plus grand que | | <= Plus petit que ou égal | | >= Plus grand que ou égal | | | +----------------------------------------------------------------------+ Voici la liste des fonctions disponibles: +----------------------------------------------------------------------+ | Fonction | | | | Description: | | Byte Conversion en Byte. | | Word Conversion en Word | | Dword Conversion en DWord | | Hibyte Conversion en HiByte | | Hiword Conversion en HiWord | | Sword Conversion en Word Signé | | Long Conversion en Long Signé | | WSTR Affiche la chaîne unicode | | Flat Conversion d'une adresse relative à une adresse linéaire.| | | | CFL Carry flag | | PFL Parity flag | | AFL Auxiliary flag | | ZFL Zero flag | | SFL Sign flag | | OFL Overflow flag | | RFL Resume flag | | TFL Trap flag | | DFL Direction flag | | IFL Interrupt flag | | NTFL Nested Task flag | | | | DataAddr Retourne l'adresse du premier élément affiché dans la | | zone de data. | | CodeAddr Retourne l'adresse de la première instruction affichée | | dans la zone de code. | | | | Process Process actif. | | Thread Thread actif. | | | | PID Id du processus actif | | TID Id du thread actif | | | | BPcount Nombre de point d'arrêt activé | | BPtotal Nombre total de point d'arrêt | | BPmiss Nombre de point d'arrêt échoué | | BPindex Index du point d'arrêt actuel | | | +----------------------------------------------------------------------+ Les conditions, elles sont utilisés pour augmenter la précision de la commande. Les 2 tableaux plus hauts nous montrent les expressions et les fonctions que nous pouvons utiliser dans ces conditions. je vais vous faire quelques exemples, ces exemples sont très révélateurs. Exemple: BPX EIP if(EAX==48) && (BPCOUNT==3) ; ce point d'arrêt s'arrêtera au moment que EAX aura 30d (0x48) comme valeur et que ça ferra 3 fois qu'il aura eu cette valeur ci. En conclusion Softice est un outil très précieux quand il s'agit de découvrir les petits secrets des programmes, que les compagnies inventent des protections comme du code encrypté, du code compressé ou du code polymorphique, Softice sera toujours capable de les contourner même avec les nouvelles protections contre Softice je vous en parlerai dans un prochain texte. Tout ce que les compagnies font c'est d'augmenter notre temps de cracking... :. :. .: :::30.Avril.2001::.............................................::Naxis::