Как я могу предотвратить использование моей экспортированной функции другими исполняемыми файлами или DLL?

Вопрос или проблема

У меня есть функция, которую мне нужно экспортировать в исполняемый файл, этот исполняемый файл использует эту функцию для чтения сжатых файлов.

Я хотел бы защитить эту функцию.

Только мой исполняемый файл может иметь к ней доступ, любой другой, кто попытается перехватить функцию или получить результат ее работы, должен быть проигнорирован, вернув 0.

Функция выглядит следующим образом:

extern "C" __declspec(dllexport) int read_encryptfile(uint8_t* mbyte, uint32_t* byteLen) {
    int result = ReadmyByte(mbyte, byteLen);

    if (result != 0) {
        std::vector<uint8_t> DencryptedSource = DescryptBytes(mbyte, byteLen);
        result = ReadmyByte(DencryptedSource.data(), DencryptedSource.size());
        CleanDecryptedBytes(DencryptedSource);
    }

    return result;

}

DescryptBytes принимает зашифрованные байты, расшифровывает их с помощью ключа и возвращает расшифрованные байты.

Функция read_encryptfile используется постоянно для доступа к расшифрованным файлам.

Что мне делать, чтобы избежать перехвата функции и позволить доступ только моему исполняемому файлу?

Ответ или решение

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

1. Используйте Обфускацию кода

Одним из способов повышения безопасности является обфускация кода. Используйте инструменты для обфускации, чтобы затруднить чтение и понимание кода вашей DLL. Это усложнит задачу злоумышленникам, которые хотят проанализировать вашу библиотеку и найти уязвимости.

2. Проверка контекста вызова

Можно внедрить механизмы проверки для того, чтобы убедиться, что функция вызывается только из вашего исполняемого файла:

  • Проверка идентификатора процесса: Сравните идентификатор процесса (PID) вызывающего кода с ожидаемым PID вашего исполняемого файла. Если он не совпадает, можно возвращать ошибку или нулевое значение.

    Пример:

    #include <windows.h>
    
    extern "C" __declspec(dllexport) int read_encryptfile(uint8_t* mbyte, uint32_t* byteLen) {
      // Проверяем идентификатор процесса
      HANDLE hProcess = GetCurrentProcess();
      DWORD processID = GetProcessId(hProcess);
    
      if (processID != EXPECTED_PROCESS_ID) {
          return 0; // Возвращаем 0, если процесс не тот
      }
    
      // Основная логика функции
      int result = ReadmyByte(mbyte, byteLen);
      if (result != 0) {
          std::vector<uint8_t> DencryptedSource = DescryptBytes(mbyte, byteLen);
          result = ReadmyByte(DencryptedSource.data(), DencryptedSource.size());
          CleanDecryptedBytes(DencryptedSource);
      }
    
      return result;
    }

3. Используйте Способы Лицензирования

Можно внедрить проверку лицензии или аутентификации, требуя наличие ключа или токена для доступа к функции. Это поможет убедиться, что только ваши приложения могут выполнять вызовы.

4. Препятствие Хук-методов

Если вам необходимо защитить от хук-методов, используйте методы защиты памяти, такие как:

  • Защита секций памяти: Установите атрибуты защиты на участки памяти, где находится ваш код или данные, чтобы предотвратить изменения извне.

5. Используйте Анонимные Виртуальные Функции

Вы можете рассмотреть использование анонимных вызовов функций (или лямбда-функций в C++) для управления доступом. Однако, это может потребовать изменения архитектуры вашего кода.

6. При этом не забывайте о производительности

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

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...