/* Certificate Password Recovery Tool platform: Microsoft Windows require: CryptoAPI 2.0 support: PKCS12(PFX) key format author: Roman S Emelyanov email: ers@ers.msk.ru date: 15.06.2003 compile with VC6: cl pfx.c source: http://ers.msk.ru/soft/pfx.c binary: http://ers.msk.ru/soft/pfx.exe */ #define _WIN32_WINNT 0x0500 #include #include #include // Initial password LPWSTR pswd=L"\0\0\0\0\0\0\0\0\0\0"; #define PFX_FILE "test.pfx" typedef BOOL (WINAPI *PFXISPFXBLOB)(DATA_BLOB *pPFX); typedef BOOL (WINAPI *PFXVERIFYPASSWORD)(DATA_BLOB *pPFX, LPCWSTR szPassword, DWORD dwFlags); PFXISPFXBLOB PFXIsPFXBlob=NULL; PFXVERIFYPASSWORD PFXVerifyPassword=NULL; HMODULE hDll=0; FILE *hFile=NULL; DATA_BLOB pfxBlob={0,NULL}; struct stat stbuf; int p=0; time_t startime = 0; void main(void) { hDll=LoadLibrary("Crypt32.dll"); if (!hDll) { printf("Error:LoadLibrary=0x%X.\n",GetLastError()); goto done; } PFXIsPFXBlob=(PFXISPFXBLOB)GetProcAddress(hDll,"PFXIsPFXBlob"); if (!PFXIsPFXBlob) { printf("Error:GetProcAddress=0x%X.\n",GetLastError()); goto done; } PFXVerifyPassword=(PFXVERIFYPASSWORD)GetProcAddress(hDll,"PFXVerifyPassword"); if (!PFXVerifyPassword) { printf("Error:GetProcAddress=0x%X.\n",GetLastError()); goto done; } if ((hFile=fopen(PFX_FILE,"rb"))==NULL) { printf("Error: Opening %s file.\n",PFX_FILE); goto done; } if (stat(PFX_FILE,&stbuf) < 0) { printf("Error: Can't get file length.\n"); goto done; } pfxBlob.cbData=(DWORD)stbuf.st_size; if (pfxBlob.cbData) pfxBlob.pbData=LocalAlloc(LMEM_ZEROINIT,pfxBlob.cbData); else goto done; if (!pfxBlob.pbData) { printf("Error: Out of memory.\n"); goto done; } fread(pfxBlob.pbData,1,pfxBlob.cbData,hFile); if (ferror(hFile)||feof(hFile)) { printf("Error: Reading data from file.\n"); goto done; } if(!PFXIsPFXBlob(&pfxBlob)) { printf("Error: file not PFX format.\n"); goto done; } if(!pswd[0]) pswd[0] = '!'; startime = time(NULL); while(1) { while( ( ++pswd[p] ) > 'z' ) { pswd[p]='!'; p++; if ( !pswd[p] ) { pswd[p]=' '; pswd[p+1]=0; } } p=0; if(PFXVerifyPassword(&pfxBlob, pswd, 0)) { printf("Password found in UNICODE\n"); while (pswd[p]) printf("%d:",pswd[p++]); printf("\nTime:%d\n",time(NULL) - startime); goto done; } } done: return; };