Вопрос или проблема
/*
gcc password_cracker.c -l crypto -o password_cracker.o
https://github.com/sqlcipher/sqlcipher-tools/blob/master/decrypt.c
http://blog.csdn.net/lonelyrains/article/details/50837654
http://www.cnblogs.com/lvpei/archive/2011/02/18/1957804.html
http://www.cnblogs.com/fuyunbiyi/p/3475602.html
*/
#include <string.h>
#include <openssl/evp.h>
#include <openssl/rand.h>
#include <openssl/hmac.h>
//================
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <time.h>
#define PAGESIZE 1024
#define PBKDF2_ITER 4000
#define DISABLE_HMAC
#define FILE_HEADER_SZ 16
#define TEST_ROUND 2
#define LARGEST_NUM (268435456-1)
#define TRUCK_SIZE 1000
//===================
char* infile ;
//const char* outfile = “decrypted_sqlite.db”;
char* passfile ;
const char hex_array[] = “0123456789abcdef”;
//===================
// 0x9955bbc
unsigned long pass_sn = 0x9955bbc-2000;
void increse_num(void);
int quit_flag = 0;
int main(int argc, char **argv)
{
long pass_start;
long pass_end;
long x;
infile = argv[1];
passfile = argv[2];
pass_start = strtol(argv[3], NULL, 0); //atoi(argv[1]);
pass_end = strtol(argv[4], NULL, 0); //atoi(argv[2]);
char pass[8]= {'0'}; /* два байта в шестнадцатеричном формате = 4 символа, плюс NULL-терминатор */
int i, csz, tmp_csz, key_sz, iv_sz, block_sz, hmac_sz, reserve_sz;
FILE *infh;
int read;
unsigned char *inbuffer, *outbuffer, *salt, *out, *key, *iv;
EVP_CIPHER *evp_cipher;
EVP_CIPHER_CTX * ectx = EVP_CIPHER_CTX_new();
OpenSSL_add_all_algorithms();
evp_cipher = (EVP_CIPHER *) EVP_get_cipherbyname("aes-256-cbc");
key_sz = EVP_CIPHER_key_length(evp_cipher);
key = malloc(key_sz);
iv_sz = EVP_CIPHER_iv_length(evp_cipher);
iv = malloc(iv_sz);
hmac_sz = EVP_MD_size(EVP_sha1());
#ifdef DISABLE_HMAC
hmac_sz = 0;
#endif
block_sz = EVP_CIPHER_block_size(evp_cipher);
reserve_sz = iv_sz + hmac_sz;
reserve_sz = ((reserve_sz % block_sz) == 0) ? reserve_sz : ((reserve_sz / block_sz) + 1) * block_sz;
inbuffer = (unsigned char*) malloc(PAGESIZE);
outbuffer = (unsigned char*) malloc(PAGESIZE);
salt = malloc(FILE_HEADER_SZ);
infh = fopen(infile, "r");
//outfh = fopen(outfile, "w");
read = fread(inbuffer, 1, PAGESIZE, infh); /* читаем первую страницу */
fclose(infh);
memcpy(salt, inbuffer, FILE_HEADER_SZ); /* первые 16 байт - это случайный соль для базы данных */
//PKCS5_PBKDF2_HMAC_SHA1(pass, strlen(pass), salt, FILE_HEADER_SZ, PBKDF2_ITER, key_sz, key);
memset(outbuffer, 0, PAGESIZE);
out = outbuffer;
memcpy(iv, inbuffer + PAGESIZE - reserve_sz, iv_sz); /* последние iv_sz байт - это вектор инициализации */
printf("Начать с %07x до %07x.\n", pass_start, pass_end );
clock_t start = clock();
for (x=pass_start; x<=pass_end && x <= LARGEST_NUM; x++)
{
pass[0] = hex_array[((x & 0xF000000) >> 24)];
pass[1] = hex_array[((x & 0x0F00000) >> 20)];
pass[2] = hex_array[((x & 0x00F0000) >> 16)];
pass[3] = hex_array[((x & 0x000F000) >> 12)];
pass[4] = hex_array[((x & 0x0000F00) >> 8)];
pass[5] = hex_array[((x & 0x00000F0) >> 4)];
pass[6] = hex_array[((x & 0x000000F) >> 0)];
PKCS5_PBKDF2_HMAC_SHA1(pass, strlen(pass), salt, FILE_HEADER_SZ, PBKDF2_ITER, key_sz, key);
out = outbuffer;
EVP_CipherInit(ectx, evp_cipher, NULL, NULL, 0);
EVP_CIPHER_CTX_set_padding(ectx, 0);
EVP_CipherInit(ectx, NULL, key, iv, 0);
EVP_CipherUpdate(ectx, out, &tmp_csz, inbuffer + FILE_HEADER_SZ, PAGESIZE - reserve_sz - FILE_HEADER_SZ);
csz = tmp_csz;
out += tmp_csz;
EVP_CipherFinal(ectx, out, &tmp_csz);
csz += tmp_csz;
EVP_CIPHER_CTX_cleanup(ectx);
// WeChat 7.0 использует разные версии записи/чтения
// [5] = 64; [6] = 32; [7] = 32; [56:(56+20)] = 0;
if( outbuffer[5] == 0x40
&& outbuffer[6] == 0x20
&& outbuffer[7] == 0x20
//&& outbuffer[56] == 0x00
//&& outbuffer[57] == 0x00
)
{
quit_flag = 1;
printf("ОК\n");
printf("Пароль: %s\n", pass);
FILE *passfh;
passfh = fopen(passfile, "a");
fwrite(pass, 1, strlen(pass), passfh);
fwrite("\n", 1, strlen("\n"), passfh);
fclose(passfh);
printf("outbuffer:\n");
int kk,kkk;
for (kk=0; kk<10; kk++)
{
for (kkk=0; kkk<10; kkk++)
{
printf("%02x ", outbuffer[kk*10 + kkk]);
}
printf("\n");
}
}
}
clock_t end = clock();
unsigned long millis = (end - start) * 1000 / CLOCKS_PER_SEC;
if (millis==0)
millis = 1;
float speed = (pass_end+1-pass_start)*1000.0/(millis);
printf("КОНЕЦ с %07x до %07x. Скорость: %f/с .\n", pass_start, pass_end, speed );
free(inbuffer);
free(outbuffer);
free(key);
free(salt);
free(iv);
return 0;
}
Ответ или решение
Чтобы запустить программу для взлома паролей на файле, необходимо выполнить несколько ключевых шагов. Ниже приведены подробные инструкции, основанные на исходном коде, который вы предоставили. Начнём с общего обзора подхода и завершив конкретными шагами.
1. Подготовка окружения
Прежде всего, убедитесь, что у вас установлены необходимые инструменты и библиотеки. В вашем коде используется OpenSSL, поэтому установите библиотеку OpenSSL, если она ещё не установлена.
Для установки OpenSSL в системе на Ubuntu вы можете использовать следующую команду:
sudo apt-get install libssl-dev
Также, убедитесь, что у вас установлен компилятор gcc
.
2. Компиляция программы
Ваш код написан на языке C. Для компиляции используйте следующую команду:
gcc password_cracker.c -l crypto -o password_cracker
Здесь -l crypto
подключает библиотеку OpenSSL, а -o password_cracker
задаёт имя выходного файла.
3. Подготовка входных данных
Перед запуском программы вам понадобятся следующие параметры:
infile
: путь к файлу, который нужно будет расшифровать.passfile
: файл, в который будут записываться найденные пароли.pass_start
: начальное значение для перебора паролей (в шестнадцатеричном формате).pass_end
: конечное значение для перебора паролей (в шестнадцатеричном формате).
Пример входных параметров:
- Файл для расшифровки:
encrypted_file.db
- Файл для записи паролей:
found_passwords.txt
- Начальный и конечный значения паролей:
0x00000000
и0x000000FF
4. Запуск программы
Запустите программу с нужными параметрами следующим образом:
./password_cracker encrypted_file.db found_passwords.txt 0x00000000 0x000000FF
5. Принцип работы программы
Программа будет перебирать пароли с указанным диапазоном, используя функцию PBKDF2 для генерации ключа, который затем применяется для расшифровки содержимого файла. Если расшифрованные данные содержат определённые значения в байтовом массиве, программа считает, что нашла правильный пароль, и запишет его в указанный файл.
Программа включает некоторые оптимизации:
- Чтение файла осуществляется лишь один раз.
- Используется встроенный в OpenSSL функционал для работы с шифрами и хэшами.
6. Отладка и оптимизация
Если программа не работает должным образом:
- Убедитесь, что файл ввода существует и доступен для чтения.
- Проверьте, что вы указали правильные диапазоны паролей.
- Включите отладочную информацию в коде, чтобы увидеть, на каком этапе происходит сбой.
Заключение
Следуя этим шагам, вы сможете запустить программу для взлома паролей на указанном файле. Помните о юридических и этических аспектах использования таких инструментов, так как взлом паролей без разрешения является незаконным.