Retour
PROGRAMME ESPIÖN
Bifurqueur1.0
Une fois n'est pas coutume, commençons par la fin, concernant ce programme je remercie Sharpsighted pour son
aide précieuse (quelque soit le problème rencontré il semble toujours détenir la solution), ainsi que Teeji et
TipiaX pour leurs conseils.
Voir les exemples: EXEMPLE 1
EXEMPLE 2
PRESENTATION:
Voici la fonction de ce tout petit programme, quand on lance Bifurqueur il nous demande de choisir un
programme pour pouvoir s'y attacher. Ensuite pendant que le programme cible est en train de tourner,
Bifurqueur récupère tous les lignes (EIPs) par lesquelles la cible passe puis les enregistre dans un
fichier *.bif (mais c'est en fait un fichier *.txt lisible avec NotePad ou autre).
J'y vois l'application principale suivante :
- 1: Imaginons un logiciel en version Démo. On le trace avant que la date d'expiration soit révolue et on
récupère ses EIPs. En le retraçant une seconde fois après que la date d'expiration soit dépassée, on pourra
faire une comparaison pour trouver à quel premier endroit la cible bifurque entre la version 'Démo temps non dépassé'
et la version 'Démo temps dépassé'. Dans bien des cas on risquera de retrouver un saut précédé de la
comparaison qui fait ou non que le logiciel fonctionne en Version démo ou débridé.
ex:
cmp eax, dword ptr [0040XXXX] <-- reste alors à poser un BPM 0040XXXX W ou une de ses variantes.
jne 004.....
Bon, bien sûr mon programme n'est pas parfait, loin de là même... Il présente je pense au moins un ou deux
petits BUG qui m'auront échappé. En tout cas il présente un BUG que je n'ai pas réussit à éradiquer. J'ai
seulement pu le contourner malhabilement.
LE BUG: Quand vous sélectionnez l'Item 'CAPTURE1' ou 'CAPTURE2' Bifurqueur lance le
programme cible (il lance son Process). Mais voilà j'avoue ne pas avoir réussit à le refermer une fois
qu'on doit revenir dans Bifurqueur. Donc j'ai désactivé ces deux Items pour que vous ne puissiez pas
relancez de nouveau ce Process, car le relancer avant même qu'il n'ai été terminé aurait fait planter
votre ordi.
SOLUTION: Après avoir cliqué sur 'CAPTURE1' ou 'CAPTURE2' il vous faudra donc
cliquer sur 'EXIT' pour sortir de Bifurqueur et donc de la cible en elle-même. Puis relancer
Bifurqueur pour reprendre sur de bonnes bases.
Rappelez-vous que l'Item 'INITIALISATION' vide vos deux fichiers de comparaisons 'CAPTURE1.bif' et
'CAPTURE2.bif' donc ne l'utilisez pas n'importe quand, OK.
ATTENTION: Bifurqueur est obligé de regarder chaque EIP de la cible pour qu'il puisse les recopier.
Il fonctionne donc sur le principe du mode PAS à PAS (Single Step). Il est donc très lent, et sur un gros
programme il peut demander plus de 10mn, alors ne vous étonnez pas! J'ai trouvé une petite technique pour les gros programmes,
vous ouvrez Bifurqueur et vous faites attention de désélèctionner l'item de Bifurqueur qui peut-être est resté surligné
en bleu quand vous avez double-cliqué dessus pour le lancer. Ensuite lancez une capture sur le prog cible.
Et au lieu de cliquer à chaque fois sur 'Oui' quand on le demande (tous les 3000 octets), vous posez l'oreillette de votre casque de
walkman sur la touche 'O', vous placez votre calculette par dessus et un stylo entre la touche espace et les autres
touches du clavier pour empêcher la calculette de glisser. (Ça c'est du vécu).
EXEMPLE 1: Time.exe
Pour tester l'efficacité de Bifurqueur1.0 je lui ai créé un copain. Time est un tout petit programme qui
fonctionne comme pourrait le faire une Démo. Avant l'an 2005 (à vous de bouger votre horloge) il fonctionne
totalement, une fois cette date passée il ne veut plus rien savoir.
On va retrouver son problème avec Bifurqueur:
- Je fais INITIALISATION pour que les deux fichiers de CAPTURES soient propres
- CAPTURE1 sur Time.exe (avec votre horloge en dessous de l'an 2005)
(on ferme et rouvre Bif à cause du BUG)
- CAPTURE2 sur Time.exe (avec votre horloge au-dessus de l'an 2005)
(on ferme et rouvre Bif à cause du BUG)
- COMPARAISON:
Ce qui nous donne qu'un saut fait passer Timer par 0040101A en temps non dépassé.
Alors que ce même saut fait passer Timer par 00401026 en temps dépassé.
Un petit coup de Debugger:
:00401011 66390538314000 cmp word ptr [00403138], ax
:00401018 730C jnb 00401026
* Possible Ref to Menu: LEMENU, Item: "Horloge"
|
:0040101A C7052B31400001000000 mov dword ptr [0040312B], 00000001
:00401024 EB0A jmp 00401030
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401018(C)
|
:00401026 C7052B31400000000000 mov dword ptr [0040312B], 00000000
En rouge on retrouve bien les deux adresses où se produit la bifurcation.
Et en bleu on retrouvera forcément toujours le même schéma, d'une part le
saut incriminé au-dessus de l'une des deux adresses rouge et d'autre part la référence à ce saut au-dessus
de l'autre adresse rouge.
Après c'est à vous de voir comment vous pouvez remédier au problème. Donc ici soit forcer le saut, soit
modifier la comparaison, soit retrouver ce qui remplit l'adresse de comparaison genre: BPMB 00403138 W
Bon forcément, sur un programme normalement constitué mieux vaut opter pour le BPMB pour retrouver le mal à
la source, un simple saut forcé laisserait pratiquement à coup sûr des options désactivées ou d'autres
problèmes quelconques.
EXEMPLE 2: CDRom.exe
Voici un nouvel ami, son truc à lui c'est de détecter la présence ou non d'un CD dans un de vos lecteurs
de CDRom. (Que votre CDRom soit en D:\ E:\ ou F:\) Une restriction quand même si vous possédez plusieurs
lecteurs de CDRom, alors le CD sera testé dans le premier lecteur mais pas dans les suivants. (J'ai laissé
au plus simple)
Enfin bon, le problème n'est pas là!
Ce qui nous intéresse c'est de voir si Bifurqueur peut aussi s'occuper de ce nouveau cas:
- INITIALISATION pour que les deux fichiers de CAPTURES soient propres
- CAPTURE1 sur CDRom.exe (avec un CD dans le lecteur)
(on ferme et rouvre Bif à cause du BUG)
- CAPTURE2 sur CDRom.exe (sans CDRom)
(on ferme et rouvre Bif à cause du BUG)
- COMPARAISON:
Ce qui nous donne qu'un saut fait passer CDRom.exe par 0040114E quand on a un CD
dans le lecteur. Alors que ce même saut fait passer CDRom.exe par 00401115 si il n'y a plus
de CD.
Une nouvelle fois un petit coup de Debugger:
:0040110B E848020000 Call 00401358
:00401110 83F8FF cmp eax, FFFFFFFF
:00401113 7539 jne 0040114E
:00401115 C7057232400000000000 mov dword ptr [00403272], 00000000
...
...
...
:0040114E 58 pop eax
Bon on retrouve encore le fameux saut de bifurcation. Puisque on passe en 0040114E quand le CD est présent,
il faut ici forcer le saut avec un 'jmp'. Mais pour être plus propre il vaudrait mieux entrer dans le
'Call' puisque c'est lui qui modifie la valeur de eax qui sert pour le saut.
Ça risque d'être facile de retrouver les protection de type CD dans vos jeux. Du premier coup ça a
marché sur mon DUNE2000 préféré.
EXEMPLE3: Time2.exe
Débrouillez-vous ce sera votre coup d'essai. Au fait si vous souhaitez jouer un peu avec ce programme, je
vous conseille de surveiller un certain C:\blob.sys (un pauvre innocent!). Le détruire pourrait bien changer beaucoup de choses.
(J'avais aussi pensé à la base des registres en parallèle...)
Apparemment on peut aussi trouver des informations utiles sur des programmes compactés ou cryptés.
Pour ACDSee3.0 qui présente ce genre de protection, je touve une bifurcation entre 7FD31025 et 7FD317A2.
Mais ceci n'a pas de réelle signification. J'aurai d'abord dû décompresser ma cible pour être efficace.
Au fait il est maintenant trop tard pour moi, alors si quelqu'un pouvait m'envoyer le fichier Capture1.bif
de Restorator2.50 ce serait impécable. (ça devrait prendre environ 10min en laissant votre doit sur 'O' ou 'Enter')
Tout compte fait ne me l'envoyez pas (je viens de récupérer CAPTURE2). Il a fallut 40min et 28.2Mo!!! Sur
un fichier de cette taille, la comparaison ne dure qu' 1min 15s. (Pentium II 350MHz)
Retour
Par Morgatte