![]() |
Получение контрольных сумм файлов (MD5, и т.д.) и их проверка в Online-сервисах
Приветы. :) Вот собственно, такой вопрос возник в связи с темой - VT Checker - утилита пакетной проверки файлов на VirusTotal.com Хочу дополнительно прикрутить к своей программе поиск вредоносов по их контрольной сумме MD5 с дальнейшей проверкой на различных онлайн сервисах. Прошу помочь в этом. Задача состоит из трёх подзадач.
1. Как получить контрольную сумму (MD5) файла - Решена 2. Как сделать запрос на онлайн-сервис (http://www.virustotal.com/search.html) 3. Как вернуть результат проверки Спасибо. |
|
AlexTNT, О, спасибо, не догадался посмотреть в FAQ(source), я завтра поэкспериментирую. Только там что-то много кода, Delirium говорил, можно короче. :)
Цитата:
|
Drongo,
1. Если кодите в Borland или Delphi, то на вкладке IndyMisc есть компонент для работы с MD5 (не помню названия). 2. Использовать: WinSock, WinInet, TNMHTTP, TIdHTTP. 3. Делать соответствующий GET или POST запрос, далее парсить результат. |
Код:
public string GetMD5Hash(string input) отправка запроса на VirusTotal: Код:
//созд. объект, который отравляет GET и POST запросы hash={0} - слово HASH берется из требуемой страницы на сервере. Я просматривал код страницы http://www.virustotal.com/vt/en/consultamd5, там есть TextBox с ID="hash". Вот его и указываем при отправке POST запроса. |
Цитата:
|
Вложений: 1
Друзья, спасибо за советы, но особо хочу подчеркнуть помощь Serega, если бы не он, :up: так и по сию минуту пытался что-то сделать.
Вариант может быть такой. Код:
#include <IdHashMessageDigest.hpp> Цитата:
Теперь становятся актуальны два следующих вопроса. Как правильно отправить полученый MD5 на онлайн-сервис. |
По второму пункту:
На форме TButton (Button1), TMemo (Memo) и TIdHTTP (HTTPQuery) Код:
void __fastcall TForm1::Button1Click(TObject *Sender) |
Цитата:
В Memo загружается страница какой-то текст, при сохранении в html получается та же самая страница, что и по ссылке - http://www.virustotal.com/search.html Код:
void __fastcall TForm1::Button1Click(TObject *Sender) |
Drongo, в результате мы получаем страничку с результатом проверки. Из неё мы должны выдрать таблицу:
HTML код:
<table width="700" border="0" cellpadding="0" cellspacing="0" id="tablaMotores"> |
Вот готовые проект со вторым и третьим пунктами. В третьем пункте для парсинга использовал TinyXML. Парсер получился очень простым, так как первый раз имел дело с TinyXML (советую почитать инфу по нему и переписать).
|
За проект спасибо, но он открывается с ошибками и не компилируется, проблема с компонентом HTTPQuery, выше я писал об этом.
Цитата:
Цитата:
Цитата:
|
Так, я немного торможу, понял что HTTPQuery это переименованый IdHTTP, но при старте проекта всё же ошибки выдаёт.
Убрал галочку "Создавать пакеты во время выполнения". Ругалось на эти строки Код:
catch(EIdHTTPProtocolException &se) Код:
[Linker Fatal Error] Fatal: Unable to open file 'INDYPROTOCOLS60.LIB' |
HTTPQuery это TIdHTTP *HTTPQuery. Кидаете на форму TIdHTTP и переименовываете его на HTTPQuery.
Я использую Borland C++ Builder 2006 с установленной поверх Indy 2010. Попробуйте создать пустой проект и на форму перетащите следующее: TMemo, TButton, TIdHTTP и переименуйте их в Memo, Button, HTTPQuery соответственно. Далее добавьте в проект *.cpp файлы из папки TinyXML. Подключите хидеры: Код:
#include "tinyxml/tinystr.h" Код:
AnsiString md5Hesh = "d8578edf8458ce06fbc5bb76a58c5ca4"; Код:
//--------------------------------------------------------------------------- Код:
void __fastcall TForm1::HTTPQueryRedirect(TObject *Sender, Код:
#include <list> |
Вложений: 1
ganselo, Сделал по последней инструкции, скомпилировалось без ошибок. :) Но по функционалу, получилось тоже самое что и утром с первым проектом, запрос делает, получает пустую\главную страницу без результатов проверки. Если не сложно посмотрите проект - 65 КБ.
|
Вложений: 1
После перекомпиляции у меня всё работает (скрины и полученная html страничка в атаче). А после запуска вашего exe'шника получается стартовая страница. Думаю связано это с тем, что у вас старая версия Indy. Поставьте последнюю версию Indy с офф сайта.
|
Проснифал пакетики с вашей версии программы и своей. Выяснилось, что в вашей редирект не верно работает. Попробуйте в обработчике события OnRedirect вывести параметр dest (ShowMessage(dest); ) и вышлете мне результат.
|
Цитата:
Код:
http://www.virustotal.com/search.html?notfound=1 |
Drongo, какую версию Builder'a используете? Какую версию Indy используете? Попробуйте потестить в CodeGear C++ Builder 2009.
|
Цитата:
Цитата:
|
Браузер отправляет запрос на http://www.virustotal.com/search.html (POST запрос chain=md5). Дальше происходит редирект на результат.
|
Цитата:
Цитата:
Цитата:
Цитата:
Скачал новую Indy10 пробовал установить по инструкции, правда, ничего с установкой компонентов не получилось :( Как её правильно установить? Я удалил старую Indy, запустил файл .bpk, компиляция нормально - Install в ошибку. |
Я устанавливал по этой инструкции. Эту инструкцию можно выполнять с 3-его пункта, но перед этим нада удалить старые Indy компоненты.
|
Цитата:
Установил Indy по инструкции, палитра компонентов появилась, но даже простой вызов Код:
void __fastcall TForm1::FormCreate(TObject *Sender) Цитата:
|
А вы указали пути ко всем нужным файлам?
Попробуйте скомпилировать в release версии. |
Цитата:
Цитата:
Цитата:
|
Вложений: 1
Так. Установил Indy, версия 10.2.3 параллельно пришлось ещё вручную закинуть в папку Bin файлы indy60.bpl и dclindy60.bpl. Проект собрал. Собирается только при релиз версии. Без этого вылетает окно отладчика.
Правда ожидаемого результата почему-то нет. |
Запустил я exe'шник и он мне выдал HTTP/1.0 303 See Other. Это означает, что происходит редирект, но метод OnRedirect у HTTPQuery не назначен. Во вкладке Events (события) класса HTTPQuery назначил событию OnRedirect функцию:
Код:
void __fastcall TForm1::HTTPQueryRedirect(TObject *Sender, |
ganselo, Точно, совсем уже я мозги потерял, удалял старую версию компонента, а видимо нужно было переназначить метод на новую. Заработало всё как надо. :up:
Только мне бы хотелось, чтобы во время работы не выскакивали лишние MessageBox Код:
catch(EIdSocketError &se) |
Цитата:
Цитата:
В обработчике события OnRedirect после того как распарсили результат вставляем это: Код:
int antivirus_count = result.size(); |
ganselo, О, отлично. :up: Допустим мне теперь нужно проверить не один MD5 а несколько, заранее не известно сколько, но предположим несколько, я придумал так
Код:
//--------------------------------------------------------------------------- Цитата:
|
Проблема в этой строчке:
Код:
delete HTTPQuery, post, response, lHash; Нужно так: Код:
delete post, response, lHash; |
Цитата:
Проверяем файлы по уже имеющимся спискам (Malware, Hash) и если по имеющимся спискам найдены вредные файлы, то проверку такого файла не делать на VT, а если по спискам не найдено, и у файла есть MD5 - то добавить файл с MD5 в список(HashVT) для дальнейшей проверки. В итоге, после прогона, получается список уже явно удаляемых(MalwareDelete) по имеющимся спискам и список подготовленых к проверке на VT. Вот теперь проверяем этот список HashVT на VT и если он удовлетворяется по условию процента, то файл добавляется в список подготовленых к удалению MalwareDelete. И теперь как бы ждём вердикта VT, правда вы говорите что форма неактивна, да, действительно неактивна, я только что проверил, сначала не обратил внимание. А как делать в отдельном потоке? |
Код:
//добавляем новую функцию. Здесь и будет обращение к серверу Код:
void __fastcall TForm1::Button1Click(TObject *Sender) |
Цитата:
Ещё, если знаете, такой вопрос. Это выходной лог, всё работает Код:
Удаляем файл = Код:
HTTP/1.0 200 OK |
Код:
try{ |
ganselo, Ещё неучтённый нюанс, всплыл при тестировании, допустим результата проверки нет, вот, к примеру такая контрольная сумма
Код:
564dfacf47f4d215b76a5eb3770a83d4 Код:
http://www.virustotal.com/search.html?notfound=1 Код:
... Цитата:
|
Вставить в начало функции TForm1::HTTPQueryRedirect проверку:
Код:
if(dest == "http://www.virustotal.com/search.html?notfound=1") |
ganselo, В общем, всё отлично, только не пойму как в отдельный поток передавать список lHash с отобраными на проверку MD5
Цитата:
Код:
//добавляем новую функцию. Здесь и будет обращение к серверу Код:
... |
Код:
HANDLE hThread; Код:
DWORD WINAPI QueryThread(LPVOID lpParam) |
ganselo, Я ещё не учёл такой момент, это кстати не учтено и в VT Checker - утилита пакетной проверки файлов на VirusTotal.com, когда соединения с Инетом нет, то моя программа выдаёт ошибку, а VT Checker молча закрывается.
Как можно добавить код, чтобы проверялось наличие установленого соединения и если его небудет, то выдавало один MessageBox с сообщением Цитата:
|
Код:
#include <stdio.h> |
Вложений: 1
ganselo, Я знаю, что что-то не так делаю, но что именно, понять не могу, посмотрите проект. (3 КБ)
|
Нужно подключить библиотеку wininet.lib.
Код:
#pragma comment(lib, "wininet.lib") |
ganselo, Да, с этим скомпилировалось без ошибок. Но в любом случае, хоть есть подключение, хоть его нету, функция показывает сообщение - Инет работает. :( Прочитал MSDN с переводчиком, но вроде бы всё сделал как рекомендовалось.
Код:
void __fastcall TForm1::Button1Click(TObject *Sender) |
Почитал про эту функцию в инете, пишут, что не у всех работает.
Тогда можно попробовать так: Код:
try{ |
ganselo, Искал в Нете решение, набрёл на похожее, только на делфи. Пробовал сам, но запутался с catch. Сейчас проверю. :)
Код:
var Код:
#include <stdio.h> |
Код:
catch(EIdSocketError &se){ Код:
var |
ganselo, я придумал так, как вы показали и как есть на дельфи в коде выше. :) Код:
// Инициализируем массив вне отдельного потока----------- Цитата:
Код:
Socket Error # 11001 Host not found. |
Можно было обойтись без лишних проверок, а сделать так:
Код:
void __fastcall TForm1::Button1Click(TObject *Sender) |
Время: 10:08. |
Время: 10:08.
© OSzone.net 2001-