J'ai développé un projet C ++ avec Visual Studio 2015. La sortie de mon projet est un exécutable unique qui doit avoir un ID unique pour chaque client et cet ID doit être accessible dans le code. Une approche simple consiste simplement à définir une variable constante dans le code et à changer sa valeur pour chaque client et à la construire plusieurs fois, mais j'ai un serveur Linux et je ne suis pas sûr de pouvoir le construire simplement parce que j'ai utilisé de nombreuses bibliothèques Winapi . Je pensais qu'il existe peut-être un autre moyen de modifier ou d'ajouter une valeur constante à la sortie, comme la manipulation de l'exécutable. Par exemple:

#include <string>
#include <iostream>
#include <Windows.h>


const std::string ID = "some unique ID";

int main() {
    std::cout << "Your ID: " << ID << std::endl;
    getchar();
    return(0);
}
6
M. R. 23 mai 2018 à 06:52

3 réponses

Meilleure réponse

Il semble qu'il n'y ait que deux approches. La première consiste simplement à construire le projet dans un environnement Linux, ce qui est une meilleure méthode mais doit être utilisé avec des outils tels que Mono XBuild lien ici. Une autre option qui peut être plus simple consiste simplement à ouvrir le fichier binaire et à manipuler la chaîne spécifique. Comme le commentaire de @aloMalbarez Voici un script simple basé sur ceci. Supposons cet exemple: (j'ai utilisé 50 m s comme longueur fixe pour mon identifiant)

#include <string>
#include <iostream>
#include <Windows.h>

#define ID "mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm"


using namespace std;

int main() {
    cout << "Your ID: " << ID << "\nlen:" << strlen(ID) <<  endl;
    getchar();
    return(0);
}

Après avoir généré l'exécutable, utilisez le script suivant pour créer la sortie. Je ne suis pas un gars de Linux donc vous pouvez m'aider à améliorer cela. ./build.sh input.exe output.exe "myfixedID"

#!/bin/bash
# build.sh input_file output_file <ID>


input_file=$1
output_file=$2
ID=$3


if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ]; then
  echo "wrong parameters"
  echo "build.sh input_file output_file <ID>"
  exit 1
fi

# use fixed string (ID) in the source file
# this creates 50 of "m"s
search_value=$(printf 'm%.0s' {1..50})

extension=".back"
temp_file="$input_file$extension"
tmpstring_file="./tmp"
null_termin='\0'


echo "copying the original file..."
yes | cp -rf $input_file $temp_file

address=$(strings -t d $temp_file | grep $search_value | grep -o '[0-9]*')

echo "Address:"
echo $address
if ! [[ $address =~ ^[0-9]+$ ]]; then
  echo "cannot find valid ID in executable"
  echo "removing temps"
  rm $temp_file
  exit 1
fi


# make the tempstring file
printf "$ID$null_termin" > $tmpstring_file

dd if=$tmpstring_file of=$temp_file obs=1 seek=$address conv=notrunc

echo "make new file"
yes | cp -rf $temp_file $output_file

echo "removing temps"

rm $temp_file $tmpstring_file

echo "Done!"
2
M. R. 24 avril 2019 à 16:07

En fonction d'initialisation de votre programme. Générez un identifiant unique basé sur le hachage SHA-1 de l'heure actuelle, de l'adresse IP, du nom d'utilisateur (même plus). vous pouvez faire ce que vous voulez faire dans ce programme par la suite (c'est-à-dire enregistrer dans la base de données). Ça marchera ?

1
code707 23 mai 2018 à 04:44

Une constante n'est pas une variable, ce sont des types opposés. Une constante est un élément qui se voit attribuer une valeur particulière qui ne change pas, donc le mot constant, inchangé.
Une variable d'autre part est un élément qui est stocké en mémoire comme une valeur modifiable, pendant que votre programme s'exécute, la VARIABLE peut changer sa valeur actuelle.

Dans Visual Studio, vous pouvez créer un fichier de configuration qui transmet les valeurs définies à votre programme, ces valeurs sont variables et peuvent être modifiées par programme et manuellement. Mais, comme vous l'avez dit, vous ne voulez pas d'un fichier séparé pour rechercher des informations.

Si vous souhaitez suivre les utilisateurs par leur ID unique, vous devez disposer d'une base de données quelque part qui puisse enregistrer de nouveaux utilisateurs et émettre un ID unique, ou vous pouvez créer un ID unique basé sur la date et l'heure de création du compte, si vous créez un exécutable unique pour chacun d'eux, les informations de date / heure sont incluses dans les informations de création de fichier, vous utiliseriez donc simplement cela, puisque chaque fichier est créé à une date / heure unique, cela indiquerait toujours l'ID. Vous pouvez conserver le même nom pour chaque fichier, ou incorporer la date / heure dans le nom de fichier, comme myPro20180522183231.exe qui serait l'année 2018 mois 05 jour 22 heure 18 minutes 32 secondes 31 et cela pourrait être confirmé par les informations de date / heure des données de création de fichier.

-4
KeyWizard 23 mai 2018 à 04:26