Как мне заставить этот программный для взлома паролей работать с файлом?

Вопрос или проблема

/*
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. Отладка и оптимизация

Если программа не работает должным образом:

  • Убедитесь, что файл ввода существует и доступен для чтения.
  • Проверьте, что вы указали правильные диапазоны паролей.
  • Включите отладочную информацию в коде, чтобы увидеть, на каком этапе происходит сбой.

Заключение

Следуя этим шагам, вы сможете запустить программу для взлома паролей на указанном файле. Помните о юридических и этических аспектах использования таких инструментов, так как взлом паролей без разрешения является незаконным.

Оцените материал
Добавить комментарий

Капча загружается...