Как сгенерировать верхний и нижний колонтитулы для формата WhatsApp .crypt12? - PullRequest
7 голосов
/ 02 мая 2019

WhatsApp хранит все сообщения в файле sqlite, который сначала сжимается zlib, а затем шифруется AES.

Расшифровка / декомпрессия может быть выполнена довольно легко, как это:

def decrypt(db_file, key_file):
    """ Function decrypt Crypt12 Database """
    try:
        with open(key_file, "rb") as fh:
            key_data = fh.read()

        key = key_data[126:]
        with open(db_file, "rb") as fh:
            db_data = fh.read()

        iv = db_data[51:67]
        aes = AES.new(key, mode=AES.MODE_GCM, nonce=iv)
        with open("msgstore.db", "wb") as fh:
            fh.write(zlib.decompress(aes.decrypt(db_data[67:-20])))

        print db_file + " decrypted, msgstore.db created."
    except Exception as e:
print "An error has ocurred decrypting the Database:", e

Но если вы хотите повернуть процесс вспять, вам придется сгенерировать верхний и нижний колонтитулы и IV. Сначала я подумал, что вы можете просто скопировать их из другого уже существующего файла crypt12, например так:

def encrypt(db_file, key_file, db_cript):
    """ Function encrypt msgstore Database """
    try:
        with open(key_file, "rb") as fh:
            key_data = fh.read()

        key = key_data[126:]

        with open(db_cript, "rb") as fh:
            db_cript_data = fh.read()

        header = db_cript_data[:51]
        iv = db_cript_data[51:67]
        footer = db_cript_data[-20:]

        with open(db_file, "rb") as fh:
            data = fh.read()

        aes = AES.new(key, mode=AES.MODE_GCM, nonce=iv)
        with open("msgstore.db.crypt12", "wb") as fh:
            fh.write(header + iv + aes.encrypt(zlib.compress(data)) + footer)

        print "Encrypted msgstore.db created."
    except Exception as e:
        print "An error has ocurred encrypting the Database:", e

Но, похоже, это не так. Заголовки и нижние колонтитулы файлов .crypt12 различны для каждого файла.

Пример 1 заголовка hexdump:

0000000    0100    5802    ee46    bcaf    8968    d43b    bfaf    ca5d
0000010    a774    6b66    53ec    dbae    af60    a09c    3ad2    ba5e
0000020    7341    d224    22e7    55c3    c944    cf77    2c71    9c29
0000030    3a58    3798    d10f    897c    6ffa    f27a    e788    4d7b
0000040    24a7    43a0    f1d3    5f7c    5c74    d64d    58c9    21a4
0000050    771c    7fdc    2e14    ca93    0848    758a    c184    9058
0000060    b7d9    d847    604f    cadf    05a2    a678    4994    b711
0000070    2641    9170    8965    f6a7    9ff3    95a0    860d    aca1
0000080    214c    d644    faa7    ....    ....    ....    ....    ....

Пример 2 заголовка hexdump:

0000000    0100    5802    ee46    bcaf    8968    d43b    bfaf    ca5d
0000010    a774    6b66    53ec    dbae    af60    a09c    3ad2    ba5e
0000020    7341    d224    22e7    55c3    c944    cf77    2c71    9c29
0000030    3a58    1898    1435    4cc9    bdbf    e506    f138    41a6
0000040    32a0    71c5    faa9    2499    36f7    d2be    d7a8    bf28
0000050    f3ea    1571    ed80    da14    addb    63b6    1d8e    2de5
0000060    0a9c    bc31    8d86    cb42    b4ce    b603    af7c    c295
0000070    d67f    b787    1ad8    eb69    3180    1c9d    8106    1f98
0000080    e880    edd5    c285    ....    ....    ....    ....    ....

Вы можете видеть, что первые 25 байтов всегда равны, но остальные совершенно разные. Последние 16 байтов являются IV (nonce) кстати.

Для нижнего колонтитула вы можете видеть, что последние два байта равны, а остальные абсолютно разные.

Пример 1 нижнего колонтитула hexdump:

1464cd0    ....    2feb    12d8    a2bc    92bd    ca30    a99f    621c
1464ce0    9e87    88df    dc82    f7ea    2cfd    3e0b    ecd4    03b1
1464cf0    7720    8d3d    2dcb    382d    0031

Пример 2 нижнего колонтитула hexdump:

1474330    ....    d4e9    80de    d0e8    9786    4fd3    8bf2    957c
1474340    fdf5    2e24    c4f2    1b55    121a    4410    014d    c516
1474350    7531    7f0a    2d71    382d    0031

Так как мне их генерировать?

...