Как улучшить сверку больших файлов?

  • Автор темы Автор темы Maksim
  • Дата начала Дата начала
  • Теги Теги
    с++

Maksim

Легендарный
Местный
Знаток Lineage2
Любитель реакций
Неукротимое пламя
Старожил I степени
Сообщения
984
Розыгрыши
0
Решения
6
Репутация
596
Реакции
851
Баллы
1 708
Занимался проверкой файлов и возник вопрос как бы сделать это быстрее?

Код:
bool CheckSum(string newfile, int newfilesize, int newchecksum)
{
    int flenght = newfilesize; //4696403; //FSIZE
    int sum = newchecksum; //858273431; //CSUM
    
    FILE* f;
    if (!(f = fopen(newfile.c_str(), "rb")))
    {
        return false;
    }

    byte b;
    unsigned int Csum = 0;
    unsigned int Fsize = 0;

    while (fread(&b, sizeof(byte), 1, f))
    {
        Fsize++;

        Csum += b;
    }


    fclose(f);

    //DEBUG: для генерации (CSUM) и размера файла (FSIZE) убрать комменты
    /*ofstream myfile("CheckFiles_"+ newfile +".txt");
    if (myfile.is_open())
    {
        myfile << "!CheckSum(\"" << newfile.c_str() << "\", " << Fsize << ", " << Csum << ") || \n";
        myfile.close();
    }*/
    //DEBUG: для генерации (CSUM) и размера файла (FSIZE) убрать комменты
    
    //INFO: убрать в комменты когда нужна генерация, можно сделать и boolean потом
    if (Csum != sum || flenght != Fsize)
    {
        return false;
    }
    //INFO: убрать в комменты когда нужна генерация, можно сделать и boolean потом
    
    return true;
}

//Здесь если поставить в if (CheckSum("ALAudio.dll", 150548, 13108215)) {} даст true или false в сравнении файла
//Когда включен режим генерации, это просто передает только путь до файла
CheckSum("ALAudio.dll", 150548, 13108215)
 

Только размер файлов? Может лучше md5/crc32 сверять? Не быстро, но будет надежнее
Просто есть идея сделать так чтобы сверялись все файлы по списку из System папки lineage, потом Maps.
Но то что выше работает очень долго по такому алгоритму.
Возможно есть вариант проще с проверкой не только по размеру, но и по crc или md5 и быстрее чем сейчас?
 
А зачем простите сверять размер файла если есть сверка CRC ?
Если у исходного файла отличается хоть 1 байт, контрольная сумма измениться, не говоря о размере.
 
А зачем простите сверять размер файла если есть сверка CRC ?
Сверка файла по размеру не обязательно, просто если есть более быстрое и точное решение тогда можно crc32 или md5.
Вся проблема именно в том что проверяет много файлов долго если есть большие.
 
конечно CRC, его на все ваши запросы с головой. Все остальное это мусор.
 
Но подделать crc32 возможно у файла в теории?
Конечно, как и любой другой метод на процессе загрузке пропатчить место где ты вызываешь сверку. Это вопрос 10-15 минут.
 
Конечно, как и любой другой метод на процессе загрузке пропатчить место где ты вызываешь сверку. Это вопрос 10-15 минут.
Какие тогда варианты от подмены файлов?
 
Какие тогда варианты от подмены файлов?
Накрывать ВМками файл и вшивать прямо в не очевидный файл. Допустим использовать VMProtect или Themida и так далее. Но если станет вопрос и заплатят деньги что бы это отключить, ну примерно 40-80 USD цена вопроса и по времени день или пол.
 
Накрывать ВМками файл и вшивать прямо в не очевидный файл. Допустим использовать VMProtect или Themida и так далее. Но если станет вопрос и заплатят деньги что бы это отключить, ну примерно 40-80 USD цена вопроса и по времени день и или пол.
Ну накрывать криптором не вариант, рано или поздно знающие снимут.
Просто если вопрос в защите от "дилетантов", кто знает чем накрыто но может только инжектить в процесс. :pandaredlol:
 
Ну ты то инжектишь на ините процесса, это еще проще отследить. Запускаешь отладчик и все видно сразу, это явно не тот путь. Имхо.
 
Ну ты то инжектишь на ините процесса, это еще проще отследить. Запускаешь отладчик и все видно сразу, это явно не тот путь. Имхо.
По сути идея вот в чем:
1. Во время запуска прочитать размер / crc32 / md5 что то 1 из этого, что будет лучше.
2. После сверки выдать результат true или false

Главная проблема в больших файлах, если много тогда проверяет все это долго.
В случае если проверять только папку System все делает быстро, если же Maps тогда намного дольше.
 
CRC быстрее, размер файла бессмыслен, сверка по хешу нагрузочный
 
По сути идея вот в чем:
1. Во время запуска прочитать размер / crc32 / md5 что то 1 из этого, что будет лучше.
2. После сверки выдать результат true или false

Главная проблема в больших файлах, если много тогда проверяет все это долго.
В случае если проверять только папку System все делает быстро, если же Maps тогда намного дольше.
Долго это сколько, какой размер файла и алгоритм?

По поводу crс32, юзаешь на свой страх и риск, во первых коллизии могут быть, а во вторых лучше уже юзай crc64,а в третьих crc не самый быстрый.
 
Долго это сколько, какой размер файла и алгоритм?

По поводу crс32, юзаешь на свой страх и риск, во первых коллизии могут быть, а во вторых лучше уже юзай crc64,а в третьих crc не самый быстрый.
Если по клиенту lineage в папке maps: 16 мб одна из карт.
Просто много таких файлов, как бы ускорить проверку всего этого.

Все же передумал сверять по размеру файла, но вместо crc32 взял xxHash это самый быстрый алгоритм на сегодня.

Прикрепил ниже форк xxHash и всего 2 варианта, вместо зависимостей в оригинальном репозитории.
Возможно кто то использует вместо crc32.
 

Вложения

Если по клиенту lineage в папке maps: 16 мб одна из карт.
Просто много таких файлов, как бы ускорить проверку всего этого.
тьфу ты.... я думал ты имеешь дело с файлами по пару гигабайт.
Все же передумал сверять по размеру файла, но вместо crc32 взял xxHash это самый быстрый алгоритм на сегодня.
я тоже его уже пару лет юзаю, печалит когда юзают всякие crc или MD5
 
Я чет не понял, это очередная попытка "защиты от подмены файлов", или проверка нужна для других целей?
 
Не стоит с этим сильно заморачиваться, так как если захотят - в любом случае ломанут. Будь то вырезать проверку из клиентской части или отправлять на сервер заведомо валидные данные.
По поводу ускорения - попробуй распараллелить.
 
Назад
Сверху Снизу