[C] [SRC] desencriptador de claves para el PC Web

Iniciado por z_ane_666, 1 Julio 2012, 02:05 AM

0 Miembros y 1 Visitante están viendo este tema.

z_ane_666

He hecho un pequeño codigo que le puede servir a muchos administradores de sistema, para hallar las claves olvidadas de las pcs cliente que tengan instalado el Pcweb Cliente 4.3.26.

Para usarlo obviamente tienes que estar con la terminal cliente desbloqueada! :laugh:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>

void ayuda(char * argumento)
{
printf("\nuso %s [/clave clave_encriptada] || [/ruta ruta_en_el_registro_de_windows]\n\nEjecute el programa sin parametros para mostrar la contraseña descifrada desde la ruta por defecto (HKEY_LOCAL_MACHINE\\SOFTWARE\\IWindow\\Bootear\\Clave)\n\nOPCIONES:\n\n/clave : Debe ingresar la clave cifrada en hexadecimal, separando cada elemento con - ejemplo: /clave h4-54-12\n\n/ruta : Le permite especificar una ruta del registro para la busqueda de la clave",argumento);
exit(0);
}

char * RegQueryStringValue(HKEY hKey, char * strValueName,long TIPODATO)
{
long lResult;
char * strBuf;
unsigned long lValueType;
unsigned long lDataBufSize;
strBuf = (char *) calloc(200, sizeof(char));
if (strBuf==NULL)
   {
   printf("falta de memoria");
   RegCloseKey(hKey);
   exit(1);
   }
   lResult = RegQueryValueEx(hKey, strValueName, NULL, &lValueType, strBuf, &lDataBufSize);
   if (lResult == ERROR_SUCCESS)
       {if (lValueType == TIPODATO)
           {
            return strBuf;
           }
   else {return "";}
       }
   else {return "";}
}

char * obtenervalor(HKEY hKey, char * strPath, char * strValue, long tipodato)
{
PHKEY Ret;
char * valorllave;
long resultado;
resultado=RegOpenKey(hKey,strPath,&Ret);
if (resultado==ERROR_SUCCESS)
{
valorllave=RegQueryStringValue((HKEY)Ret,strValue,tipodato);
RegCloseKey((HKEY)Ret);
return valorllave;
}
else{
return "";}
}

char * desencriptandoclave(char * claveencriptada)
{
int semilla;
char * clavedesencriptada;
long i;
semilla=(int)claveencriptada[0];
clavedesencriptada = (char *) calloc(strlen(claveencriptada)-1+1, sizeof(char));//en realidad solo debiera pedir 9 espacios pero pido +1 para el '\0'
if (clavedesencriptada==NULL)
   {
   printf("falta de memoria");
   exit(1);
   }
for(i=0;i<strlen(claveencriptada)-1;i++)
   {
   clavedesencriptada[i]=(char *)((int)claveencriptada[i+1]-semilla-i-1);
   }
clavedesencriptada[strlen(claveencriptada)-1]='\0';
return clavedesencriptada;
}

char * volteandocadena(char * cadenaprocesar)
{
char * cadenaprocesada;
cadenaprocesada = (char *) calloc(strlen(cadenaprocesar)+1, sizeof(char));//+1 para el '\0'
if (cadenaprocesada==NULL)
   {
   printf("falta de memoria");
   exit(1);
   }
long i;
for(i=strlen(cadenaprocesar)-1;i>-1;i--)
   {
  cadenaprocesada[strlen(cadenaprocesar)-1-i]=cadenaprocesar[i];
   }

cadenaprocesada[strlen(cadenaprocesar)+1-1]='\0';
return cadenaprocesada;
}

int main(int argc,char **argv)
{
char siclave[7]="/clave";
char siruta[6]="/ruta";
char siayuda[7]="/ayuda";
char versionprogram[7]="4.3.26";
char * retorno;
if (argc==1){
retorno = obtenervalor(HKEY_CURRENT_USER,"SOFTWARE\\ARSON Group SAC\\Pcweb Cliente","Last Installed Version",REG_SZ);
   {if (strncmp(versionprogram,retorno,strlen(versionprogram))==0)
   {char * claveencriptada;
    claveencriptada = obtenervalor(HKEY_LOCAL_MACHINE,"SOFTWARE\\IWindow\\Bootear","Clave",REG_SZ);
       if(claveencriptada!="")
       {char * clavedesencriptada;
        clavedesencriptada=desencriptandoclave(claveencriptada);
        printf("%s",clavedesencriptada);
        exit(0);
       }
       else
       {printf("Error, no se pudo encontrar la clave \n");}

   exit(1);}
   else
   {printf("No esta instalado Pcweb Cliente 4.3.26");
   exit(1);}}
}
else
{
if ((strncmp(siclave,argv[1],strlen(siclave))==0)||(strncmp(siruta,argv[1],strlen(siruta))==0)||(strncmp(siayuda,argv[1],strlen(siayuda))==0))
{   if(strncmp(siayuda,argv[1],strlen(siayuda))==0){ayuda(argv[0]);}
   if (argc<3){printf("Falta parametros");exit(1);}
   if (strncmp(siclave,argv[1],strlen(siclave))==0)
   {
   char *separacion;
   char *cadenalista;
   long i=0;
   cadenalista=(char *) calloc(500,sizeof(char));
   if (cadenalista==NULL)
       {
       printf("falta de memoria");
       exit(1);
       }
   unsigned short decimal;
   separacion = strtok(argv[2],"-");
   while ((separacion != NULL))
       {
           sscanf(separacion, "%hx", &decimal);
           cadenalista[i]=(char *)decimal;
           separacion = strtok(NULL, "-");
           i++;

       }
   cadenalista=(char *) realloc ( cadenalista, i+1*sizeof(char) );//+1 para null
   cadenalista[i]='\0';
       if(i>1)
           {char * clavedesencriptada;
           clavedesencriptada=desencriptandoclave(cadenalista);
           printf("%s",clavedesencriptada);
           exit(0);
           }
           else{printf("Error, solamente ha escrito la semilla\n");ayuda(argv[0]);exit(1);}
   }
   else if(strncmp(siruta,argv[1],strlen(siruta))==0)
   {
   char * rutaregistro;
   char * raizregistro;
   HKEY trueraizregistro;
   char * nombrevalor;
   //---------------validaciones de ***** -----------------------------
   rutaregistro=strstr(volteandocadena((argv[2])),"\\");
       if(rutaregistro)
       {rutaregistro=strstr(volteandocadena(rutaregistro+1),"\\");
           if(rutaregistro)
           {rutaregistro=rutaregistro+1;}
           else{ayuda(argv[0]);exit(1);}
       }
       else{ayuda(argv[0]);exit(1);}
   //---------------validaciones de ***** -----------------------------
   raizregistro=strrchr(volteandocadena(argv[2]),'\\');
       if(raizregistro)
       {raizregistro=volteandocadena(raizregistro+1);}
       else{ayuda(argv[0]);exit(1);}
   //---------------validaciones de ***** -----------------------------
   nombrevalor=strrchr(argv[2],'\\')+1;
   strupr(raizregistro);
   {if(strncmp("HKEY_CLASSES_ROOT",raizregistro,17)==0)
   {
   trueraizregistro=HKEY_CLASSES_ROOT;
   }
   else if(strncmp("HKEY_CURRENT_USER",raizregistro,17)==0)
   {
    trueraizregistro=HKEY_CURRENT_USER;
   }
   else if(strncmp("HKEY_LOCAL_MACHINE",raizregistro,18)==0)
   {
   trueraizregistro=HKEY_LOCAL_MACHINE;
   }
   else if(strncmp("HKEY_USERS",raizregistro,10)==0)
   {
   trueraizregistro=HKEY_USERS;
   }
   else if(strncmp("HKEY_CURRENT_CONFIG",raizregistro,19)==0)
   {
    trueraizregistro=HKEY_CURRENT_CONFIG;
   }
   else{ayuda(argv[0]);exit(1);}}
   char * claveencriptada;
   claveencriptada = obtenervalor(trueraizregistro,rutaregistro,nombrevalor,REG_SZ);
       if(claveencriptada!="")
       {char * clavedesencriptada;
        clavedesencriptada=desencriptandoclave(claveencriptada);
        printf("%s",clavedesencriptada);
        exit(0);
       }
       else
       {printf("Error, no se pudo encontrar la clave \n");exit(1);}
   }
}
else
{
printf("Opcion no existe\n");
exit(1);
}
}

return 0;
}



Espero que le sea de utilidad y quisiera recibir consejos para optimizar el programa. Saludos ;)