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

Компьютерный форум 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, Я ещё не учёл такой момент, это кстати не учтено и в VT Checker - утилита пакетной проверки файлов на VirusTotal.com, когда соединения с Инетом нет, то моя программа выдаёт ошибку, а VT Checker молча закрывается.

Как можно добавить код, чтобы проверялось наличие установленого соединения и если его небудет, то выдавало один MessageBox с сообщением
Цитата:
Отсутствует соединение с интереном

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
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


Отправлено: 14:07, 29-08-2010 | #41



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

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


Аватара для ganselo

Старожил


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

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


Код: Выделить весь код
#include <stdio.h>
#include <wininet.h>
 
bool CheckConnection()
{
    DWORD flags;
    flags = INTERNET_CONNECTION_MODEM +
     INTERNET_CONNECTION_LAN +
     INTERNET_CONNECTION_PROXY;
 
    return InternetGetConnectedState (&flags,0);
}

if(!CheckConnection()) {
      MessageBox(0, "Отсутствует соединение с интереном", "Внимание", MB_OK + MB_ICONWARNING);
}
MSDN

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

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

Отправлено: 14:51, 29-08-2010 | #42


Аватара для Drongo

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


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

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


Вложения
Тип файла: rar CheckConnect.rar
(3.0 Kb, 9 просмотров)

ganselo, Я знаю, что что-то не так делаю, но что именно, понять не могу, посмотрите проект. (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


Отправлено: 19:15, 29-08-2010 | #43


Аватара для ganselo

Старожил


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

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


Нужно подключить библиотеку wininet.lib.
Код: Выделить весь код
#pragma comment(lib, "wininet.lib")

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

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

Отправлено: 20:15, 29-08-2010 | #44


Аватара для Drongo

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


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

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


ganselo, Да, с этим скомпилировалось без ошибок. Но в любом случае, хоть есть подключение, хоть его нету, функция показывает сообщение - Инет работает. Прочитал MSDN с переводчиком, но вроде бы всё сделал как рекомендовалось.
Код: Выделить весь код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   if(!CheckConnection()) {
      MessageBox(0, "Отсутствует соединение с интернетом", "Внимание", MB_OK + MB_ICONWARNING);
     }
   else
      Label1->Caption = "Инет работает!!!";
}

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
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:32, 30-08-2010 | #45


Аватара для ganselo

Старожил


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

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


Почитал про эту функцию в инете, пишут, что не у всех работает.
Тогда можно попробовать так:
Код: Выделить весь код
try{
         HTTPQuery->Post("http://www.virustotal.com/search.html", post, response);
        }
      catch(EIdSocketError &se){
      //если не удалось подключится, то возникнет это исключение
        if(se.LastError == код ошибки, когда пытаемся коннектится с отсутствующим инетом)
               MessageBox(0, "Не удалось подключится к удалённому серверу", 0, MB_OK + MB_ICONWARNING);
        // ShowMessage(se.Message);
        }
      catch(Exception &e){
         ShowMessage(e.Message);
}

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

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

Отправлено: 13:10, 30-08-2010 | #46


Аватара для Drongo

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


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

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


ganselo, Искал в Нете решение, набрёл на похожее, только на делфи. Пробовал сам, но запутался с catch. Сейчас проверю.

Код: Выделить весь код
var
  connected: boolean;
begin
  connected:=true;
  //тут прописываем настройки idHTTP
  try
    idHTTP.Get('http://www.google.ru');
    //в OnStatus можно прописать дисконнект на статусе "Connected", что б лишнего не качать
  except
    on e: exception do connected := false;
  end;
  if not connected then
    ShowMessage('Нет инета')
  else
    ShowMessage('Есть инет');
end;
Там же нашёл консольный вариант и он рабочий.

Код: Выделить весь код
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>

#define ADDR "209.85.229.104"
#define PORT 80

#pragma comment(lib, "ws2_32.lib")

int main()
{
   WSADATA wsaDATA;
   SOCKET my_socket;
   sockaddr_in server_addr;
   int len_client_sock;

   printf("Scanner address: %s!\n", ADDR);

   if(WSAStartup(MAKEWORD(2,2), &wsaDATA) != NO_ERROR){
      printf("Library WinSock not load!\n");
      WSACleanup();
      system("PAUSE");
      return 1;
     }
   else
      printf("Library WinSock load!");

   my_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

   server_addr.sin_family = AF_INET;
   server_addr.sin_addr.s_addr = inet_addr(ADDR);
   server_addr.sin_port = htons(PORT);

   len_client_sock = sizeof(server_addr);

   if(connect(my_socket, (sockaddr*)&server_addr, len_client_sock) != SOCKET_ERROR)
      printf("\nInternet YES!\n");
   else
      printf("\nInternet NO!\n");

   shutdown(my_socket, SD_BOTH);
   closesocket(my_socket);
   WSACleanup();

   system("PAUSE");

   return 0;
}

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
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


Отправлено: 14:57, 30-08-2010 | #47


Аватара для ganselo

Старожил


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

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


Код: Выделить весь код
catch(EIdSocketError &se){
      if(se.LastError == 11004)
        MessageBox(0, "Соединение не обнаружено", 0, 0);
}
Консольный вариант выполняет тоже самое, что:
Код: Выделить весь код
var
  connected: boolean;
begin
  connected:=true;
  //тут прописываем настройки idHTTP
  try
    idHTTP.Get('http://www.google.ru');
    //в OnStatus можно прописать дисконнект на статусе "Connected", что б лишнего не качать
  except
    on e: exception do connected := false;
  end;
  if not connected then
    ShowMessage('Нет инета')
  else
    ShowMessage('Есть инет');
end;
Только на низком уровне.

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


Отправлено: 15:33, 30-08-2010 | #48


Аватара для Drongo

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


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

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




ganselo, я придумал так, как вы показали и как есть на дельфи в коде выше.

Код: Выделить весь код
// Инициализируем массив вне отдельного потока-----------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   lHash = new TStringList;

   lHash->Add("564dfacf47f4d215b76a5eb3770a83d4");
   lHash->Add("0045BCBD3047391E47F3B56DC7C7F2F2");
   lHash->Add("00636A27AF20104CC13E8DDE7DEE64E7");
   lHash->Add("012995DAD105ACEFBF05591271CD2F54");
}
//добавляем новую функцию. Здесь и будет обращение к серверу
DWORD WINAPI QueryThread(LPVOID lpParam)
{
   TStringList *post = new TStringList;
   TStringStream *response = new TStringStream("");
   TStringList *lHash = (TStringList *)lpParam;

   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(EIdHTTPProtocolException &se){
         switch(se.ErrorCode){
            case 200: //всё ок
              break;
            case 303:
              break;  //редирект
            case 404: //404 not found
              break;
            default:
              break;
          }
       }
      catch(EIdSocketError &se){
         MessageBox(0, se.Message.c_str(), 0, 0);
        }
        Form1->HTTPQuery->Disconnect();
     }
    delete post, response, lHash;
}
// Выполнение и обработка-------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   bool connect = true; // Добавил переменную bool
   try{
     HTTPQuery->Get("http://www.virustotal.com/search.html");
     }
    catch(EIdHTTPProtocolException &se){
       switch(se.ErrorCode){
          case 200: //всё ок
            break;
          case 303:
            break;  //редирект
          case 404: //404 not found
            break;
          default:
            break;
         }
      }
    catch(EIdSocketError &se){
       //если не удалось подключится, то возникнет это исключение
       // и bool присваивается false
       if(se.LastError == 11001)
          connect = false;
      }
   if(connect){ // Если соединение есть - connect == true, начинаем обработку
      HANDLE hThread;

      hThread = CreateThread(0, 0, QueryThread, lHash, 0, 0);
      if(hThread == INVALID_HANDLE_VALUE){
         ShowMessage("Can't create thread");
         return;
        }
      CloseHandle(hThread);
     }
   else // Если соединения нету - connect == false
      MessageBox(0, "Не удалось подключится к удалённому серверу", 0, MB_OK + MB_ICONWARNING);
}
//---------------------------------------------------------------------------
Если где-то что-то я неправильно сделал, лишнее что-то и т.п., поправьте если сможете. Но всё работает.

Цитата ganselo:
if(se.LastError == 11004) »
А у меня ошибка 11001 при отсутствии соединения
Код: Выделить весь код
Socket Error # 11001 Host not found.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
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


Отправлено: 15:33, 30-08-2010 | #49


Аватара для ganselo

Старожил


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

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


Можно было обойтись без лишних проверок, а сделать так:
Код: Выделить весь код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   try{
     HTTPQuery->Get("http://www.virustotal.com/search.html");
     HANDLE hThread;

      hThread = CreateThread(0, 0, QueryThread, lHash, 0, 0);
      if(hThread == INVALID_HANDLE_VALUE){
         ShowMessage("Can't create thread");
         return;
        }
      CloseHandle(hThread);
     }
    catch(EIdHTTPProtocolException &se){
       switch(se.ErrorCode){
          case 200: //всё ок
            break;
          case 303:
            break;  //редирект
          case 404: //404 not found
            break;
          default:
            break;
         }
      }
    catch(EIdSocketError &se){
       if(se.LastError == 11001)
          MessageBox(0, "Не удалось подключится к удалённому серверу", 0, MB_OK + MB_ICONWARNING);
      }
}

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

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

Отправлено: 18:39, 30-08-2010 | #50



Компьютерный форум 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




 
Переход