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

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

 

Аватара для ganselo

Старожил


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

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


Вот готовые проект со вторым и третьим пунктами. В третьем пункте для парсинга использовал TinyXML. Парсер получился очень простым, так как первый раз имел дело с TinyXML (советую почитать инфу по нему и переписать).

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


Последний раз редактировалось ganselo, 14-11-2010 в 00:31.

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

Отправлено: 14:45, 19-08-2010 | #11



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

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


Аватара для Drongo

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


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

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


За проект спасибо, но он открывается с ошибками и не компилируется, проблема с компонентом HTTPQuery, выше я писал об этом.
Цитата Drongo:
HTTPQuery - этого компонента у меня нет »
Причём нет ни в
Цитата:
Borland C++ Builder 6.0 Enterprise Suite
ни в
Цитата:
CodeGear C++ Builder 2009

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


Отправлено: 16:34, 19-08-2010 | #12


Аватара для Drongo

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


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

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


Так, я немного торможу, понял что HTTPQuery это переименованый IdHTTP, но при старте проекта всё же ошибки выдаёт.

Убрал галочку "Создавать пакеты во время выполнения". Ругалось на эти строки

Код: Выделить весь код
    catch(EIdHTTPProtocolException &se)
    {

    }
Удалил запись, теперь при компиляции ошибка линковки
Код: Выделить весь код
[Linker Fatal Error] Fatal: Unable to open file 'INDYPROTOCOLS60.LIB'

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


Последний раз редактировалось Drongo, 19-08-2010 в 17:05.


Отправлено: 16:49, 19-08-2010 | #13


Аватара для ganselo

Старожил


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

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


HTTPQuery это TIdHTTP *HTTPQuery. Кидаете на форму TIdHTTP и переименовываете его на HTTPQuery.
Я использую Borland C++ Builder 2006 с установленной поверх Indy 2010.

Попробуйте создать пустой проект и на форму перетащите следующее:
TMemo, TButton, TIdHTTP и переименуйте их в Memo, Button, HTTPQuery соответственно. Далее добавьте в проект *.cpp файлы из папки TinyXML. Подключите хидеры:
Код: Выделить весь код
#include "tinyxml/tinystr.h"
#include "tinyxml/tinyxml.h"
В обработчике события OnClick класса Button впишите следующее:
Код: Выделить весь код
AnsiString md5Hesh = "d8578edf8458ce06fbc5bb76a58c5ca4";
    TStringList *post = new TStringList;
    TStringStream *response = new TStringStream("");

    post->Add("chain=" + md5Hesh);

    try
    {
        HTTPQuery->Post("http://www.virustotal.com/search.html", post, response);
    }
    catch(EIdSocketError &se)
    {
        ShowMessage(se.Message);
    }
    catch(EIdHTTPProtocolException &se)
    {

    }
    catch(Exception &e)
    {
        ShowMessage(e.Message);
    }
    ShowMessage(response->DataString);

    delete HTTPQuery, post, response;
Далее вставьте следующий код:
Код: Выделить весь код
//---------------------------------------------------------------------------
const char * getIndent( unsigned int numIndents )
{
	static const char * pINDENT="                                      + ";
	static const unsigned int LENGTH=strlen( pINDENT );
	unsigned int n=numIndents*NUM_INDENTS_PER_SPACE;
	if ( n > LENGTH ) n = LENGTH;

	return &pINDENT[ LENGTH-n ];
}
//---------------------------------------------------------------------------
int dump_attribs_to_stdout(TiXmlElement* pElement, unsigned int indent, TIdent &ident)
{
	if ( !pElement ) return 0;

	TiXmlAttribute* pAttrib=pElement->FirstAttribute();
	int i=0;
	int ival;
	double dval;
	const char* pIndent=getIndent(indent);
	while (pAttrib)
	{
        ident.insert(make_pair(pAttrib->Name(), pAttrib->Value()));
		i++;
		pAttrib=pAttrib->Next();
	}
	return i;	
}
//---------------------------------------------------------------------------
void __fastcall dump_xml(TiXmlNode *pParent, TListRes &lst, unsigned int indent = 0)
{
    if(!pParent) return;

    TiXmlNode* pChild;
	int t = pParent->Type();
	static TIdent ident;
    static bool flag = false;

	switch (t)
	{
	    case TiXmlNode::TINYXML_ELEMENT:
        {
            AnsiString val = pParent->Value();
            if(val == "table")
            {
                dump_attribs_to_stdout(pParent->ToElement(), indent+1, ident);

                if(ident["id"] == "tablaMotores") flag = true;
                ident.clear();
            }
            else
            {
                if(flag && (val != "th" && val != "tr" && val != "td"))
                {
                    flag = false;
                    return;
                }
            }
        }
    	break;
	    case TiXmlNode::TINYXML_TEXT:
            if(flag)
            {
                lst.push_back(pParent->Value());
            }
		break;
	default:
		break;
	}
	for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling())
        dump_xml(pChild, lst, indent + 1);
}
//----------------------------------------------------------------------------
void __fastcall ParseXml(const AnsiString &xml, TResult &result)
{
    TListRes lst;
    RESULT_NODE res_node;
    int count;
    TiXmlDocument xml_doc;
    xml_doc.Parse(xml.c_str(), 0, TIXML_ENCODING_UTF8);
    dump_xml(&xml_doc, lst);

    for(int i = 4; i < lst.size(); i+=4)
    {
        res_node.antivirus = lst[i];
        res_node.version = lst[i + 1];
        res_node.last_upd = lst[i + 2];
        res_node.result = lst[i + 3];
        result.push_back(res_node);
    }
}
Далее в обработчике события OnRedirect класса HTTPQuery добавьте следующее:
Код: Выделить весь код
void __fastcall TForm1::HTTPQueryRedirect(TObject *Sender,
      AnsiString &dest, int &NumRedirect, bool &Handled,
      AnsiString &VMethod)
{
    TResult result;
    AnsiString res = HTTPQuery->Get(dest);
    Memo->Lines->Add(res);
    ParseXml(res, result);
    Handled = false;
    bool flag = true;

    for(TResult::iterator i = result.begin(); i != result.end(); i++)
    {
        if(i->result != "-")
        {
            Application->MessageBoxA(
                AnsiString("Обнаружен вирус " + i->result).c_str(), "Внимание",
                MB_OK + MB_ICONWARNING);
            flag = false;
        }
    }
    if(flag) Application->MessageBoxA("Вирусов не обнаружено", "Информация",
                MB_OK + MB_ICONINFORMATION);
}
В файле, где объявлена главная форма (Unit1.h) вставьте слежующее:
Код: Выделить весь код
#include <list>
#include <map>
#include <vector>
using namespace std;

struct RESULT_NODE
{
    AnsiString antivirus;
    AnsiString version;
    AnsiString last_upd;
    AnsiString result;
};
typedef map<AnsiString, AnsiString> TIdent;
typedef vector<AnsiString> TListRes;
typedef list<RESULT_NODE> TResult;
Попробуйте скомпилировать.

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

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

Отправлено: 17:33, 19-08-2010 | #14


Аватара для Drongo

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


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

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


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

ganselo, Сделал по последней инструкции, скомпилировалось без ошибок. Но по функционалу, получилось тоже самое что и утром с первым проектом, запрос делает, получает пустую\главную страницу без результатов проверки. Если не сложно посмотрите проект - 65 КБ.

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


Аватара для ganselo

Старожил


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

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


Вложения
Тип файла: zip desc.zip
(85.4 Kb, 8 просмотров)

После перекомпиляции у меня всё работает (скрины и полученная html страничка в атаче). А после запуска вашего exe'шника получается стартовая страница. Думаю связано это с тем, что у вас старая версия Indy. Поставьте последнюю версию Indy с офф сайта.

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

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

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


Аватара для ganselo

Старожил


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

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


Проснифал пакетики с вашей версии программы и своей. Выяснилось, что в вашей редирект не верно работает. Попробуйте в обработчике события OnRedirect вывести параметр dest (ShowMessage(dest); ) и вышлете мне результат.

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

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

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


Аватара для Drongo

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


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

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


Цитата ganselo:
Попробуйте в обработчике события OnRedirect вывести параметр dest (ShowMessage(dest); ) и вышлете мне результат. »
Сделал, вот результат вывода:
Код: Выделить весь код
http://www.virustotal.com/search.html?notfound=1

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


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


Аватара для ganselo

Старожил


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

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


Drongo, какую версию Builder'a используете? Какую версию Indy используете? Попробуйте потестить в CodeGear C++ Builder 2009.

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


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


Аватара для Delirium

Ветеран


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

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


Цитата Drongo:
В Memo загружается страница какой-то текст, при сохранении в html получается та же самая страница, что и по ссылке - http://www.virustotal.com/search.html »
Отправлять запрос надо на
Цитата Delirium:
http://www.virustotal.com/vt/en/consultamd5 »

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 00:55, 20-08-2010 | #20



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




 
Переход