Les limitations de temps

Les Time-limites

By Falcon(le 18/02/00) - E-Mailfalcon16@caramail.com  

 

Les infections que l’on peut relever, et sur lesquelles s’appuyer, sont principalement les suivantes :

Une limitation dans le temps
Un ou plusieurs écrans Shareware
Des fonctions limitées

1 - Les limitations dans le temps

Dans le cas de trial versions limitées à un certain nombre de jours, il y a forcement quelque part, une comparaison entre la date d'installation, et la date de fin de la période d'essai.
Ces comparaisons peuvent se faire:

- Dans l'exécutable lui même
- Dans un fichier de type DLL
- Dans un fichier temporaire créé à l'occasion

(Dans les deux derniers cas de figure, un utilitaire de type Filemon permet de repérer l'utilisation de ces fichiers)

- Sur le nombre de jours d'utilisation: cmp eax,0000001E
pour une période de 30 jours (30 décimal = 1E hexadécimal)
La valeur dans Eax fait office de compteur depuis le jour de la " mise en service ". Dès que cette valeur est égale à 30, la période d'essai est terminée. Le test peut aussi avoir l'aspect suivant:

add eax,0000001E
cmp dword ptr [ebp-5C], eax

Ou eax est égale à la date d'installation, à laquelle on ajoute 30d, et que l'on compare à la valeur contenue dans [ebp-5C], où se trouve enregistré la date de fin de la trial période.

Pour éviter une recherche dans un désassembleur sur la valeur 0000001E, certains programmeurs calculent cette durée dans une autre unité que les jours, par exemple en secondes. Pour une durée de 30 jours, la comparaison se ferait sur la base suivante:

Ce mode de conversion peut nous faire gagner du temps, pour peu que l'on y pense. Il est plus rapide de faire une recherche sur 00278D00 que sur 0000001E qui risque de nous donner de nombreuses occurrences dont la majorité n'auront rien à voir avec le test traqué.

Il y différentes façons d'exprimer une date, comme on l'a vu: en JJ/MM/AA, en jours (le 30/08/99 est le 242ème jour de l'année 1999), en secondes (une période d'essai de 30 jours et aussi égale à 2592000 s), etc...
Il reste que l'année est le plus difficile à camoufler. En gardant un œil sur la fenêtre des registres (WR pour l'activer dans SoftIce), vous allez tracer avec F10 en surveillant les valeurs qui passent dans ces registres, et en guettant tout particulièrement un 07FC (1999 en décimal)


Dans les cas que j 'ai rencontré, cette comparaison donne, en simplifiant:

call appel_de_la_date
mov eax, date d'installation ou compteur du nombre de jours depuis l'installation
cmp eax, date de fin, ou nombre de jours accordée pour la période d'essai

(Méfiez-vous: La deuxième ligne peut parfois se trouver au dessus du call appel_de_la_date!)

Il n'existe pas beaucoup d'API ou de fonctions Windows qui gère le temps. Pour voir lesquelles vont être sollicitées, il suffit d'interroger les " fonctions importées " dans W32dasm, et de chercher:

- GetLocalTime
- GetFileTime
- GetSystemTime
- CompareFileTime

- FileTimetoLocalFileTime
- FileTimetoSystemTime
- SetTimer
- KillTimer

Je pense avoir cité les principales. GetLocalTime est souvent utilisé !

 Retour au sommaire ...

2 - Les écrans " Time Expired "

Si cette méthode ne donne rien, vous avez d'autres possibilités. Par exemple, vous pouvez avancer l'horloge de votre PC pour forcer l'apparition, à un moment ou à un autre, de l'écran "votre période d'essai à pris fin...". Ce genre de boite de dialogue peut nous servir. Pour "situer" le call qui en provoque l'affichage, on peut utiliser la technique suivante:

Avant de cliquer sur le bouton [OK], lancez SoftIce par un CTRL-D, puis tapez TASK. L'ensemble des applications actives à ce moment précis vont être listées:

TaskName

SS:SP

StackTop

StackBot

StackLow

TaskDB

Events

Esscode

0000:0000

006C6000

006D0000

4226

4BD7

0000

Explorer

0000:0000

00640000

00640000

3486

33FF

0000

etc...


Dans la liste que vous obtiendrez, vous allez relever le nom de l'application qui vous semble correspondre à votre cible. Afin de la localiser en mémoire, vous taperez HWND "nom de l'application". Vous aurez alors:

Window Handle

hQueue

Sz

Qowner

ClassName

Window Procedure

<FONT face="verdana, arial, he