Theres no trick to being a humorist when you have the whole government working for you. Theres aucune astuce pour être un humoriste quand vous avez l'ensemble du gouvernement qui travaillent pour vous.
Basic Reverse Engineering with White ScorpionReverse Engineering de base avec blanc Scorpion
For this "tutorial" we will use a real program called PDF2Word. Pour ce "tutorial" nous allons utiliser un logiciel appelé PDF2Word. I stumbled upon this program when trying to convert a pdf document to a word document (duh..). Je suis tombé sur ce logiciel lors de la tentative de convertir un document PDF à un document Word (duh..).
The funny thing on this program is that it costs $39.95 and that it is released under the GPL. La drôle de chose sur ce logiciel est qu'il en coûte $ 39.95 et qu'il est distribué sous la GPL.
Let's start shall we? Permettez-nous de commencer nous?
1: Obtain a copy of the program, We will use version 1.6 in this tutorial (You'll need1: Obtenir une copie de l'émission, nous allons utiliser la version 1.6 dans ce tutoriel (Vous aurez besoin
Google to get this version).Google pour obtenir cette version).
2: Obtain a copy of ollydbg at http://www.ollydbg.de2: Obtenir une copie de ollydbg à http://www.ollydbg.de
Start PDF2Word and you will see a screen with title "Please register .." PDF2Word de début et vous verrez un écran avec le titre "S'il vous plaît enregistrer .." Type in an email address and a bogus registration key and hit OK. Entrez une adresse e-mail et un faux clé d'enregistrement et cliquez sur OK. Write down the error message you get since we will need it later on: Écrivez le message d'erreur car vous nous en aurons besoin plus tard: "Series number error, please check it and try again.""Erreur de numéro de série, s'il vous plaît vérifier et essayer à nouveau."
Now close pdf2word and start Ollydbg. Pdf2word maintenant fermer et de commencer Ollydbg.From within ollydbg go to file, open and browse to À partir de ollydbg aller au fichier, ouvrir et naviguer à C:Program FilesPDF2Word v1.6 and select pdf2rtf.exe .C: Program FilesPDF2Word v1.6 et sélectionnez pdf2rtf.exe.
Once the program is loaded right-click somewhere in the code table and select Search for Une fois le logiciel est chargé cliquez avec le bouton droit quelque part dans la table de code et sélectionnez Recherche de Then select All referenced text strings". Puis sélectionnez Toutes les chaînes de texte de référence ". A new window will open with all text strings in the program.Une nouvelle fenêtre s'ouvrira avec toutes les chaînes de texte dans le logiciel.Scroll up and right-click once more.Faites défiler vers le haut et cliquez avec le bouton droit une fois de plus. Now select [i]Search for text and put in the errorstring you had earlier in the program:Maintenant, sélectionnez [i] Recherche pour le texte et le mettre dans l'erreur Errorstring vous avait déjà dans le logiciel: "Series number error, please check it and try again." ."Erreur de numéro de série, s'il vous plaît vérifier et essayer à nouveau.". deselect "Case Sensitive" and press OK. désélectionnez "Sensible à la casse" et appuyez sur OK.
You will see the following line highlighted: Vous verrez la ligne suivante mis en évidence: CODE : CODE:
00429F6F | PUSH pdf2rtf.00468270 | ASCII "Series number error, please check it and try again."00429F6F | PUSH pdf2rtf.00468270 | ASCII "erreur de numéro de série, s'il vous plaît vérifier et essayer à nouveau."
Now press <F2> to put a breakpoint on it. Maintenant, appuyez sur <F2> de mettre un point d'arrêt sur elle.Directly above you will find some other strings Directement au-dessus, vous trouverez quelques autres chaînes which might be of interest as well so put a breakpoint on them to. qui pourraient être d'intérêt, si bien que mettre un point d'arrêt sur les.These are: Ce sont: "Thank you registered" and "Thank you registered VeryPDF PDF2Word v1.6.""Merci de votre inscription" et "Merci de votre inscription VeryPDF PDF2Word v1.6."
Now double click on one of the lines and press <F9> to start the program. Maintenant, double-cliquez sur une des lignes de presse et <F9> pour démarrer le logiciel.
The registration window will come up again, so now put in an email address, a dummy registration-key La fenêtre d'enregistrement sera de nouveau, afin de mettre en maintenant une adresse e-mail, un mannequin-clé d'enregistrement and press OK. et appuyez sur OK.
Go back to Olly and you will see the following line highlighted: Retour à Olly et vous verrez la ligne suivante mis en évidence: CODE : CODE:
00429F6F .00429F6F.68 70824600 PUSH pdf2rtf.00468270 ; |Text = "Series number error, please check it and try again."68 70824600 PUSH pdf2rtf.00468270; | Texte = "erreur de numéro de série, s'il vous plaît vérifier et essayer à nouveau."
This is our error message again and the program has stopped right before displaying it. Il s'agit de notre nouveau message d'erreur et le logiciel a arrêté juste avant de l'afficher. You can see this error message is part of a [color=red]MessageBoxA[/color] call, this is the Vous pouvez voir ce message d'erreur fait partie d'un [color = red] MessageBoxA [/ color] appel, il s'agit de la API responsible for displaying the Message. API responsable de l'affichage du message.If you look a couple of lines earlier you will Si vous regardez quelques lignes plus tôt vous see another MessageBoxA call where instead of our errormessage now theMessageBoxA voir un autre appel lorsque notre lieu de la errorMessage maintenant message "Thank you registered VeryPDF PDF2Word v1.6." is located.message "Merci de votre inscription VeryPDF PDF2Word v1.6." est situé. This means that if we have the correct serial it will display the registered message, and if Cela signifie que si nous avons la bonne série, il affichera le message enregistré, et si we don't we will get the error. nous ne sommes pas, nous aurons l'erreur. The program will need to decide if your serial is correct before it can display any of these Le logiciel devra décider si votre série est correcte avant de pouvoir afficher l'une de ces messages. The code to do so is usually located close to the messages so scroll up a bit until Le code de le faire est généralement situé à proximité de la faire défiler des messages de façon un peu jusqu'à ce que you see a piece of code containing a JNE,JE,JNZ or JZ. vous voyez un morceau de code contenant une JNE, JE, ou JNZ QZ.These are jumps that occur when a specific Ce sont des sauts qui se produisent quand une event is met. événement est remplie. Usually the event is tested in the code directly in front of it. Habituellement, l'événement est testé dans le code directement en face d'elle. In this case you should end up at the following lines: Dans ce cas, vous devriez en place à la suivante: CODE : CODE:
00429F2E .00429F2E.85C0 TEST EAX,EAX85C0 TEST EAX, EAX 00429F30 .00429F30.74 39 JE SHORT pdf2rtf.00429F6B74 39 JE COURT pdf2rtf.00429F6B
As you can see EAX is tested against itself which in this case will jump to 00429F6B if Comme vous pouvez le voir EAX est testé contre lui-même qui, dans ce cas, saut à 00429F6B si EAX has the value 0. EAX a la valeur 0. if we trace the jump we will see that it will jump over the registered message and end up si l'on trace le saut, nous verrons qu'il sauter par-dessus le message enregistré et jusqu'à fin right before the error message. juste avant le message d'erreur.This means that if EAX = 0 we will get the error message and Cela signifie que si EAX = 0, nous aurons le message d'erreur et our serial is wrong. Notre série n'est pas correct.
At this point we could remove the JE SHORT pdf2rtf.00429F6B code and fill it with À ce stade, nous pourrions supprimer le JE COURT pdf2rtf.00429F6B code et remplissez-le avec NOP so we will always get the correct message since the jump is never made, but that won't help NOP, nous allons toujours avoir le bon message car le saut n'est jamais fait, mais ce ne sera pas utile here cause if you restart the program it will still ask you to register. cause ici si vous redémarrez le program il encore vous demander de vous inscrire.
So we need to continue our search. Nous devons donc continuer notre recherche.We need to figure out where EAX is getting it's value from. Nous avons besoin de savoir où se EAX il de la valeur. 2 lines above TEST EAX,EAX we see 2 lignes d'essai ci-dessus EAX, EAX nous voir CODE : CODE:
This is a call to a function somewhere else in the program and you can bet your life it is this Ceci est un appel à une fonction à un autre endroit dans le logiciel et vous pouvez parier votre vie c'est ce function that sets the EAX value. fonction qui établit la valeur EAX. And so we need to figure out what this function does. Et donc nous avons besoin de savoir ce que cette fonction ne.To do this we will put another breakpoint Pour ce faire, nous mettrons un autre arrêt at CALL pdf2rtf.00429720 by highlighting the line and press <F2>.APPEL à pdf2rtf.00429720 en mettant en évidence la ligne de presse et <F2>. Now we want to restart the program to make it break on the function call. Maintenant, nous voulons relancer le program afin de le rendre pause sur l'appel de la fonction.This is done by Cela se fait par pressing <CTRL>+<F2>. appuyant sur + <CTRL> <F2>.Select YES to the question asked (press left arrow and hit enter) and the program is restarted. Choisissez OUI à la question posée (appuyez sur la flèche gauche et appuyez sur Entrée) et le logiciel est redémarré. Now press <F9> again to let the program run. Maintenant, appuyez de nouveau <F9> à laisser le program terme. You will see the registration box pop-up again, so put in an email address and a bogus serial and press OK. Vous verrez l'enregistrement boîte de pop-up de nouveau, de manière à mettre une adresse e-mail et une série de faux et appuyez sur OK.
As you can see the program will break on the CALL pdf2rtf.00429720 line. Comme vous pouvez le voir le program pause sur l'appel pdf2rtf.00429720 ligne. Now press <F7> to step into the call. Maintenant, appuyez sur <F7> à l'étape de l'appel. The first 4 lines are not of interest to us so we will start analyzing the code from 00429725 . Les 4 premières lignes ne sont pas d'intérêt pour nous, nous allons commencer analysant le code 00429725. The code we have there is Le code que nous avons, il est CODE : CODE:
I've copied the entire block until the first check of the serial above to safe space, so refer J'ai copié tout le bloc jusqu'à ce que la première vérification de la série ci-dessus à la sécurité de l'espace, afin référence to above code in this explanation. à code ci-dessus dans cette explication. [quote] 1st line --> move our entered serial to ESI 1ère ligne -> déplacer notre entrée à l'ESI de série 2nd line --> not important 2ème ligne -> pas important 3rd line --> move the first byte (character) of our serial into AL 3rd Line -> passer le premier octet (caractère) de notre série en AL 4th line --> move the second byte (first+1) of our serial into CL 4e ligne -> déplacer le second octet (première +1) de notre série en CL 5th line --> move the 13th byte (first+E) of our serial into DL 5ème ligne -> déplacer dans l'octet 13 (première + E) de notre série en DL 6th line --> move content of AL (first character of our serial) into [ESP+18] 6th Line -> déplacer le contenu de AL (premier caractère de notre série) en [ESP 18] 7th line --> clear the contents of AL 7ème ligne -> effacer le contenu de AL 8th line --> move the content of CL (second character) into [ESP+30] 8th Line -> déplacer le contenu du Crédit Lyonnais (deuxième personnage) en [ESP 30] 9th line --> move the 14th byte (first+F) of our serial into CL 9th Line -> déplacer la 14e octet (première + F) de notre série en CL 10th,11th,12th,13th line --> clear the contents of [ESP+19],[ESP+31],[ESP+25] & [ESP+D] since AL still is empty. 10e, 11e, 12e, 13e ligne -> effacer le contenu de [ESP 19], [ESP 31], [ESP 25] et [ESP + D] depuis AL est encore vide. 14th line --> move the third byte (first+2) of our serial into AL 14e ligne -> déplacer le troisième octet (première +2) de notre série en AL 15th line --> compare content of AL with 0x24 (hex for the $ sign) 15e ligne -> comparer le contenu de l'AL avec 0x24 (hex $ pour la signer) 16th line --> move the 13th byte of our serial into [ESP+24] 16e ligne -> déplacer dans l'octet 13 de notre série en [ESP 24] 17th line --> move the 14th byte of our serial into [ESP+C] 17e ligne -> déplacer la 14e octet de notre série en [ESP + C] 18th line --> Jump to 004297B0 if AL is not equal to 24 ($ sign). 18e ligne -> Aller à 004297B0 si AL est pas égal à 24 (signe $). [/quote] [/ quote] If you trace the jump in the 18th line you will see that it jumps to the following code: Si vous trace le saut dans la 18e ligne, vous verrez qu'il passe à le code suivant: CODE : CODE:
004297B0 |> 5F POP EDI004297B0 |> 5F POP EDI 004297B1 |.004297B1 |.5E POP ESI5E POP ESI 004297B2 |.004297B2 |.33C0 XOR EAX,EAX33C0 XOR EAX, EAX 004297B4 |.004297B4 |.5D POP EBP5D POP EBP 004297B5 |.004297B5 |.83C4 30 ADD ESP,3083C4 30 Ajouter ESP, 30 004297B8 .004297B8.C3 RETNC3 RETN
Which means so much as restore values, set EAX to 0 and return from where we were called. Ce qui signifie que tant de rétablir les valeurs, EAX fixé à 0 et retourner d'où nous avons été appelés. If we let this happen then EAX will be 0 which will give us the error message. Si nous laissons cela se produise alors EAX sera de 0 qui va nous donner le message d'erreur.
So what do we know now from this code? Alors, que savons-nous maintenant de ce code?
- AL should be equal to 0x24 or we will get the error message - AL doit être égale à 0x24 ou nous aurons le message d'erreur - the program moves the third character of our serial into AL before comparing it to 0x24 - Le logiciel se déplace le troisième caractère de notre série AL avant en le comparant à 0x24 - the program moves the 14th byte of our serial into CL - Le logiciel se déplace la 14e octet de notre série en CL
from above we can conclude that the third character of our serial should be a $ sign and de ci-dessus, nous pouvons conclure que le troisième personnage de notre série devrait être un signe $ et that our serial should be at least 14 characters long since the 14th character is moved. que notre série devrait être d'au moins 14 caractères de long depuis la 14 e caractère est déplacé.
So our serial will be something like: ..$........... Donc, notre série sera quelque chose comme: ..$...........
It's time for the next piece of code: Il est temps pour le prochain morceau de code: CODE : CODE:
Let's analyze it: Let's analyze: [quote] 1st line --> move the address of the function MSVCRT.atoi to EDI 1ère ligne -> passer l'adresse de la fonction MSVCRT.atoi à l'EDI atoi is a function which converts ASCII characters to integers (numbers).atoi est une fonction qui convertit les caractères ASCII pour des entiers (chiffres). 2nd line --> put the 16th byte of our serial into EDI 2ème ligne -> mettre la 16e octet de notre série en EDI 3rd line --> push our byte to the stack as an argument to atoi 3rd Line -> pousser nos octet de la pile comme un argument à atoi 4th line --> call atoi. 4e ligne -> atoi appel.the result will be in EAX le résultat sera dans EAX 5th line --> move content of EAX into EBP 5ème ligne -> déplacer le contenu de EAX dans EBP 6th line --> move the first byte of our serial into EAX 6th Line -> passer le premier octet de notre série en EAX 7th line --> push our byte to the stack as an argument to atoi 7ème ligne -> pousser nos octet de la pile comme un argument à atoi 8th line --> call atoi. 8th Line -> atoi appel.the result will be in EAX le résultat sera dans EAX 9th line --> add EAX to EBP and store the result in EBP 9th Line -> Ajouter EAX à EBP et stocker le résultat dans EBP 10th line --> not important to us 10e ligne -> pas important pour nous 11th line --> compare EBX with the value 0x0A (10) Ligne 11 -> EBX comparer avec la valeur 0x0A (10) 12th line --> if EBX is not 0x0A then jump to 004297B0 (put 0 into EAX and return). Ligne 12 -> si EBX n'est pas 0x0A puis sauter à 004297B0 (mettre 0 dans EAX et retour). [/quote] [/ quote] NOTE: You probably wonder how i figured out which byte is used to put into atoi, well hereREMARQUE: Vous vous demandez sans doute comment j'ai réalisé octet qui est utilisée pour mettre en atoi, et ici it is: I've put in serials multiple times with different digits as values and compared them to il est: J'ai mis en série plusieurs fois avec différents chiffres en tant que valeurs et les a comparés à the output of atoi in EAX. la sortie de atoi dans EAX.This resulted in the corresponding bytes. Cela s'est traduit dans les bytes correspondants.
What do we know from this code? Que savons-nous de ce code? - our 16th byte is put into EDI, this means that our serial must be at least 16 characters long - Notre 16ème octet est mis en EDI, ce qui signifie que notre série doit être d'au moins 16 caractères de long - the 16th byte is put into atoi, which means it much have a value between 0-9 - La 16e octet est mis en atoi, ce qui signifie que beaucoup ont une valeur comprise entre 0-9 - the 1st byte is put into atoi as well, which also means it must have a value between 0-9 - Le 1er octet est mis en atoi ainsi, ce qui signifie aussi qu'il doit avoir une valeur comprise entre 0-9 - the value of our first byte is added to the value of our 16th byte and together they must be - La valeur de notre premier octet est ajouté à la valeur de notre 16ème octet et ensemble, ils doivent être equal to 0xA (10). 0xA à égalité (10).
So now we have the following serial: 1.$............9 Donc, maintenant nous avons la série suivante: 1 .$............ 9 as you can imagine the values of our 1st and 16th byte can be anything as long as they both comme vous pouvez l'imaginer les valeurs de notre 1er et le 16 octet peut être quelque chose aussi longtemps que les deux are digits and when added to each other are equal to 10 decimal. sont des chiffres et lorsque ajoutées les unes aux autres sont égaux à 10 décimales.
Time for the next piece of code: Temps pour le prochain morceau de code: CODE : CODE:
Let's analyze it: Let's analyze: [quote] 1st line --> our 15th byte is put into ECX 1ère ligne -> notre 15ème octet est mis en ECX 2nd line --> push our byte to the stack as an argument to atoi 2ème ligne -> pousser nos octet de la pile comme un argument à atoi 3rd line --> call atoi. 3rd Line -> atoi appel.the result will be in EAX le résultat sera dans EAX 4th line --> our 2nd byte is put into EDX 4e ligne -> notre 2e octet est mis en EDX 5th line --> move the result of atoi into EBP 5ème ligne -> déplacer le résultat de atoi dans EBP 6th line --> push our 2nd byte to the stack as an argument to atoi 6th Line -> pousser notre 2e octet de la pile comme un argument à atoi 7th line --> call atoi. 7ème ligne -> atoi appel.the result will be in EAX le résultat sera dans EAX 8th line --> add the result of our 15th and 2nd byte together and store in EBP 8th Line -> ajouter le résultat de notre 15e et 2e octet ensemble, et stocker dans EBP 9th line --> not important to us. 9th Line -> pas important pour nous. 10th line --> check if our 15th byte + our 2nd byte added together is equal to 0x0A (10). 10e ligne -> vérifier si notre 15ème octet + notre 2e octet ensemble ajoutée est égale à 0x0A (10). 11th line --> if not, then another jump to 004297B0 Ligne 11 -> Si non, puis un autre saut à la 004297B0 [/quote] [/ quote] As you can see this code is very similar to the codeblock before, so i won't explain it any Comme vous pouvez le voir ce code est très semblable à la codeblock avant, je ne vais pas expliquer tout further. plus loin.
Now we have the following serial: 12$...........89 Maintenant, nous avons la série suivante: 12 $........... 89 We still need to analyze some code, but we're getting somewhere ;-) Nous avons encore besoin d'un code analyzer, mais nous obtenons quelque part ;-)
Lets take a look at the final piece of code from this call: Permet de jeter un coup d'oeil à la dernière pièce du code de cet appel: CODE : CODE:
Analysis: [quote] 1st line --> since ESI still contains our serial, the 4th byte is now checked against value 0x24 1ère ligne -> depuis ESI contient encore notre série, la 4ème octet est maintenant vérifié la valeur 0x24 2nd line --> if not equal, then goto the famous 004297B0 2ème ligne -> si pas égal, puis passez à la célèbre 004297B0 3rd line --> move our 6th byte to CL 3rd Line -> déplacer Notre 6e octet à CL 4th line --> check if our 6th byte is equal to 0x23 (# sign) 4e ligne -> vérifier si Notre 6e octet est égal à 0x23 (signe #) 5th,6th,7th line --> not important 5e, 6e, 7e ligne -> pas important 8th line --> sets the byte in AL to 1 if our check above is equal 8th Line -> définit l'octet en AL à 1 si notre contrôle ci-dessus est égal 9th line --> not important 9th Line -> pas important 10th line --> return to where this call was called from. 10e ligne -> retour à l'endroit où cet appel a été appelé à partir. [/quote] [/ quote] What we see here is that our 4th byte is compared to 0x24 ($ sign remember?) as well and that Ce que nous voyons ici est que le 4e octet est comparée à 0x24 ($ signe vous vous rappelez?), Ainsi que et the 6th byte is compared to 0x23 (the # sign). la 6e octet est comparée à 0x23 (le signe #).
If that is correct then AL is set to 1 meaning EAX won't be 0 and so causing the program to Si cela est correct alors AL est mis à 1 EAX sens ne sera pas 0 et si l'origine du program give the registered message. donner le message enregistré.
In short: En bref: -check if 3th == $-vérifier si 3ème == $ -check if 1st + 16th == 10-vérifier si 1er + 16e == 10 -check if 15th + 2nd == 10-vérifier si 15e + 2e == 10 -check if 4th == $-vérifier si 4e == $ -check if 6th == #-vérifier si 6e == #
All other characters are of no importance to create a valid serial so our result will be: Tous les autres caractères ne sont d'aucune importance de créer de série valide afin de permettre à nos résultat sera le suivant:
12$$.#........8912 $$.#........ 89
You can fill in the remaining dots with anything you like and as long as the rules above are Vous pouvez remplir le reste des points à ce que vous voulez et aussi longtemps que les règles ci-dessus sont correct you can change the 1th,2nd,15th and 16th byte as well. corriger vous pouvez changer les 1er, 2ème, 15ème et 16ème octet ainsi.
Now close OllyDbg and start PDF2Word. OllyDbg maintenant fermer et de commencer PDF2Word. Enter your email-address and enter one of your newly created serials. Entrez votre adresse e-mail et entrez l'un de vos séries nouvellement créé.
When you press ok you will be thanked for registering. Lorsque vous appuyez sur OK, vous serez remercié pour l'enregistrement.You're welcome ;-) Vous êtes les bienvenus ;-) The result of your entered information is put in a string and written to Le résultat de votre information entrée est mis dans une chaîne et écrit à %WINDIR%system32pdf2word.dat% WINDIR% system32pdf2word.dat
In case you want another serial just delete the dat file and put in a new one. Dans le cas où vous voulez une autre série de la supprimer le fichier DAT et de mettre en une nouvelle.
Of course this is a very simple protection, but it is a nice example to cover the basics of Bien sûr, cela est très simple protection, mais il est un bel exemple pour couvrir les bases de reverse engineering. l'ingénierie inverse.
Cast your vote on this article Voter sur cet article *Note: the order of the votes has been reversed. * Note: l'ordre des votes a été inversée.
lol 10/10 this pwns! lol pwns ce 10/10!you should write more :) vous devez écrire plus:)
Roy20 - 01:26 pm Saturday February 09th, 2008Roy20 - 01:26 pm Samedi Février 09e, 2008
nice!!!love olly :P 10/10 Nice! amour Olly: P 10/10
tjszl1 - 09:24 am Sunday February 10th, 2008tjszl1 - 09:24 h dimanche Février 10, 2008
Good article!I love you! Bon article! Je t'aime!
lordofwhee - 12:04 pm Sunday February 10th, 2008lordofwhee - 12:04 h Dimanche Février 10, 2008
Always nice to know this kind of thing. Toujours bien de savoir ce genre de chose.10/10 10.10
Luckyperfect - 02:43 pm Sunday February 10th, 2008Luckyperfect - 02:43 h Dimanche Février 10, 2008
Good Stuff, Reverse Engineering will get you out of problems or give you a solution to one a lot of times. Good Stuff, Reverse Engineering va vous sortir de problèmes ou de vous donner une solution à un beaucoup de temps. A learn a lot on this article although I was unable to do its content do to lack of update, the PDF2words 1.6 is no longer available on the NET, all mirrors and Links will download the 3.0 version and the current version of ollydgb doesnt have the \"Search for\" option required on STEP 2 it appears the hold Right Click menu is different. A apprendre beaucoup sur cet article même si je n'était pas en mesure de faire de son contenu faire à l'absence de mise à jour, la PDF2words 1.6 ne sont plus disponibles sur le net, tous les miroirs et les liens de téléchargement de la version 3.0 et la version actuelle de ollydgb n'est pas équipé de la \ "Recherche de \" option nécessaire à l'étape 2, il semble tenir le menu est différent. Could you please update the article? Pourriez-vous s'il vous plaît mettre à jour l'article? Thank you for knowledge Sir I look forward to learn more from you and your colleagues. Merci Monsieur le Président de la connaissance J'ai hâte d'apprendre plus de vous et de vos collègues. All the best always... Tous les meilleurs toujours ... -Luckyperfect- -Luckyperfect - \"Scientia est Potentia\" \ "Scientia est potentia \"
tjszl1 - 07:18 am Tuesday February 12th, 2008tjszl1 - 07h18 Mardi 12 Février, 2008
white_scorpion : white_scorpion: I\'m very angry.It\'s not a malicious software.You can use anti-virus software to check it. I \ 'm très angry.It \' est pas une software.You malveillant peut utiliser un logiciel anti-virus pour le vérifier.
lol 10/10 this pwns! lol pwns ce 10/10! you should write more :) vous devez écrire plus:)