Au moment de la compilation de la chaîne de chiffrement
Je ne veux pas l'inverse ingénieurs de lire le texte brut de chaînes codées en dur dans mon application. La solution triviale pour cela est d'utiliser un simple XOR-Chiffrement. Le problème est que j'ai besoin d'un convertisseur et dans mon application, il ressemblera à ceci:
//Before (unsecure)
char * cString = "Helllo Stackoverflow!";
//After (secure)
char * cString = XStr( 0x06, 0x15, 0x9D, 0xD5FBF3CC, 0xCDCD83F7, 0xD1C7C4C3, 0xC6DCCEDE, 0xCBC2C0C7, 0x90000000 ).c();
Est-il possible de maintenir propre code à l'aide de certaines de construction comme
//Before (unsecure)
char * cString = "Helllo Stackoverflow!";
//After (secure)
char * cString = CRYPT("Helllo Stackoverflow!");
Il convient également de travailler de très longues chaînes ( 1000 caractères? 🙂 ). Je vous remercie à l'avance
Eh bien, ne fonctionnera pas si vous l'essayer?
Bien sûr que non. La question est très claire: est-il un mécanisme, éventuellement à l'aide de macros, de - il? Pas une question bête du tout – autant que je sache, il n'existe pas de solution exacte, mais vous pouvez obtenir assez proche à l'aide de modèles.
Ne gardez à l'esprit que ce type de chiffrement est trivial de pause; le contenu de "cString" vont être chiffré lorsque votre programme démarre et visible par toute personne ayant accès à votre RAM. Ce compte même pas que le XOR est trivial de rupture dans et de lui-même.
Je sais, mais vous ne trouverez pas la chaîne à l'aide d'un débogueur, car il ne sera pas séparable de la mémoire ordinaire. C'est déjà tout ce que je veux.
Malheureusement, C++ n'ont pas entièrement Dépendante de Types, de sorte que les chaînes ne peuvent pas être décomposées par le modèle des mécanismes (et bien sûr, ils ne peuvent ni par le préprocesseur, car il ne se fend pas de jetons). Votre meilleur pari est de les avoir définis en externe dans un fichier généré.
Bien sûr que non. La question est très claire: est-il un mécanisme, éventuellement à l'aide de macros, de - il? Pas une question bête du tout – autant que je sache, il n'existe pas de solution exacte, mais vous pouvez obtenir assez proche à l'aide de modèles.
Ne gardez à l'esprit que ce type de chiffrement est trivial de pause; le contenu de "cString" vont être chiffré lorsque votre programme démarre et visible par toute personne ayant accès à votre RAM. Ce compte même pas que le XOR est trivial de rupture dans et de lui-même.
Je sais, mais vous ne trouverez pas la chaîne à l'aide d'un débogueur, car il ne sera pas séparable de la mémoire ordinaire. C'est déjà tout ce que je veux.
Malheureusement, C++ n'ont pas entièrement Dépendante de Types, de sorte que les chaînes ne peuvent pas être décomposées par le modèle des mécanismes (et bien sûr, ils ne peuvent ni par le préprocesseur, car il ne se fend pas de jetons). Votre meilleur pari est de les avoir définis en externe dans un fichier généré.
OriginalL'auteur Listing | 2011-09-01
Vous devez vous connecter pour publier un commentaire.
Ce blog fournit une solution pour la compilation de la chaîne de hachage en C++. Je suppose que le principe est le même. Malheureusement, Vous devez créer un Makro pour chaque longueur de chaîne.
Intéressant entrée de blog. Mais c'est assez complexe et pas vraiment convivial 🙂 je préfère à l'aide d'un analyseur de ... Voir ma réponse
Non, mais le principe serait le même. Au lieu de hachage de la chaîne, vous devez appliquer le chiffrement. Il existe beaucoup d'algorithmes de chiffrement là pour vous d'utiliser. Je suis sûr que vous pouvez adapter l'exemple à vos besoins.
Le blog montre comment le optimizer peut plier une expression dans une constante. Mais le calcul de la valeur de hachage n'est pas une compilation constante de temps (ce qui pourrait être utilisé un modèle de non-type de paramètre, etc.). En conséquence, il est encore à l'optimiseur/compilateur si la chaîne d'entrée s'affiche dans le segment de données ou non. Si je comprends bien l'OP droite, puis il veut une méthode qui garantit que sa sensibilité d'entrée chaînes de caractères peuvent ne pas s'afficher dans le fichier binaire.
en C++11 et C++14, à l'aide de
constexpr
méthodes vous permettent d'utiliser des méthodes régulières pour cela, il ya des contraintes sur ce qu'ils peuvent faire, mais de chiffrement (sans valeurs aléatoires) doit être à l'intérieur de leur atteindre.OriginalL'auteur Constantinius
Solution parfaite n'existe pas, elle est ici.
J'ai aussi pensé que ce n'était pas possible, même si c'est très simple, les gens ont écrit des solutions là où vous avez besoin d'un outil personnalisé pour analyser le construit fichier par la suite et d'analyse pour les chaînes et chiffrer les cordes, comme ça, ce qui n'était pas mauvais mais je voulais un paquet qui est compilé à partir de Visual Studio, et il est possible maintenant!
Ce que vous avez besoin est
C++ 11
(Visual Studio 2015 mise à Jour 1 de la boîte)la magie qui se passe avec cette nouvelle commande
constexpr
Par la magie qui se passe dans cette
#define
Il ne déchiffre pas le XorString au moment de la compilation, seulement au moment de l'exécution, mais il va chiffrer la chaîne uniquement au moment de la compilation, de sorte que les chaînes n'apparaissent pas dans le fichier Exécutable
Il permet d'imprimer
"this string is hidden!"
mais vous ne le trouverez à l'intérieur de fichier Exécutable comme des chaînes de caractères!, vérifiez vous-même avecMicrosoft Sysinternals Strings
programme lien de téléchargement: https://technet.microsoft.com/en-us/sysinternals/strings.aspxLe code source complet est assez grand, mais pourrait facilement être inclus dans un fichier d'en-tête. Mais aussi tout à fait aléatoire de sorte que la chaîne cryptée sorties seront toujours changer à chaque nouvelle compilation, la graine est modifiée en fonction du temps qu'il a fallu rassembler, à peu près solide,la solution parfaite.
Créer un fichier appelé
XorString.h
Il n'y a aucune garantie que la chaîne sera "crypté". Compilateur peut le chiffrer au moment de l'exécution, ou de supprimer cette encrypt().decrypt() parce qu'effectivement c'est un no-op.
OriginalL'auteur SSpoke
Ma solution préférée:
Et ensuite utiliser votre favori langage de script pour générer un fichier source où vous stockez les "crypté" des ressources.
OriginalL'auteur Matthieu M.
C'est une réponse tardive, mais je suis sûr qu'il ya une meilleure solution.
Veuillez vous référer à la accepté de répondre à ici.
Fondamentalement, il montre comment utiliser la ADVobfuscator lib pour obscurcir les cordes aussi simple que:
OriginalL'auteur karliwson
Je pense que vous avez à faire quelque chose comme ce qui est fait lors de l'utilisation de gettext (i18n) :
De gettext, vous utilisez l' _() macro qui est utilisé pour générer le i18ned chaîne dictionnaire et que l'appel de la fonction gettext.
Par la voie, vous avez à gérer i18n trop :), vous aurez besoin de quelque chose comme :
Vous avez à gérer cela avec votre système de construction pour en faire maintenable. Je le fais avec gettext...
Mes 2 cents
Je ne le pense pas, mais je n'ai pas mis beaucoup de sur ce. Ce que je sais c'est que l'internationalisation est fait de cette façon. Je suppose que si quelqu'un a trouvé un moyen de le faire avec le préprocesseur il aurait été utilisé ... Mais on ne sait jamais 🙂
OriginalL'auteur neuro
si vous êtes prêt à utiliser le C++11 caractéristiques, variadic templates peut être utilisé pour faire de la compilation de cryptage des chaînes de longueur variable, un exemple serait cette.
Voir aussi cette, que vous pouvez trouver mieux expliqué.
J'ai fait d'accord, mais tbh, de la compilation de cryptage des chaînes est une perte de temps (le hachage est un peu différent), comme toute personne digne de ce nom peut le décrypter une fois hors et à l'utilisation de la RVA pour relier les deux etc.
Je suis d'accord, le chiffrement est fondamentalement inutile ici.
OriginalL'auteur Necrolis
Si des gens sont intéressé (e) par une simple chaîne de chiffrement. J'ai écrit un exemple de code décrivant la chaîne de l'auto de déchiffrement et d'étiquetage à l'aide d'une MACRO. Externe cryptor code est prévu pour le patch binaire (afin que les chaînes sont cryptées après le programme de compilation). Les cordes sont déchiffrés un à un en mémoire.
http://www.sevagas.com/?String-encryption-using-macro-and
Cela n'empêchera pas de l'inverseur de marche avec un débogueur de trouver éventuellement les cordes, mais il permettra d'éviter les chaînes de liste à partir de l'exécutable et de vidage de mémoire.
OriginalL'auteur sio
Je ne peut pas compiler, le compilateur renvoie d'innombrables erreurs, j'étais à la recherche d'autres solutions pour rapide de chaîne de cryptage et a découvert ce petit jouet https://www.stringencrypt.com (n'était pas dur, 1er résultat dans Google pour le cryptage des chaînes de mots clés).
Voilà comment cela fonctionne:
Exemple de chaîne "StackOverflow est génial!", le code de sortie (à chaque fois qu'il génère du code légèrement différent). Il prend en charge ANSI (char) et UNICODE (wchar_t) type de cordes
ANSI de sortie:
UNICODE de sortie:
Maintenant, je sais que ça peut pas être la solution parfaite, mais il fonctionne pour moi et mon compilateur.
OriginalL'auteur Marco Hastan