www.pudn.com > vbakey.zip > vbakey.cpp
#include#include #include #pragma hdrstop #include #define BLOCK_SIZE 32768 //--------------------------------------------------------------------------- int memstr(const char *buf, const char *s, size_t size) { int off; const char *s_temp; //return -1; if(!buf || !s || !(*s)) return -1; for(off = 0; off < size; off++) { for(s_temp = s; *s_temp != 0 && *buf == *s_temp; buf++, s_temp++) { off++; if(off >= size) return -1; } if((*(buf - 1) == *(s_temp - 1)) && *s_temp == 0) return off; buf++; } return -1; } LPSTR findEncryptPass(const char *filename) { FILE *prot_file; char *buff = 0, *s; size_t rc; int off; prot_file = fopen(filename, "rb"); if(!prot_file) return 0; buff = (char *)malloc(BLOCK_SIZE); if(!buff) return 0; do { rc = fread(buff, 1, BLOCK_SIZE, prot_file); if(!rc) break; off = memstr(buff, "DPB=\"", BLOCK_SIZE); if(off < 0) { if(rc < BLOCK_SIZE) break; fseek(prot_file, -32, SEEK_CUR); continue; } fseek(prot_file, off - rc, SEEK_CUR); rc = fread(buff, 1, BLOCK_SIZE, prot_file); if(!rc) break; s = strchr(buff, '\"'); *s = 0; return buff; } while(!feof(prot_file)); free(buff); return 0; } void decryptPassword(const char *encrypt_pass, char *s) { char str[128], ch; char hs[] = { 0, 0, 0 }; int v1, v2, i, l; int begin_found = 0; *s = 0; for(i = 0; encrypt_pass[i*2]; i++) { hs[0] = encrypt_pass[i*2]; hs[1] = encrypt_pass[i*2+1]; v1 = strtol(hs, 0, 16); hs[0] = encrypt_pass[i*2+4]; hs[1] = encrypt_pass[i*2+5]; v2 = strtol(hs, 0, 16); if(!begin_found) { if(v1 == v2) begin_found = 1; } else { if(v1 != v2) begin_found = 0; else { i += 3; break; } } } if(!begin_found) return; for(ch = 0, l = 0; encrypt_pass[i*2+2]; i++, l++) { hs[0] = encrypt_pass[(i-2)*2]; hs[1] = encrypt_pass[(i-2)*2+1]; v1 = strtol(hs, 0, 16); hs[0] = encrypt_pass[i*2]; hs[1] = encrypt_pass[i*2+1]; v2 = strtol(hs, 0, 16); ch = (ch + (char)v1) ^ (char)v2; str[l] = ch; } str[l] = 0; CharToOem(str, s); } #pragma argsused int main(int argc, char **argv) { char s[128]; char *encrypt_pass_str; if(argc < 2) { printf("Usage: vbakey.exe filename\n"); return 1; } if(!(encrypt_pass_str = findEncryptPass(argv[1]))) { //CharToOem("Пароль не найден\n", s); printf("Password not found\n"); return 1; } decryptPassword(encrypt_pass_str, s); printf("File password: %s\n", s); free(encrypt_pass_str); printf("Press any key for continue ... \n"); getch(); return 0; }