Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Получение контрольных сумм файлов (MD5, и т.д.) и их проверка в Online-сервисах

Ответить
Настройки темы
C/C++ - Получение контрольных сумм файлов (MD5, и т.д.) и их проверка в Online-сервисах

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать


Изменения
Автор: Drongo
Дата: 18-08-2010
Описание: Актуализировал вопрос...
Приветы. Вот собственно, такой вопрос возник в связи с темой - VT Checker - утилита пакетной проверки файлов на VirusTotal.com Хочу дополнительно прикрутить к своей программе поиск вредоносов по их контрольной сумме MD5 с дальнейшей проверкой на различных онлайн сервисах. Прошу помочь в этом. Задача состоит из трёх подзадач.

1. Как получить контрольную сумму (MD5) файла - Решена
2. Как сделать запрос на онлайн-сервис (http://www.virustotal.com/search.html)
3. Как вернуть результат проверки

Спасибо.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 17:30, 17-08-2010

 

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


ganselo, О, отлично. Допустим мне теперь нужно проверить не один MD5 а несколько, заранее не известно сколько, но предположим несколько, я придумал так
Код: Выделить весь код
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TStringList *post = new TStringList;
    TStringStream *response = new TStringStream("");
    TStringList *lHash = new TStringList;

   // Просто для примера наполнили список контрольными суммами,
   // в идеале так и будет, проверка файлов которые
   // Имеют контрольную сумму и которые не прошли по остальным базам
   lHash->Add("0045BCBD3047391E47F3B56DC7C7F2F2");
   lHash->Add("00636A27AF20104CC13E8DDE7DEE64E7");
   lHash->Add("012995DAD105ACEFBF05591271CD2F54");

   for(int i = 0; i < lHash->Count; i++){
      post->Clear();
      post->Add("chain=" + lHash->Strings[i]);
      try{
         HTTPQuery->Post("http://www.virustotal.com/search.html", post, response);
        }
      catch(EIdSocketError &se){
         ShowMessage(se.Message);
        }
      catch(Exception &e){
         ShowMessage(e.Message);
        }
     }
    delete HTTPQuery, post, response, lHash;
}
//---------------------------------------------
И вот такой ещё вопросик, когда идёт первая проверка, то MD5 проверяются без проблем, а когданажать второй раз кнопку Проверить, то появляется окошко с сообщением EAccessViolation - столько раз, сколько содержиржится записей в списке lHash. Как бы сделать, чтобы можно было повторно проверять?

Цитата ganselo:
Ну ошибки в любом случае нужно ловить. »
Просто если проверяемых файлов будет 10-15, нажимать каждый чтобы закрыть окошко, неудобно.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 17:45, 21-08-2010 | #31



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

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


Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Проблема в этой строчке:
Код: Выделить весь код
delete HTTPQuery, post, response, lHash;
Мы удаляем HTTPQuery и при повторном нажатии кнопки обращаемся к пустому указателю.
Нужно так:
Код: Выделить весь код
delete post, response, lHash;
P.S Не помешало бы проверку на вирусы засунуть в отдельный поток, а то TIdHTTP (как и все Indy компоненты) работает в синхронном режиме и по этому во время проверки форма не активна.

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:40, 21-08-2010 | #32


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата ganselo:
P.S Не помешало бы проверку на вирусы засунуть в отдельный поток, а то TIdHTTP »
Я планировал делать так.

Проверяем файлы по уже имеющимся спискам (Malware, Hash) и если по имеющимся спискам найдены вредные файлы, то проверку такого файла не делать на VT, а если по спискам не найдено, и у файла есть MD5 - то добавить файл с MD5 в список(HashVT) для дальнейшей проверки. В итоге, после прогона, получается список уже явно удаляемых(MalwareDelete) по имеющимся спискам и список подготовленых к проверке на VT. Вот теперь проверяем этот список HashVT на VT и если он удовлетворяется по условию процента, то файл добавляется в список подготовленых к удалению MalwareDelete. И теперь как бы ждём вердикта VT, правда вы говорите что форма неактивна, да, действительно неактивна, я только что проверил, сначала не обратил внимание.

А как делать в отдельном потоке?

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 20:22, 21-08-2010 | #33


Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Код: Выделить весь код
//добавляем новую функцию. Здесь и будет обращение к серверу
DWORD WINAPI QueryThread(LPVOID lpParam)
{
    TStringList *post = new TStringList;
    TStringStream *response = new TStringStream("");
    TStringList *lHash = new TStringList;

    lHash->Add("0045BCBD3047391E47F3B56DC7C7F2F2");
    lHash->Add("00636A27AF20104CC13E8DDE7DEE64E7");
    lHash->Add("012995DAD105ACEFBF05591271CD2F54");

   for(int i = 0; i < lHash->Count; i++){
      post->Clear();
      post->Add("chain=" + lHash->Strings[i]);
      try{
         Form1->HTTPQuery->Post("http://www.virustotal.com/search.html", post, response);
        }
      catch(EIdSocketError &se){
         MessageBox(0, se.Message.c_str(), 0, 0);
        }
      catch(Exception &e){
         MessageBox(0, e.Message.c_str(), 0, 0);
        }
        Form1->HTTPQuery->Disconnect();
     }
    delete post, response, lHash;
}
В обработчике кнопки создаём поток:
Код: Выделить весь код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    HANDLE hThread;

    hThread = CreateThread(0, 0, QueryThread, 0, 0, 0);
    if(hThread == INVALID_HANDLE_VALUE) {
        ShowMessage("Can't create thread");
        return;
    }
    CloseHandle(hThread);
}
Есть в Indy компонент TIdAntiFreeze. Можно попробовать его кинуть на форму и по идеи форма не должна зависать, но у меня, когда я ложу на форму и компилю выскакивает AccessViolation. Мб у вас заработает.

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:00, 21-08-2010 | #34


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата ganselo:
но у меня, когда я ложу на форму и компилю выскакивает AccessViolation. Мб у вас заработает »
Точно такой же результат - AccessViolation

Ещё, если знаете, такой вопрос. Это выходной лог, всё работает
Код: Выделить весь код
Удаляем файл = 
-----------
http://www.virustotal.com/file-scan/report.html?id=e979fcf20233baff3e9c8c27921bd4a215a45236856bf32b2a01ceae988900dc-1265219152
80
-----------
Удаляем файл = 
-----------
http://www.virustotal.com/file-scan/report.html?id=b570351e7bc3ca00ba47bd8b5e0d2c63814d1aefd786546bd22ad6e8524efc74-1266477769
92
-----------
Вируса нет = 
-----------
http://www.virustotal.com/file-scan/report.html?id=2bac20016422c9a2ea82aac7386c0147bd0ee96ccf3db3af3127a64348754787-1217825795
8
-----------
Но почему тогда выдаёт окошко с ошибкой после каждого прохода с сообщением, не знаете?
Код: Выделить весь код
HTTP/1.0 200 OK

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 12:30, 22-08-2010 | #35


Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Код: Выделить весь код
try{
         Form1->HTTPQuery->Post("http://www.virustotal.com/search.html", post, response);
}
catch(EIdHTTPProtocolException &se)
{
        switch(se.ErrorCode)
        {
              case 200: //всё ок
              break;
              case 303:
              break;  //редирект
              case 404: //404 not found
              break;
        }
}
catch(EIdSocketError &se){
         MessageBox(0, se.Message.c_str(), 0, 0);
}

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:08, 22-08-2010 | #36


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


ganselo, Ещё неучтённый нюанс, всплыл при тестировании, допустим результата проверки нет, вот, к примеру такая контрольная сумма
Код: Выделить весь код
564dfacf47f4d215b76a5eb3770a83d4
Если проверять на сайте, то адрес странички становится таким
Код: Выделить весь код
http://www.virustotal.com/search.html?notfound=1
Добавляем в список для проверки и имитируем проверку
Код: Выделить весь код
...
    lHash->Add("564dfacf47f4d215b76a5eb3770a83d4");
...
Программа жёстко вылетает в ошибку и закрывается. Как с этим бороться? Хотелось бы так
Цитата Drongo:
если ответа\результата нет, чтобы вернулся ноль »

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 17:11, 22-08-2010 | #37


Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Вставить в начало функции TForm1::HTTPQueryRedirect проверку:
Код: Выделить весь код
if(dest == "http://www.virustotal.com/search.html?notfound=1")
    {
        MessageBox(0, "Вирусов нет!", 0, 0);
        return;
    }

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:37, 22-08-2010 | #38


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


ganselo, В общем, всё отлично, только не пойму как в отдельный поток передавать список lHash с отобраными на проверку MD5
Цитата Drongo:
если по спискам не найдено, и у файла есть MD5 - то добавить файл с MD5 в список(HashVT) для дальнейшей проверки и в итоге в конце проверки лога, у нас формируется список lHash содержащий MD5 подготовленых к проверке на VT»
В функции создающей отдельный поток в качестве тестирования я создавал список в самой функции, но в реальности нужно передавать список в котором уже будут отобраны все необходимые для проверки, MD5.
Код: Выделить весь код
//добавляем новую функцию. Здесь и будет обращение к серверу
DWORD WINAPI QueryThread(LPVOID lpParam)
{
    TStringList *post = new TStringList;
    TStringStream *response = new TStringStream("");
    TStringList *lHash = new TStringList;

    lHash->Add("564dfacf47f4d215b76a5eb3770a83d4");
    lHash->Add("0045BCBD3047391E47F3B56DC7C7F2F2");
    lHash->Add("00636A27AF20104CC13E8DDE7DEE64E7");
    lHash->Add("012995DAD105ACEFBF05591271CD2F54");
...
Хотелось бы чтобы было
Код: Выделить весь код
...
   for(int i = 0; i < GlobalList->Count; i++){
       // Здесь разная проверка отсеивания и в итоге присваивание MD5 суммы
       MD5 = GlobalList->Strings[i]; // Присваивание контрольной сумы от файла переменной. Можно и сразу в список, но пока так
      }

    lHash->Add(MD5); // Добавление контрольной суммы в список
   ...
   // В итоге после прохода списка GlobalList
   // список lHash будет содержать некое количество отобраных MD5 на проверку
...
Как передать функции QueryThread список lHash? Или какой можно придумать выход ещё?

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 20:03, 27-08-2010 | #39


Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Код: Выделить весь код
HANDLE hThread;

//тут подготавливаем lHash
hThread = CreateThread(0, 0, QueryThread, lHash, 0, 0); //тут передаём его в поток
if(hThread == INVALID_HANDLE_VALUE) {
     ShowMessage("Can't create thread");
     return;
}
CloseHandle(hThread);
а теперь получаем данные из потока
Код: Выделить весь код
DWORD WINAPI QueryThread(LPVOID lpParam)
{
      TStringList *lHash = (TStringList *)lpParam;
      
      return 0;
}

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:35, 27-08-2010 | #40



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Получение контрольных сумм файлов (MD5, и т.д.) и их проверка в Online-сервисах

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Info - Онлайн проверка всего компьютера и отдельных файлов на вирусы iskander-k Защита компьютерных систем 6 27-01-2013 22:30
Прочие - Программы для подсчёта контрольных сумм файлов ALEXEY_DFD Программное обеспечение Windows 14 18-11-2011 15:30
CMD/BAT - [решено] Проверка установки определенных файлов в директорию korenza Скриптовые языки администрирования Windows 17 03-06-2010 13:25
Проверка защищенных файлов SergOst Microsoft Windows NT/2000/2003 11 15-10-2006 18:07
Проверка новых файлов налету, чем? sash minsk Защита компьютерных систем 5 03-06-2005 16:46




 
Переход