Хотелось бы примеров

В документации упоминаются такие приёмы защиты:

9. Подсчитывайте хэш важных участков кода приложения. Это мощное средство защиты от модификации хакером кода приложения. Предварительно вы подсчитываете хэш тех мест в программе, в которых производятся вызовы функций API, анализируются выходные данные функций и принимаются решения о дальнейшей работе приложения.

и

6. Воспользуйтесь алгоритмом цифровой подписи. Алгоритм ECC160 позволяет подписывать произвольные данные с помощью функции GrdSign. Лучше всего, чтобы это были данные, которые возникают в приложении естественным образом (так называемая естественная энтропия): данные, которые пользователь вводит в программу с клавиатуры, движения мышки, значения из баз данных, полученные по запросу пользователя.

Проиллюстируйте пожалуйста их хотя бы простейшими примерами. Не могу понять, как можно просчитать хэш запущеного кода, и как проверять подпись случайных данных.

Re: Хотелось бы примеров

Добрый день!

6. Воспользуйтесь алгоритмом цифровой подписи. Алгоритм ECC160 позволяет подписывать произвольные данные с помощью функции GrdSign. Лучше всего, чтобы это были данные, которые возникают в приложении естественным образом (так называемая естественная энтропия): данные, которые пользователь вводит в программу с клавиатуры, движения мышки, значения из баз данных, полученные по запросу пользователя.

Схематичный пример, как подписывать данные и проверять подпись есть в Уроке 3.3 обучающих материалов. В нем используется естественный источник энтропии - пользовательский ввод с клавиатуры.

По аналогии можно встроить процедуры генерации подписи / ее проверки в свое приложение, используя любой другой источник случайных данных для подписи (часто удобно использовать текущие значения каких-либо переменных при обработке данных или сами эти данные).

Обращаю внимание на то, что в примере для проверки подписи использована функция GrdVerifySignSource(), представляющая собой аналог библиотечной функции GrdVerifySign(), но доступная в исходном коде. Это позволяет встроить ее код в собственное приложение, перемешав дополнительно с кодом "полезного" функционала (для усложнения анализа и исключения "вырезания" кода проверки подписи).

9. Подсчитывайте хэш важных участков кода приложения. Это мощное средство защиты от модификации хакером кода приложения. Предварительно вы подсчитываете хэш тех мест в программе, в которых производятся вызовы функций API, анализируются выходные данные функций и принимаются решения о дальнейшей работе приложения.

Чуть позже набросаю пример. Отмечу, однако, сразу, что сравнение хеша кода с образцом можно использовать только когда исполняемый код не преобразуется никак после компиляции. Проще говоря, не используются всякого рода пакеры и протекторы (к примеру, наша Автозащита).

Тем не менее, теоретически, можно считать хеш критических участков кода во время исполнения и следить за тем, чтобы он не менялся. Хотя такой подход и не даст 100%-ной защиты от модификации, но может оказаться эффективным в ряде случаев.

Re: Хотелось бы примеров

Пример:

void func1()
{
    BYTE    *pStartAddress, *pEndAddress;
    // ...
    __asm {
        lea    EAX, StartMark; 
        mov pStartAddress, EAX;
        lea    EAX, EndMark; 
        mov pEndAddress, EAX;
    } 
    
    CalcCheckSum(pStartAddress, (pEndAddress - pStartAddress));
    // ...
    
    StartMark:
    // Код, целостность которого контролируется
    EndMark:

    // ...
}

Обращаю внимание на CalcCheckSum(). Крайне желательно использовать собственную функцию подсчета контрольной суммы участка памяти. Чем она будет проще тем лучше. Она не должна быть похожа на распространенные функции подсчета контрольных сумм, чтобы ее было сложнее найти. Лучше, если таких функций будет несколько и разных. И работать они будут в разных потоках.

Остальные мои замечания (по поводу изменения после компиляции) также в силе.

Re: Хотелось бы примеров

Спасибо за пример, суть понятна! Я думал несколько о другом спсосбе, когда КС участка кода сверяется со значением, предварительно вычисленым на этапе разработки. Потому, что просто считать КС определённого участка из разных мест приложения, и сравнивать значения между собой - поможет только от модификации кода непосредственно в памяти. Хотя никто не мешает просто использовать полученое значение суммы в каких-нибудь жизненно-важных для приложения расчётах.

Re: Хотелось бы примеров

Все верно, оба подхода можно использовать. Однако, первый (с подсчетом КС на этапе разработки) не получится использовать, если приложение после компиляции накрывается автозащитой.