Android NDK получит md5 из двоичного файла - PullRequest
0 голосов
/ 30 января 2019

ОПИСАНИЕ

Я пытаюсь получить md5 хэш двоичного (.dex) файла, который хранится в /data/data/my.package.name/file.dex.Я использую Android NDK (C ++).

ПРОБЛЕМА

Несколько способов получить хеш файла:

  1. С моего ноутбука: md5sum file.dex -> 5a65273b2ee336ad2c45a9306be162f6
  2. Использование adb shell: md5sum file.dex -> 5a65273b2ee336ad2c45a9306be162f6
  3. Из моего кода C ++:
    int err = 0;
    zip *z = zip_open(getBaseApkAbsolutePath(), 0, &err);

    const char *name = "classes.dex";
    struct zip_stat st;
    zip_stat_init(&st);
    zip_stat(z, name, 0, &st);

    char *contents = new char[st.size];

    zip_file *f = zip_fopen(z, name, 0);
    zip_fread(f, contents, st.size);

    std::ofstream ofstream;
    ofstream.open("/data/data/my.package/classes.dex", std::ofstream::binary);
    ofstream.write(contents, st.size);

    joyee::MD5 md5 = joyee::MD5();
    md5.update(contents, sizeof(contents));
    md5.finalize();

    LOG(md5.toString());
    LOG(joyee::md5(contents));

    zip_fclose(f);
    zip_close(z);

И тогда я получаю это ->aaaeb407992f9fe57cc6235ece90ec35

РАЗЪЯСНЕНИЕ

  1. Мой код хорошо работает с простой строкой, такой как Hello, World!
  2. Реализация MD5 работает хорошо

ВОПРОС

Как получить хэш md5 двоичного файла в Android с помощью C ++?

1 Ответ

0 голосов
/ 30 января 2019

Вот проблема:

md5.update(contents, sizeof(contents));

Вы берете размер вашего указателя (который равен 4 или 8) вместо буфера, на который он указывает.Таким образом, вы эффективно вычисляете сумму md5 этих первых нескольких байтов.Вместо этого введите st.size, чтобы проверить полный файл.

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