#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;
}