Para usarlo obviamente tienes que estar con la terminal cliente desbloqueada!
Código
#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