Защита Qt приложения от модификации

Posted on 2016-12-12 23:59:42

Рано или поздно при распостранении приложения, написанного с помощью Qt возникают два вопроса:

В этой статье рассматривается второй вопрос, а именно проверка на целостность исполняемого файла. Зачем это нужно? Вы не можете быть уверены, что скомпилированный вами файл останется без изменения на машине пользователя. Вирусы, нежелательное ПО, которое встраивается в файлы, банально неисправное оборудование пользователя. Во всех этих случаях ваша программа может работать не так как следует, сбоить, а то и вовсе крэшится. А это влияет на репутацию как программы, так и вас, вашей компании. Встроить проверку на целостность файла не займет много времени, и в итоге вы поимеете только плюсы.

Как же это работает? Очень просто. Подсчитываем CRC исполняемого файла за исключением области, где хранится эталонное значение, и сравниваем с ним. Если сходится - все Ок, в противном случае нужно уведомить пользователя, и порекомендовать скачать исправную версию с сайта. Для CRC есть специальная область в заголовке exe файла - байты 18 и 19, считая от нуля. Туда и будем записывать эталонное значение.

Пример кода из программы UnoSDR подсчета CRC:

bool App::checkSelfCRC()
{
#ifdef Q_OS_WIN
    QByteArray ba;
    quint16 hash = 0, selfHash = 0;
    qint64 time = QDateTime::currentMSecsSinceEpoch();
    //
    QFile file(qApp->applicationFilePath());
    if(file.open(QIODevice::ReadOnly))
    {
        ba = file.readAll();
        file.close();
        //
        if(ba.size() > 20)
        {
            for(qint64 i = 0; i < 18; i++)
            {
                hash += ba.at(i);
                hash += (hash << 10);
                hash ^= (hash >> 6);
            }
            //
            for(qint64 i = 20; i < ba.size(); i++)
            {
                hash += ba.at(i);
                hash += (hash << 10);
                hash ^= (hash >> 6);
            }
            // read saved crc
            selfHash = ba.at(18) | (quint16)ba.at(19) << 8;
            qDebug() << "calculate self crc" << hash << selfHash << "time, ms:" << QDateTime::currentMSecsSinceEpoch() - time;
        }
        else
        {
            qDebug() << "Error calc self crc - error ba size <= 20" << ba.size();
        }
    }
    else
    {
        qDebug() << "Error calc self crc - error open exe file" << file.errorString();
    }
    return selfHash == hash;
#else
    return true;
#endif
}

Используется хэш Дженкинса. В случае, если возникает ошибка открытия файла, что не исключено, функция возвращает true. Так же, если операционная система не Windows, потому что мы используем специфичный для Windows заголовок исполняемого файла.

Это еще не все. Нам нужно как то записать эталонную CRC при деплое приложения. Консольная утилита:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QByteArray ba;
    quint16 hash = 0;
    //
    QFile file("../bin/UnoSDR.exe");
    if(file.open(QIODevice::ReadWrite))
    {
        ba = file.readAll();
        if(ba.size() > 20)
        {
            for(qint64 i = 0; i < 18; i++)
            {
                hash += ba.at(i);
                hash += (hash << 10);
                hash ^= (hash >> 6);
            }
            //
            for(qint64 i = 20; i < ba.size(); i++)
            {
                hash += ba.at(i);
                hash += (hash << 10);
                hash ^= (hash >> 6);
            }
            // write crc
            ba.clear();
            ba.append(hash & 255);
            ba.append(hash >> 8);
            file.seek(18);
            file.write(ba);
        }
        else
        {
            qDebug() << "Error calc self crc - error ba size <= 20" << ba.size();
        }
        file.close();
    }
    else
    {
        qDebug() << "Error calc self crc - error open exe file" << file.errorString();
    }

    return a.exec();
}

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

Купил ИШИМ 003

Posted on 2016-12-03 23:11:09

Как то зашел случайно на olx на свою голову, и как результат, заказал себе еще один приемник ИШИМ 003 - теперь у меня их два)

ИШИМ 003

Правда, оказалось, что не работает КВ - 1, сбиты настройки контуров, громкость не уменьшается регулятором до минимума, из - за переделки УНЧ, а так же верньер более тугой, чем в приемнике под ним. Передняя и задняя панель полностью пластмассовая. Но, покупкой, в принципе не разочарован.

Светлая и темная тема для Qt Creator

Posted on 2016-12-02 22:08:30

Не прошло и пол года, как в очередной версии Qt Creator появилась дефолтная flat светлая и темная темы. По моему, фича маст хев в первую очередь для IDE, непонятно, почему разработчики так долго тянули. Напомню, что раньше стандартными средствами нельзя было сделать нормальную темную тему.

Как было:

qt default color theme

Как стало:

qt flat ligth color theme

qt flat dark color theme

Что бы переключить тему, нужно в меню выбрать: Инструменти - Параметры - Среда - Интерфейс. К новым темам привык достаточно быстро. Переключаюсь между ними в зависимости от внешнего освещения.

Сегодня день рождения UnoSDR на Android!

Posted on 2016-11-29 22:58:13

Прошло всего два дня с момента первого релиза UnoSDR для Windows x86 - 64, 15 - го числа, как сегодня в моей sdr лаборатории запустил на 10 - ти дюймовом планшете версию для Android! Выкинул из UnoSDR аудио библиотеку PortAudio, так как она не поддерживает платформу, переписал аудио подсистему на нативную реализацию от Qt.

 

Выглядит не очень) Это из за разного разрешения экрана и dpi. Будем адаптировать интерфейс!)

First 1 2 3 4 5 6 7 8 9 10 11 12 13 Last