12.07.2015 Views

img - Xakep Online

img - Xakep Online

img - Xakep Online

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Разбор вывода антивирусаРазработка PHP-части• Установочные пакеты антивирусов и дипломатическиенавыки для общения с антивирусными компаниями.ПЕРЕЙДЕМ К ПРАКТИКЕНабросаем небольшой план. Что должна делать нашасофтина? Она запускает консольный сканер антивируса,читает и парсит его stdout. Чтобы понять стиль поведенияантивируса, запустим его с параметром --help, внимательновкурим в результат, а затем скормим ему здоровыйи зараженный (поочередно, естественно) файлы исравним вывод антивируса. Как это будет реализовано всофте?Как тебе уже известно (если ты читал мою статью в майском][ ), в Qt есть очень полезный класс QProcess, которыйслужит для запуска внешних программ. Он умеет запускатьпрограмму, получать ее вывод и сообщать нам о завершениипрограммы. Но нам этого недостаточно, поэтому мы немногодопишем класс. Что будет в новом классе? Он долженсобирать выведенный в консоль текст по мере его поступленияи генерировать сигнал с этим самым выводом и именемпроцесса при его завершении. Сказано — сделано:class QAvProcess : public QProcess {void inline startProcess(const QString &name,const QStringList &params);......signals:void onAvFinished(QAvProcess *sender,};const QString &av,QString &output,const int exitCode);private slots:void onFinished(int exitCode,QProcess::ExitStatus exitStatus);void onReadyRead();Как видишь, класс наследуется от QProcess. Рассмотримметоды и слоты этого класса:void QAvProcess::startProcess(const QString &name,const QStringList &params){QFileInfo info(name);avName = info.fileName();start(name, params);}Как нетрудно догадаться, этот метод служит для запуска программыи сохранения имени процесса перед запуском. Код,заключенный в слот onReadyRead, просто аппендит прочитанныйвывод к уже имеющемуся, а слот onFinished()генерирует сигнал emit onAvFinished(this, avName,avBuffer, exitCode). Все тривиально, поэтому я предлагаюдвигаться дальше, к главному классу:WARNINGwarningНе используйнелицензионныеверсии антивирусовв своем сервисе и нехостись в России.INFOРазберем код по порядку. За запуск антивирусов у нас отвеinfoRESPECTГруппе И-3-1(ПрикладнаяМатематика) МГТУ«Станкин».DieHard, YaesU, metalAsechka.Ru communityНаш сервис в работеclass QAv : public QObject{void startCheck(const QString &fName);private:QMap avs;QList results;QString fileName;inline QAvProcess* createProcess();QVirInfo inline parseOutput(const QString &avName,const QString &output);signals:void onAVDone(const QString avName,const QString avResult);private slots:void onAvFinished(QAvProcess *sender,const QString &av,const QString &output,const int exitCode);};XÀÊÅÐ 08 /139/ 10 075

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!