Accueil > > > [C/DEVCPP]LIREEXEC (LECTURE DANS LA BASE DE REGISTRE DE L'HISTORIQUE WINDOWS CODÉ EN ROD 13 AVEC GESTION DE LA DATE)
[C/DEVCPP]LIREEXEC (LECTURE DANS LA BASE DE REGISTRE DE L'HISTORIQUE WINDOWS CODÉ EN ROD 13 AVEC GESTION DE LA DATE)
Information sur la source
Description
Il faut être administrateur sur la machine, Pour chacun des comptes de la machine il récupère l'historique (si il n'est pas désactivé) codé en ROD13 (césar), Il récupère la date de dernière utilisation, le numéro de session, et le nombre de fois d'exécution pour les applications, liens, etc ... Codé en C sous DEVCPP. L'exécutable est dans le zip, renommer "LireExec_V_.ex" en "LireExec_V_.exe". Bon voilà ma première source j'espère qu'elle vous plaira, tous les commentaires sont les bienvenus :)
Source
- //------------------------------------------------------------------------------
- // Projet LireExec : Récupération de l'historique d'exécution d'application et liens de windows,
- // décodage de la dernière utilisation, nombre d'utilisation et numéro de session de la dernière utilisation.
- // Auteur : Hanteville Nicolas
- // Fichier : main.c
- // Version : 1.1
- // Date de modification : 26/07/2008
- // Site : http:\\omni.a.free.fr
- //------------------------------------------------------------------------------
- //---------------------------------------------------------------------------------------------------------------
- //objectifs: (gestion multi utilisateurs)
- // - récupération d'un chemin,
- // - ajout entête,
- // - test si le log est activé pour le compte en test,
- // - test si codage road13 activé,
- // - récupération pour chaque clé de la date de dernière modification,
- // - numéro de session,
- // - nombre de fois exécuté,
- // - clé décodé.
- //---------------------------------------------------------------------------------------------------------------
-
- //------------------constantes-----------------
- #define TAILLE_TMP 256
- #define TAILLE_REG_DEFAULT 512
- #define TAILLE_REG_EXT 1024
- #define TAILLE_REG_DBEXT 2048
- //----------------fin-constantes---------------
-
- //------------------libs-----------------
- #include <stdio.h>
- #include <windows.h>
- //----------------fin-libs---------------
- //---------------------------------------------------------------------------------------------------------------
- // on donne une valeur hexa de 8 caracteres et on obtient le resultat
- // gestion des chiffres + caractères minuscules et majuscules
- //---------------------------------------------------------------------------------------------------------------
- unsigned long HexaToDec(char *hexa,unsigned int taille)
- {
- unsigned long k=0;//resultat
- unsigned long j=1,i; // j =coef multiplicateur et i variable de boucle
- //traitement de la valeur hexa
-
- for (i=(taille-1);i>0;i--)//calcul de la valeur hexa en decimal
- {
- switch(hexa[i])
- {
- case '1':k=k+j;break;
- case '2':k=k+(2*j);break;
- case '3':k=k+(3*j);break;
- case '4':k=k+(4*j);break;
- case '5':k=k+(5*j);break;
- case '6':k=k+(6*j);break;
- case '7':k=k+(7*j);break;
- case '8':k=k+(8*j);break;
- case '9':k=k+(9*j);break;
- case 'a':k=k+(10*j);break;
- case 'A':k=k+(10*j);break;
- case 'b':k=k+(11*j);break;
- case 'B':k=k+(11*j);break;
- case 'c':k=k+(12*j);break;
- case 'C':k=k+(12*j);break;
- case 'd':k=k+(13*j);break;
- case 'D':k=k+(13*j);break;
- case 'e':k=k+(14*j);break;
- case 'E':k=k+(14*j);break;
- case 'f':k=k+(15*j);break;
- case 'F':k=k+(15*j);break;
- };
- j=j*16;
- };
- return k;
- };
- //---------------------------------------------------------------------------------------------------------------
- // decoder une chaine de caractères de ROD13 en lisible
- //---------------------------------------------------------------------------------------------------------------
- void RODTOASCII(char *donnee,char *resultat,int taille)
- {
- int i;
-
- strcpy(resultat,"");
-
- for (i=0;i<taille;i++)
- {
- switch(donnee[i])
- {
- case 'a': strcat(resultat,"n"); break;
- case 'b': strcat(resultat,"o"); break;
- case 'c': strcat(resultat,"p"); break;
- case 'd': strcat(resultat,"q"); break;
- case 'e': strcat(resultat,"r"); break;
- case 'f': strcat(resultat,"s"); break;
- case 'g': strcat(resultat,"t"); break;
- case 'h': strcat(resultat,"u"); break;
- case 'i': strcat(resultat,"v"); break;
- case 'j': strcat(resultat,"w"); break;
- case 'k': strcat(resultat,"x"); break;
- case 'l': strcat(resultat,"y"); break;
- case 'm': strcat(resultat,"z"); break;
- case 'n': strcat(resultat,"a"); break;
- case 'o': strcat(resultat,"b"); break;
- case 'p': strcat(resultat,"c"); break;
- case 'q': strcat(resultat,"d"); break;
- case 'r': strcat(resultat,"e"); break;
- case 's': strcat(resultat,"f"); break;
- case 't': strcat(resultat,"g"); break;
- case 'u': strcat(resultat,"h"); break;
- case 'v': strcat(resultat,"i"); break;
- case 'w': strcat(resultat,"j"); break;
- case 'x': strcat(resultat,"k"); break;
- case 'y': strcat(resultat,"l"); break;
- case 'z': strcat(resultat,"m"); break;
- case 'A': strcat(resultat,"N"); break;
- case 'B': strcat(resultat,"O"); break;
- case 'C': strcat(resultat,"P"); break;
- case 'D': strcat(resultat,"Q"); break;
- case 'E': strcat(resultat,"R"); break;
- case 'F': strcat(resultat,"S"); break;
- case 'G': strcat(resultat,"T"); break;
- case 'H': strcat(resultat,"U"); break;
- case 'I': strcat(resultat,"V"); break;
- case 'J': strcat(resultat,"W"); break;
- case 'K': strcat(resultat,"X"); break;
- case 'L': strcat(resultat,"Y"); break;
- case 'M': strcat(resultat,"Z"); break;
- case 'N': strcat(resultat,"A"); break;
- case 'O': strcat(resultat,"B"); break;
- case 'P': strcat(resultat,"C"); break;
- case 'Q': strcat(resultat,"D"); break;
- case 'R': strcat(resultat,"E"); break;
- case 'S': strcat(resultat,"F"); break;
- case 'T': strcat(resultat,"G"); break;
- case 'U': strcat(resultat,"H"); break;
- case 'V': strcat(resultat,"I"); break;
- case 'W': strcat(resultat,"J"); break;
- case 'X': strcat(resultat,"K"); break;
- case 'Y': strcat(resultat,"L"); break;
- case 'Z': strcat(resultat,"M"); break;
- case '\\': strcat(resultat,"\\"); break;
- case ' ': strcat(resultat," "); break;
- case ':': strcat(resultat,":"); break;
- case '+': strcat(resultat,"+"); break;
- case '-': strcat(resultat,"-"); break;
- case '_': strcat(resultat,"_"); break;
- case '.': strcat(resultat,"."); break;
- case ']': strcat(resultat,"]"); break;
- case '[': strcat(resultat,"["); break;
- case '(': strcat(resultat,"("); break;
- case ')': strcat(resultat,")"); break;
- case '#': strcat(resultat,"#"); break;
- case '0': strcat(resultat,"0"); break;
- case '1': strcat(resultat,"1"); break;
- case '2': strcat(resultat,"2"); break;
- case '3': strcat(resultat,"3"); break;
- case '4': strcat(resultat,"4"); break;
- case '5': strcat(resultat,"5"); break;
- case '6': strcat(resultat,"6"); break;
- case '7': strcat(resultat,"7"); break;
- case '8': strcat(resultat,"8"); break;
- case '9': strcat(resultat,"9"); break;
- case '\'': strcat(resultat,"'"); break;
- case '\0': strcat(resultat,"\0");
- return;
- };
- };
- }
- //---------------------------------------------------------------------------------------------------------------
- // lecture de données binaires dans la base de registre, transformés suivant le besoin et écrite dans le fichier
- // & mise en forme dans le fichier
- // [DATE](ID SESSION - NB USE) CHAINE
- //---------------------------------------------------------------------------------------------------------------
- void LireValBin(HKEY ENTETE,char *chemin,char *nom,FILE *fic,char *donnes)
- {
- //variables
- DWORD tailleCle=TAILLE_REG_DEFAULT;
- HKEY CleTmp=NULL;
- char Valeur[TAILLE_REG_DEFAULT];//16=taille max des données
- char Count[8];//récupération en hexa
- char Id[8];///récupération en hexa
- char Date1[8];//récupération en hexa
- char Date2[8];//récupération en hexa
- char Ttmp[TAILLE_REG_DBEXT];
-
- //convertion de la date
- FILETIME FileTime, LocalFileTime;
- SYSTEMTIME SysTime;
-
- //lecture de la valeur binaire
- // on ouvre la cle
- if (RegOpenKey(ENTETE,chemin, &CleTmp)==ERROR_SUCCESS)
- {
- //On recupere la taille de la cle qui va être lue
- if (RegQueryValueEx(CleTmp, nom, NULL, NULL, NULL, &tailleCle)==ERROR_SUCCESS)
- {
- strcpy(Valeur,"");
- //On lit la valeur
- if (RegQueryValueEx(CleTmp, nom, NULL, NULL, Valeur, &tailleCle)==ERROR_SUCCESS)
- {
- //décortication
-
- if (tailleCle==8)//si =8 alors il n'y a que le nombre d'utilisation
- {
- //lecture du nombre d'exécution
- //transformation ASCII to HEXA et HEXA to DEC
- sprintf(Count,"%02x%02x%02x%02x",Valeur[7]&255,Valeur[6]&255,Valeur[5]&255,Valeur[4]&255);
-
- snprintf(Ttmp,TAILLE_REG_DBEXT,"[jj.mm.aaaa hhh mmm sss](ID SESSION: 0000 - NB USE: %04d) %s\n",HexaToDec(Count,8),donnes);
- fputs(Ttmp,fic);
-
- }else if (tailleCle==16) //si = 16 = 4 nb utilisation, 4 id de session, 8 date utilisation
- {
- //lecture du nombre d'exécution
- //transformation ASCII to HEXA et HEXA to DEC
- sprintf(Count,"%02x%02x%02x%02x",Valeur[7]&255,Valeur[6]&255,Valeur[5]&255,Valeur[4]&255);
-
- //lecture numéro de session
- sprintf(Id,"%02x%02x%02x%02x",Valeur[3]&255,Valeur[2]&255,Valeur[1]&255,Valeur[0]&255);
-
- //lecture 1er partie de la date
- sprintf(Date1,"%02x%02x%02x%02x",Valeur[11]&255,Valeur[10]&255,Valeur[9]&255,Valeur[8]&255);
-
- //lecture 2ème partie de la date
- sprintf(Date2,"%02x%02x%02x%02x",Valeur[15]&255,Valeur[14]&255,Valeur[13]&255,Valeur[12]&255);
-
- FileTime.dwLowDateTime = (DWORD)HexaToDec(Date1,8);
- FileTime.dwHighDateTime = (DWORD)HexaToDec(Date2,8);
-
- //dans le cas ou ==0 non utilisable et pas de modification sur le nombre d'utilisation
- if (( FileTime.dwLowDateTime==0)&&(FileTime.dwHighDateTime==0))
- {
- sprintf(Ttmp,"[jj.mm.aaaa hhh mmm sss](ID SESSION: %04d - NB USE: %04d) %s",HexaToDec(Id,8),HexaToDec(Count,8),donnes);
- }
- else
- {
- FileTimeToLocalFileTime(&FileTime, &LocalFileTime);
- FileTimeToSystemTime(&LocalFileTime, &SysTime);
-
- //comme le nombre d'utilisation commence à 6, on effectue une diminution de 5^^
- sprintf(Ttmp,"[%02d.%02d.%02d %02dh %02dm %02ds](ID SESSION: %04d - NB USE: %04d) %s",SysTime.wDay,SysTime.wMonth,SysTime.wYear,SysTime.wHour,SysTime.wMinute,SysTime.wSecond,HexaToDec(Id,8),HexaToDec(Count,8)-5,donnes);
- }
- fputs(Ttmp,fic);
- fputs("\n",fic);
- };
-
- //fermeture de la clé
- RegCloseKey(CleTmp);
- return;
- }
- }
- //fermeture de la clé
- RegCloseKey(CleTmp);
- }//si on arrive pas a récupérer les données
- //formatage et écriture dans le fichier
- snprintf(Ttmp,TAILLE_REG_DBEXT,"[jj.mm.aaaa hhh mmm sss](ID SESSION: 0000 - NB USE: 0000) %s",donnes);
- fputs(Ttmp,fic);
- fputs("\n",fic);
- }
- //---------------------------------------------------------------------------------------------------------------
- // lecture de valeur tres importantes comme des descriptions limités à 1 caractère
- //---------------------------------------------------------------------------------------------------------------
- int LireGValeur(HKEY ENTETE,char *chemin,char *nom,char *Valeur)
- {
- //variables
- DWORD tailleCle;
- HKEY CleTmp=NULL;
-
- // on ouvre la cle
- if (RegOpenKey(ENTETE,chemin, &CleTmp)==ERROR_SUCCESS)
- {
- //On recupere la taille de la cle qui va être lue
- if (RegQueryValueEx(CleTmp, nom, NULL, NULL, NULL, &tailleCle)==ERROR_SUCCESS)
- {
- if (tailleCle<2)//gestion de la taille de la clé si on dépace 1 on quitte pour éviter buffer overflow
- {
- if (RegQueryValueEx(CleTmp, nom, NULL, NULL, Valeur, &tailleCle)==ERROR_SUCCESS)
- {
- RegCloseKey(CleTmp);
- return TRUE;
- }
- }
- }
- //On ferme la cle
- RegCloseKey(CleTmp);
- }
- return FALSE;
- }
-
- //---------------------------------------------------------------------------------------------------------------
- // fonction principale (MAIN)
- //---------------------------------------------------------------------------------------------------------------
- int main(void)
- {
- //variables
- FILE *fic; //fichier de résultat
- HKEY CleTmp=0,CleTmp2=0,CleTmp3=0; //entête clé
- DWORD nbValue=0,nbSubKey2=0,nbSubKey3=0; //nombre de sous clé
- int j,k,l; //variable de boucle
- int TailleNomSubKey2,TailleNomSubKey3; //taille des clés de récupération de données
- DWORD TailleNomValue=TAILLE_REG_EXT;
- DWORD TailleMAXValue=TAILLE_REG_EXT;
-
- //variables de transitions et lecture de données
- char chemintmp[TAILLE_REG_DBEXT];
- char NomSubKey2[TAILLE_REG_EXT];
- char NomSubKey3[TAILLE_REG_EXT];
- char chemin[TAILLE_REG_DBEXT]; // le chemin complet c lui
- char NomValeur[TAILLE_REG_EXT]; // Nom de la Valeur recupere
- char Valeur[TAILLE_REG_EXT];
- char resultat[TAILLE_REG_EXT];
- char tmp;
- int ROD13ENABLE=1;
-
- // test
- char ltmp[1024];
-
-
-
- //présentation:
- printf("LireExec V 1.1, 26/07/2008 par Nicolas Hanteville de http:\\\\omni.a.free.fr\n"
- "recuperation de l'historique windows code en ROD13.\n\n"
- "Necessite les droits administrateurs!!!\n");
-
- //ouverture du fichier de résultat
- if ((fic= fopen("resultat.txt","w+"))==NULL)
- printf("ERREUR - Creation du fichier resultat impossible!!!\n");
- else
- {
- //création de l'entête aide
- fputs("----------------------------------------------------\n"
- "LireExec V 1.1, 26/07/2008 par Nicolas Hanteville\n"
- "de http:\\\\omni.a.free.fr\n"
- "récupération de l'historique windows codé en ROD13.\n"
- "----------------------------------------------------\n\n"
- "Format:\n"
- "-----------\nClé source\n-----------\n"
- "[Date de dernier accès](Numéro de session - nombre d'utilisation) clé : chaine\n"
- "\nType de clé:"
- "\n---------------------------------------------------"
- "\nUEME_RUNPIDL : Fichier local, titre de page web"
- "\nUEME_RUNPATH : Exécutables"
- "\nUEME_CTLSESSION : 1ère clé créé"
- "\nUEME_CTLCUACount : Compte courant"
- "\nUEME_UISCUT : Couper presse-papier ???"
- "\nUEME_UIQCUT : Couper presse-papier ???"
- "\nUEME_UIHOTKEY : Touche raccourcis"
- "\nUEME_RUNWMCMD : Exécuté sous Commandes DOS "
- "\nUEME_RUNCPL : Applet du panneau de configuration"
- "\nUEME_UITOOLBAR : Raccourcis de bar accès rapide\n\n\n"
- ,fic);
-
- // récupération du chemin de chacun des utilisateurs:
- if (RegOpenKey((HKEY)HKEY_USERS,"",&CleTmp2)==ERROR_SUCCESS)
- {
- //nombre de sous clés
- if (RegQueryInfoKey (CleTmp2,NULL,NULL,NULL,&nbSubKey2,NULL,NULL,NULL,NULL,NULL,NULL,NULL)==ERROR_SUCCESS)
- {
- //on traite chacune des clé une par une
- for (k=0;k<nbSubKey2;k++)
- {
- TailleNomSubKey2=TAILLE_REG_DBEXT; // à chaque boucle on réinitialise
- //lecture de la clé "k"
- if (RegEnumKeyEx (CleTmp2,k,NomSubKey2,(LPDWORD)&TailleNomSubKey2,NULL,NULL,NULL,NULL)==ERROR_SUCCESS)
- {
- //création du chemin de récupération
- snprintf(chemintmp,TAILLE_REG_DBEXT,"%s\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\",NomSubKey2);
-
- // maintenant on récuper le ID pour construire la cle a ouvrire final
- if (RegOpenKey((HKEY)HKEY_USERS,chemintmp,&CleTmp3)==ERROR_SUCCESS)
- {
- //récupération du nombre de sous clés
- if ((RegQueryInfoKey (CleTmp3,NULL,NULL,NULL,&nbSubKey3,NULL,NULL,NULL,NULL,NULL,NULL,NULL)==ERROR_SUCCESS))
- if (nbSubKey3>0)//si il y a bien des sous clés alors on récupère leurs noms:
- {
-
- //test si les logs sont activés ou non pour chacun des utilisateurs
- fputs("************************************************************************************************************************************\n",fic);
-
- ROD13ENABLE=1;
- //test si les logs sont codés en ROD13
- //\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\Settings as: NoEncrypt = 1 (DWORD)
- //test dans chemintmp si NoEncrypt==1
- if (LireGValeur(HKEY_USERS,chemintmp,"NoEncrypt",&tmp))
- {
- if (tmp=='1')
- {
- fputs("Codage en ROD13 désactivé (\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\NoEncrypt = 1 (DWORD))\n",fic);
- ROD13ENABLE=0;
- }
- else
- fputs("Codage en ROD13 Activé (\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\NoEncrypt = 0 (DWORD))\n",fic);
- }else
- fputs("Codage en ROD13 Activé (\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\NoEncrypt = 0 (DWORD))\n",fic);
-
- //désactiver le chiffrement
- //\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\NoLog=1 (dword)
- //test dans chemintmp si NoLog==1
- if (LireGValeur(HKEY_USERS,chemintmp,"NoLog",&tmp))
- {
- if (tmp=='1')
- fputs("Journal de log désactivé (\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\NoLog = 1 (DWORD))\n",fic);
- else
- fputs("Journal de log Activé (\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\NoLog = 0 (DWORD))\n",fic);
- }else
- fputs("Journal de log Activé (\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\NoLog = 0 (DWORD))\n",fic);
-
- fputs("************************************************************************************************************************************\n",fic);
-
-
- //traitement pour chacune des sous clés
- for (l=0;l<nbSubKey3;l++)
- {
- //init pour récupération
- TailleNomSubKey3=TAILLE_REG_DBEXT;
- RegEnumKeyEx (CleTmp3,l,NomSubKey3,(LPDWORD)&TailleNomSubKey3,NULL,NULL,NULL,NULL);
- sprintf(chemin,"%s%s\\Count\\",chemintmp,NomSubKey3);
-
- //écriture dans le fichier de l'entête
- fputs("------------------------------------------------------------------------------------------------------------------------------------\nHKEY_USERS\\",fic);
- fputs(chemin,fic);
- fputs("\n------------------------------------------------------------------------------------------------------------------------------------\n",fic);
-
- //application et liens exécutés
- if (RegOpenKey((HKEY)HKEY_USERS,chemin,&CleTmp)==ERROR_SUCCESS)
- {
- // on recupere le nombre de subkey ( de cle en dessous de la cle actuelle)
- if (RegQueryInfoKey (CleTmp,NULL,NULL,NULL,NULL,NULL,NULL,&nbValue,&TailleNomValue,&TailleMAXValue,NULL,NULL)==ERROR_SUCCESS)
- {
- for (j=0;j<nbValue;j++)
- {
- TailleNomValue=1024;// on reinitialise la taille a chaque fois sinon il ne lit pas la valeur suivant
- TailleMAXValue=1024;
-
- //énumération de la valeur (j)
- if (RegEnumValue (CleTmp,j,NomValeur,&TailleNomValue,NULL,NULL,Valeur,&TailleMAXValue)==ERROR_SUCCESS)
- {
-
- if (ROD13ENABLE)//si le chiffrement en ROD13 est activé
- {
- //transformation
- RODTOASCII(NomValeur,resultat,sizeof(NomValeur));
-
- strcpy(ltmp,"");
- LireValBin(HKEY_USERS,chemin,NomValeur,fic,resultat);
- }
- else // si le chiffrement n'est pas activé
- {
- LireValBin(HKEY_USERS,chemin,NomValeur,fic,NomValeur);
- }
- }
- }
- }
- RegCloseKey(CleTmp);
- }
- }
- printf("\nFichier resultat.txt cree!!!\n\n");
- }
- RegCloseKey(CleTmp3);
- }
- }
- }
- }else
- printf("ERREUR - Lecture du registre impossible!!!\n");
-
- //fermer la clé
- RegCloseKey(CleTmp2);
- }else
- printf("ERREUR - Lecture du registre impossible!!!\n");
- fclose(fic);
- }
- system("PAUSE");
- return 0;
- }
//------------------------------------------------------------------------------
// Projet LireExec : Récupération de l'historique d'exécution d'application et liens de windows,
// décodage de la dernière utilisation, nombre d'utilisation et numéro de session de la dernière utilisation.
// Auteur : Hanteville Nicolas
// Fichier : main.c
// Version : 1.1
// Date de modification : 26/07/2008
// Site : http:\\omni.a.free.fr
//------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------
//objectifs: (gestion multi utilisateurs)
// - récupération d'un chemin,
// - ajout entête,
// - test si le log est activé pour le compte en test,
// - test si codage road13 activé,
// - récupération pour chaque clé de la date de dernière modification,
// - numéro de session,
// - nombre de fois exécuté,
// - clé décodé.
//---------------------------------------------------------------------------------------------------------------
//------------------constantes-----------------
#define TAILLE_TMP 256
#define TAILLE_REG_DEFAULT 512
#define TAILLE_REG_EXT 1024
#define TAILLE_REG_DBEXT 2048
//----------------fin-constantes---------------
//------------------libs-----------------
#include <stdio.h>
#include <windows.h>
//----------------fin-libs---------------
//---------------------------------------------------------------------------------------------------------------
// on donne une valeur hexa de 8 caracteres et on obtient le resultat
// gestion des chiffres + caractères minuscules et majuscules
//---------------------------------------------------------------------------------------------------------------
unsigned long HexaToDec(char *hexa,unsigned int taille)
{
unsigned long k=0;//resultat
unsigned long j=1,i; // j =coef multiplicateur et i variable de boucle
//traitement de la valeur hexa
for (i=(taille-1);i>0;i--)//calcul de la valeur hexa en decimal
{
switch(hexa[i])
{
case '1':k=k+j;break;
case '2':k=k+(2*j);break;
case '3':k=k+(3*j);break;
case '4':k=k+(4*j);break;
case '5':k=k+(5*j);break;
case '6':k=k+(6*j);break;
case '7':k=k+(7*j);break;
case '8':k=k+(8*j);break;
case '9':k=k+(9*j);break;
case 'a':k=k+(10*j);break;
case 'A':k=k+(10*j);break;
case 'b':k=k+(11*j);break;
case 'B':k=k+(11*j);break;
case 'c':k=k+(12*j);break;
case 'C':k=k+(12*j);break;
case 'd':k=k+(13*j);break;
case 'D':k=k+(13*j);break;
case 'e':k=k+(14*j);break;
case 'E':k=k+(14*j);break;
case 'f':k=k+(15*j);break;
case 'F':k=k+(15*j);break;
};
j=j*16;
};
return k;
};
//---------------------------------------------------------------------------------------------------------------
// decoder une chaine de caractères de ROD13 en lisible
//---------------------------------------------------------------------------------------------------------------
void RODTOASCII(char *donnee,char *resultat,int taille)
{
int i;
strcpy(resultat,"");
for (i=0;i<taille;i++)
{
switch(donnee[i])
{
case 'a': strcat(resultat,"n"); break;
case 'b': strcat(resultat,"o"); break;
case 'c': strcat(resultat,"p"); break;
case 'd': strcat(resultat,"q"); break;
case 'e': strcat(resultat,"r"); break;
case 'f': strcat(resultat,"s"); break;
case 'g': strcat(resultat,"t"); break;
case 'h': strcat(resultat,"u"); break;
case 'i': strcat(resultat,"v"); break;
case 'j': strcat(resultat,"w"); break;
case 'k': strcat(resultat,"x"); break;
case 'l': strcat(resultat,"y"); break;
case 'm': strcat(resultat,"z"); break;
case 'n': strcat(resultat,"a"); break;
case 'o': strcat(resultat,"b"); break;
case 'p': strcat(resultat,"c"); break;
case 'q': strcat(resultat,"d"); break;
case 'r': strcat(resultat,"e"); break;
case 's': strcat(resultat,"f"); break;
case 't': strcat(resultat,"g"); break;
case 'u': strcat(resultat,"h"); break;
case 'v': strcat(resultat,"i"); break;
case 'w': strcat(resultat,"j"); break;
case 'x': strcat(resultat,"k"); break;
case 'y': strcat(resultat,"l"); break;
case 'z': strcat(resultat,"m"); break;
case 'A': strcat(resultat,"N"); break;
case 'B': strcat(resultat,"O"); break;
case 'C': strcat(resultat,"P"); break;
case 'D': strcat(resultat,"Q"); break;
case 'E': strcat(resultat,"R"); break;
case 'F': strcat(resultat,"S"); break;
case 'G': strcat(resultat,"T"); break;
case 'H': strcat(resultat,"U"); break;
case 'I': strcat(resultat,"V"); break;
case 'J': strcat(resultat,"W"); break;
case 'K': strcat(resultat,"X"); break;
case 'L': strcat(resultat,"Y"); break;
case 'M': strcat(resultat,"Z"); break;
case 'N': strcat(resultat,"A"); break;
case 'O': strcat(resultat,"B"); break;
case 'P': strcat(resultat,"C"); break;
case 'Q': strcat(resultat,"D"); break;
case 'R': strcat(resultat,"E"); break;
case 'S': strcat(resultat,"F"); break;
case 'T': strcat(resultat,"G"); break;
case 'U': strcat(resultat,"H"); break;
case 'V': strcat(resultat,"I"); break;
case 'W': strcat(resultat,"J"); break;
case 'X': strcat(resultat,"K"); break;
case 'Y': strcat(resultat,"L"); break;
case 'Z': strcat(resultat,"M"); break;
case '\\': strcat(resultat,"\\"); break;
case ' ': strcat(resultat," "); break;
case ':': strcat(resultat,":"); break;
case '+': strcat(resultat,"+"); break;
case '-': strcat(resultat,"-"); break;
case '_': strcat(resultat,"_"); break;
case '.': strcat(resultat,"."); break;
case ']': strcat(resultat,"]"); break;
case '[': strcat(resultat,"["); break;
case '(': strcat(resultat,"("); break;
case ')': strcat(resultat,")"); break;
case '#': strcat(resultat,"#"); break;
case '0': strcat(resultat,"0"); break;
case '1': strcat(resultat,"1"); break;
case '2': strcat(resultat,"2"); break;
case '3': strcat(resultat,"3"); break;
case '4': strcat(resultat,"4"); break;
case '5': strcat(resultat,"5"); break;
case '6': strcat(resultat,"6"); break;
case '7': strcat(resultat,"7"); break;
case '8': strcat(resultat,"8"); break;
case '9': strcat(resultat,"9"); break;
case '\'': strcat(resultat,"'"); break;
case '\0': strcat(resultat,"\0");
return;
};
};
}
//---------------------------------------------------------------------------------------------------------------
// lecture de données binaires dans la base de registre, transformés suivant le besoin et écrite dans le fichier
// & mise en forme dans le fichier
// [DATE](ID SESSION - NB USE) CHAINE
//---------------------------------------------------------------------------------------------------------------
void LireValBin(HKEY ENTETE,char *chemin,char *nom,FILE *fic,char *donnes)
{
//variables
DWORD tailleCle=TAILLE_REG_DEFAULT;
HKEY CleTmp=NULL;
char Valeur[TAILLE_REG_DEFAULT];//16=taille max des données
char Count[8];//récupération en hexa
char Id[8];///récupération en hexa
char Date1[8];//récupération en hexa
char Date2[8];//récupération en hexa
char Ttmp[TAILLE_REG_DBEXT];
//convertion de la date
FILETIME FileTime, LocalFileTime;
SYSTEMTIME SysTime;
//lecture de la valeur binaire
// on ouvre la cle
if (RegOpenKey(ENTETE,chemin, &CleTmp)==ERROR_SUCCESS)
{
//On recupere la taille de la cle qui va être lue
if (RegQueryValueEx(CleTmp, nom, NULL, NULL, NULL, &tailleCle)==ERROR_SUCCESS)
{
strcpy(Valeur,"");
//On lit la valeur
if (RegQueryValueEx(CleTmp, nom, NULL, NULL, Valeur, &tailleCle)==ERROR_SUCCESS)
{
//décortication
if (tailleCle==8)//si =8 alors il n'y a que le nombre d'utilisation
{
//lecture du nombre d'exécution
//transformation ASCII to HEXA et HEXA to DEC
sprintf(Count,"%02x%02x%02x%02x",Valeur[7]&255,Valeur[6]&255,Valeur[5]&255,Valeur[4]&255);
snprintf(Ttmp,TAILLE_REG_DBEXT,"[jj.mm.aaaa hhh mmm sss](ID SESSION: 0000 - NB USE: %04d) %s\n",HexaToDec(Count,8),donnes);
fputs(Ttmp,fic);
}else if (tailleCle==16) //si = 16 = 4 nb utilisation, 4 id de session, 8 date utilisation
{
//lecture du nombre d'exécution
//transformation ASCII to HEXA et HEXA to DEC
sprintf(Count,"%02x%02x%02x%02x",Valeur[7]&255,Valeur[6]&255,Valeur[5]&255,Valeur[4]&255);
//lecture numéro de session
sprintf(Id,"%02x%02x%02x%02x",Valeur[3]&255,Valeur[2]&255,Valeur[1]&255,Valeur[0]&255);
//lecture 1er partie de la date
sprintf(Date1,"%02x%02x%02x%02x",Valeur[11]&255,Valeur[10]&255,Valeur[9]&255,Valeur[8]&255);
//lecture 2ème partie de la date
sprintf(Date2,"%02x%02x%02x%02x",Valeur[15]&255,Valeur[14]&255,Valeur[13]&255,Valeur[12]&255);
FileTime.dwLowDateTime = (DWORD)HexaToDec(Date1,8);
FileTime.dwHighDateTime = (DWORD)HexaToDec(Date2,8);
//dans le cas ou ==0 non utilisable et pas de modification sur le nombre d'utilisation
if (( FileTime.dwLowDateTime==0)&&(FileTime.dwHighDateTime==0))
{
sprintf(Ttmp,"[jj.mm.aaaa hhh mmm sss](ID SESSION: %04d - NB USE: %04d) %s",HexaToDec(Id,8),HexaToDec(Count,8),donnes);
}
else
{
FileTimeToLocalFileTime(&FileTime, &LocalFileTime);
FileTimeToSystemTime(&LocalFileTime, &SysTime);
//comme le nombre d'utilisation commence à 6, on effectue une diminution de 5^^
sprintf(Ttmp,"[%02d.%02d.%02d %02dh %02dm %02ds](ID SESSION: %04d - NB USE: %04d) %s",SysTime.wDay,SysTime.wMonth,SysTime.wYear,SysTime.wHour,SysTime.wMinute,SysTime.wSecond,HexaToDec(Id,8),HexaToDec(Count,8)-5,donnes);
}
fputs(Ttmp,fic);
fputs("\n",fic);
};
//fermeture de la clé
RegCloseKey(CleTmp);
return;
}
}
//fermeture de la clé
RegCloseKey(CleTmp);
}//si on arrive pas a récupérer les données
//formatage et écriture dans le fichier
snprintf(Ttmp,TAILLE_REG_DBEXT,"[jj.mm.aaaa hhh mmm sss](ID SESSION: 0000 - NB USE: 0000) %s",donnes);
fputs(Ttmp,fic);
fputs("\n",fic);
}
//---------------------------------------------------------------------------------------------------------------
// lecture de valeur tres importantes comme des descriptions limités à 1 caractère
//---------------------------------------------------------------------------------------------------------------
int LireGValeur(HKEY ENTETE,char *chemin,char *nom,char *Valeur)
{
//variables
DWORD tailleCle;
HKEY CleTmp=NULL;
// on ouvre la cle
if (RegOpenKey(ENTETE,chemin, &CleTmp)==ERROR_SUCCESS)
{
//On recupere la taille de la cle qui va être lue
if (RegQueryValueEx(CleTmp, nom, NULL, NULL, NULL, &tailleCle)==ERROR_SUCCESS)
{
if (tailleCle<2)//gestion de la taille de la clé si on dépace 1 on quitte pour éviter buffer overflow
{
if (RegQueryValueEx(CleTmp, nom, NULL, NULL, Valeur, &tailleCle)==ERROR_SUCCESS)
{
RegCloseKey(CleTmp);
return TRUE;
}
}
}
//On ferme la cle
RegCloseKey(CleTmp);
}
return FALSE;
}
//---------------------------------------------------------------------------------------------------------------
// fonction principale (MAIN)
//---------------------------------------------------------------------------------------------------------------
int main(void)
{
//variables
FILE *fic; //fichier de résultat
HKEY CleTmp=0,CleTmp2=0,CleTmp3=0; //entête clé
DWORD nbValue=0,nbSubKey2=0,nbSubKey3=0; //nombre de sous clé
int j,k,l; //variable de boucle
int TailleNomSubKey2,TailleNomSubKey3; //taille des clés de récupération de données
DWORD TailleNomValue=TAILLE_REG_EXT;
DWORD TailleMAXValue=TAILLE_REG_EXT;
//variables de transitions et lecture de données
char chemintmp[TAILLE_REG_DBEXT];
char NomSubKey2[TAILLE_REG_EXT];
char NomSubKey3[TAILLE_REG_EXT];
char chemin[TAILLE_REG_DBEXT]; // le chemin complet c lui
char NomValeur[TAILLE_REG_EXT]; // Nom de la Valeur recupere
char Valeur[TAILLE_REG_EXT];
char resultat[TAILLE_REG_EXT];
char tmp;
int ROD13ENABLE=1;
// test
char ltmp[1024];
//présentation:
printf("LireExec V 1.1, 26/07/2008 par Nicolas Hanteville de http:\\\\omni.a.free.fr\n"
"recuperation de l'historique windows code en ROD13.\n\n"
"Necessite les droits administrateurs!!!\n");
//ouverture du fichier de résultat
if ((fic= fopen("resultat.txt","w+"))==NULL)
printf("ERREUR - Creation du fichier resultat impossible!!!\n");
else
{
//création de l'entête aide
fputs("----------------------------------------------------\n"
"LireExec V 1.1, 26/07/2008 par Nicolas Hanteville\n"
"de http:\\\\omni.a.free.fr\n"
"récupération de l'historique windows codé en ROD13.\n"
"----------------------------------------------------\n\n"
"Format:\n"
"-----------\nClé source\n-----------\n"
"[Date de dernier accès](Numéro de session - nombre d'utilisation) clé : chaine\n"
"\nType de clé:"
"\n---------------------------------------------------"
"\nUEME_RUNPIDL : Fichier local, titre de page web"
"\nUEME_RUNPATH : Exécutables"
"\nUEME_CTLSESSION : 1ère clé créé"
"\nUEME_CTLCUACount : Compte courant"
"\nUEME_UISCUT : Couper presse-papier ???"
"\nUEME_UIQCUT : Couper presse-papier ???"
"\nUEME_UIHOTKEY : Touche raccourcis"
"\nUEME_RUNWMCMD : Exécuté sous Commandes DOS "
"\nUEME_RUNCPL : Applet du panneau de configuration"
"\nUEME_UITOOLBAR : Raccourcis de bar accès rapide\n\n\n"
,fic);
// récupération du chemin de chacun des utilisateurs:
if (RegOpenKey((HKEY)HKEY_USERS,"",&CleTmp2)==ERROR_SUCCESS)
{
//nombre de sous clés
if (RegQueryInfoKey (CleTmp2,NULL,NULL,NULL,&nbSubKey2,NULL,NULL,NULL,NULL,NULL,NULL,NULL)==ERROR_SUCCESS)
{
//on traite chacune des clé une par une
for (k=0;k<nbSubKey2;k++)
{
TailleNomSubKey2=TAILLE_REG_DBEXT; // à chaque boucle on réinitialise
//lecture de la clé "k"
if (RegEnumKeyEx (CleTmp2,k,NomSubKey2,(LPDWORD)&TailleNomSubKey2,NULL,NULL,NULL,NULL)==ERROR_SUCCESS)
{
//création du chemin de récupération
snprintf(chemintmp,TAILLE_REG_DBEXT,"%s\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\",NomSubKey2);
// maintenant on récuper le ID pour construire la cle a ouvrire final
if (RegOpenKey((HKEY)HKEY_USERS,chemintmp,&CleTmp3)==ERROR_SUCCESS)
{
//récupération du nombre de sous clés
if ((RegQueryInfoKey (CleTmp3,NULL,NULL,NULL,&nbSubKey3,NULL,NULL,NULL,NULL,NULL,NULL,NULL)==ERROR_SUCCESS))
if (nbSubKey3>0)//si il y a bien des sous clés alors on récupère leurs noms:
{
//test si les logs sont activés ou non pour chacun des utilisateurs
fputs("************************************************************************************************************************************\n",fic);
ROD13ENABLE=1;
//test si les logs sont codés en ROD13
//\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\Settings as: NoEncrypt = 1 (DWORD)
//test dans chemintmp si NoEncrypt==1
if (LireGValeur(HKEY_USERS,chemintmp,"NoEncrypt",&tmp))
{
if (tmp=='1')
{
fputs("Codage en ROD13 désactivé (\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\NoEncrypt = 1 (DWORD))\n",fic);
ROD13ENABLE=0;
}
else
fputs("Codage en ROD13 Activé (\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\NoEncrypt = 0 (DWORD))\n",fic);
}else
fputs("Codage en ROD13 Activé (\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\NoEncrypt = 0 (DWORD))\n",fic);
//désactiver le chiffrement
//\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\NoLog=1 (dword)
//test dans chemintmp si NoLog==1
if (LireGValeur(HKEY_USERS,chemintmp,"NoLog",&tmp))
{
if (tmp=='1')
fputs("Journal de log désactivé (\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\NoLog = 1 (DWORD))\n",fic);
else
fputs("Journal de log Activé (\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\NoLog = 0 (DWORD))\n",fic);
}else
fputs("Journal de log Activé (\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\NoLog = 0 (DWORD))\n",fic);
fputs("************************************************************************************************************************************\n",fic);
//traitement pour chacune des sous clés
for (l=0;l<nbSubKey3;l++)
{
//init pour récupération
TailleNomSubKey3=TAILLE_REG_DBEXT;
RegEnumKeyEx (CleTmp3,l,NomSubKey3,(LPDWORD)&TailleNomSubKey3,NULL,NULL,NULL,NULL);
sprintf(chemin,"%s%s\\Count\\",chemintmp,NomSubKey3);
//écriture dans le fichier de l'entête
fputs("------------------------------------------------------------------------------------------------------------------------------------\nHKEY_USERS\\",fic);
fputs(chemin,fic);
fputs("\n------------------------------------------------------------------------------------------------------------------------------------\n",fic);
//application et liens exécutés
if (RegOpenKey((HKEY)HKEY_USERS,chemin,&CleTmp)==ERROR_SUCCESS)
{
// on recupere le nombre de subkey ( de cle en dessous de la cle actuelle)
if (RegQueryInfoKey (CleTmp,NULL,NULL,NULL,NULL,NULL,NULL,&nbValue,&TailleNomValue,&TailleMAXValue,NULL,NULL)==ERROR_SUCCESS)
{
for (j=0;j<nbValue;j++)
{
TailleNomValue=1024;// on reinitialise la taille a chaque fois sinon il ne lit pas la valeur suivant
TailleMAXValue=1024;
//énumération de la valeur (j)
if (RegEnumValue (CleTmp,j,NomValeur,&TailleNomValue,NULL,NULL,Valeur,&TailleMAXValue)==ERROR_SUCCESS)
{
if (ROD13ENABLE)//si le chiffrement en ROD13 est activé
{
//transformation
RODTOASCII(NomValeur,resultat,sizeof(NomValeur));
strcpy(ltmp,"");
LireValBin(HKEY_USERS,chemin,NomValeur,fic,resultat);
}
else // si le chiffrement n'est pas activé
{
LireValBin(HKEY_USERS,chemin,NomValeur,fic,NomValeur);
}
}
}
}
RegCloseKey(CleTmp);
}
}
printf("\nFichier resultat.txt cree!!!\n\n");
}
RegCloseKey(CleTmp3);
}
}
}
}else
printf("ERREUR - Lecture du registre impossible!!!\n");
//fermer la clé
RegCloseKey(CleTmp2);
}else
printf("ERREUR - Lecture du registre impossible!!!\n");
fclose(fic);
}
system("PAUSE");
return 0;
}
Historique
- 12 décembre 2006 08:53:00 :
- Correction en suivant les instruction de BruNews, Merci a lui :)
- 25 juin 2009 18:07:27 :
- - correction du 'y'
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Modification du menu Système [ par Xaviou ]
Salut.Je voudrais ajouter une command "About ..." au menu système de mon prog.J'ai donc écris le code suivant:HMENU hSysMenu;MENUITEMINFO minfo;minfo.
Système d'exploitation [ par guiroux22 ]
Il y a t-il de connaître le système d'exploitation de l'ordinateur ?
Utilisation de DLL dans un système 16 Bits DOS 6.22 [ par yass007 ]
Voila,je voudrai savoir tt dabord sil ya des tutoriaux sur comment creer des Dlls sous Turbo C++ 3.0 et compatibles avec un système 16 Bits , en l'occ
Probleme utilisation de fread [ par Trinita16 ]
Bonjour, Voila le source d'un programme qui doit lire un fichier binaire. Mais je ne comprends pas l'executable systematiquement...Je pense qu'il y a
sons système [ par skysee ]
Bonjour,je suis entrain de faire une application DOS (fenêtre de commande) en C. Je voudrais jouer des sons systèmes comme il est possible de faire en
FPS, vitesse selon le système(ordi) [ par fabienGL ]
Bonjour, j'ai une petite question qui se vient à moi, j'ai un ordi plutôt bien mais lorsque je fais une rotation par exemple d'un cube, sur mon ordi i
A l'aide... [ par wanny ]
Bonjour.Je dois mettre en place un nouveau système de gestion de licence sur un logiciel commercial.Je voudrais savoir comment mettre en place un syst
Effacer l'historique d'IE [ par vecchio56 ]
BonjourJ'essaie je faire une fonction pour effacer l'historique de ie, mais pas moyen d'y arriver. Sur le net je trouve souvent cette solution:#includ
Hook sur création de fenêtre du système [ par r144 ]
Bonjour, voila j'ai ecrit un petit prog avec un dll en prenant appui sur le source de BruNews(que je remercie) qui capture la création d'une fenêtre d
Lire un fichier système ? [ par goondy ]
fopen m'envoie bouler pour ouvrir un fichier système... comment passer cette protection svp?
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
RE : WIN APIRE : WIN API par racpp
Cliquez pour lire la suite par racpp
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|