Maison >développement back-end >C++ >Comment pouvons-nous masquer efficacement les chaînes intégrées dans les binaires exécutables ?

Comment pouvons-nous masquer efficacement les chaînes intégrées dans les binaires exécutables ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-01 18:27:15542parcourir

How Can We Effectively Obfuscate Strings Embedded in Executable Binaries?

Obfuscation des chaînes dans le code binaire

Énoncé du problème

L'obscurcissement des chaînes intégrées dans les binaires exécutables est utile pour protéger les informations sensibles telles que les clés de chiffrement contre tout accès non autorisé. Cependant, des méthodes simples telles que le stockage de la chaîne dans un tableau de caractères peuvent facilement révéler son contenu lors de l'analyse.

Solution

Pour masquer efficacement les chaînes dans les binaires compilés, une approche plus sophistiquée peut être utilisée. Prenons l'exemple suivant :

#include "HideString.h"

DEFINE_HIDDEN_STRING(EncryptionKey, 0x7f, ('M')('y')(' ')('s')('t')('r')('o')('n')('g')(' ')('e')('n')('c')('r')('y')('p')('t')('i')('o')('n')(' ')('k')('e')('y'))
DEFINE_HIDDEN_STRING(EncryptionKey2, 0x27, ('T')('e')('s')('t'))

int main()
{
    std::cout << GetEncryptionKey() << std::endl;
    std::cout << GetEncryptionKey2() << std::endl;

    return 0;
}

Ce code intègre une macro personnalisée, "DEFINE_HIDDEN_STRING", pour chiffrer la chaîne donnée. La macro code chaque caractère à l'aide d'une clé unique dérivée de la valeur de départ fournie (par exemple, "Ma clé de cryptage forte" -> 0x7f). Un algorithme de chiffrement basé sur la graine est appliqué à la séquence de caractères, ce qui rend les données résultantes aléatoires et difficiles à identifier dans le binaire compilé.

#define CRYPT_MACRO(r, d, i, elem) (elem ^ (d - i))
#define DEFINE_HIDDEN_STRING(NAME, SEED, SEQ) \
static const char* BOOST_PP_CAT(Get, NAME)() \
{ \
    static char data[] = { \
        BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_FOR_EACH_I(CRYPT_MACRO, SEED, SEQ)), \
        '' \
    }; \
    static bool isEncrypted = true; \
    if (isEncrypted) \
    { \
        for (unsigned i = 0; i < (sizeof(data) / sizeof(data[0])) - 1; ++i) \
        { \
            data[i] = CRYPT_MACRO(_, SEED, i, data[i]); \
        } \
        isEncrypted = false; \
    } \
    return data; \
}

Cette approche obscurcit efficacement les chaînes intégrées dans le code binaire, ce qui les rend difficiles à extraire sans connaître la clé de cryptage et l'algorithme. Il établit un équilibre entre sécurité et facilité d'utilisation, offrant une méthode pratique pour protéger les informations sensibles.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn