Question

Je développe une bibliothèque qui utilise un ou plusieurs exécutables auxiliaires dans le cadre de ses activités. Mon implémentation actuelle nécessite que l'utilisateur ait l'exécutable d'assistance installé sur le système dans un emplacement connu. Pour que la bibliothèque fonctionne correctement, l'application d'aide doit être au bon endroit et avoir la bonne version.

Je voudrais supprimer l'obligation de configurer le système de la manière décrite ci-dessus.

Existe-t-il un moyen de regrouper l’exécutable d’aide dans la bibliothèque de telle sorte qu’il puisse être décompressé au moment de l’exécution, installé dans un répertoire temporaire et utilisé pendant la durée d’une exécution? À la fin de l’exécution, l’exécutable temporaire pourrait être supprimé.

J'ai envisagé de générer automatiquement un fichier contenant un tableau de caractères non signé qui contient le texte de l'exécutable. Cela serait fait à la compilation dans le cadre du processus de construction. Au moment de l'exécution, cette chaîne serait écrite dans un fichier, créant ainsi l'exécutable.

Serait-il possible de faire une telle tâche sans écrire l'exécutable sur un disque (peut-être une sorte de disque RAM)? Je pouvais envisager que certains antivirus et d’autres logiciels de sécurité s’opposent à une telle opération. Y a-t-il d'autres préoccupations pour lesquelles je devrais m'inquiéter?

La bibliothèque est en cours de développement en C / C ++ pour une utilisation multiplateforme sous Windows et Linux.

Était-ce utile?

La solution

Vous pouvez utiliser xxd pour convertir un fichier binaire en fichier d'en-tête C.

$ echo -en "\001\002\005" > x.binary

$ xxd -i x.binary 
unsigned char x_binary[] = {
  0x01, 0x02, 0x05
};
unsigned int x_binary_len = 3;

objcopy est assez standard sur les systèmes * nix et est disponible sous Windows avec Cygwin ou MinGW, ou Vim l'inclut également dans le programme d'installation standard. C’est un moyen extrêmement multiplateforme d’inclure des données binaires dans du code compilé.

Une autre approche consiste à utiliser <= > pour ajouter des données à la fin d'un fichier exécutable - IIRC vous pouvez obtenir fread et utilisez-le pour les PE sur Windows.

Une approche que j’aime un peu mieux que cela consiste à simplement ajouter des données brutes directement à la fin de votre fichier exécutable. Dans l'exécutable, vous recherchez la fin du fichier et vous lisez un nombre indiquant la taille des données binaires attachées. Ensuite, vous recherchez en arrière autant d'octets et <=> ces données que vous copiez dans le système de fichiers, où vous pouvez les traiter comme un fichier exécutable. Ceci est d'ailleurs comme beaucoup, sinon Tous les fichiers exécutables à extraction automatique sont créés .

Si vous ajoutez les données binaires, cela fonctionne à la fois avec les fichiers Windows PE et les fichiers * nix ELF - aucun d'entre eux ne lisant au-delà de la " limite " de l'exécutable.

Bien sûr, si vous devez ajouter plusieurs fichiers, vous pouvez soit ajouter un fichier tar / zip à votre fichier EXE, soit vous aurez besoin d'une structure de données légèrement plus avancée pour lire ce qui a été ajouté.

Vous voudrez probablement aussi UPX vos exécutables avant de les ajouter.

Vous pouvez également être intéressé par la bibliothèque LZO , qui serait une des bibliothèques de compression les plus rapides à décompresser. Ils ont une bibliothèque MiniLZO que vous pouvez utiliser pour un décompresseur très léger. Cependant, les bibliothèques LZO sont sous licence GPL, de sorte que pourrait signifier que vous ne pouvez pas l'inclure dans votre code source à moins que votre code ne soit également sous GPL. Par ailleurs, des licences commerciales sont disponibles.

Autres conseils

  

& "Une personne intelligente résout un problème." UNE   Un sage l’évite. " & # 8212; Albert Einstein

Dans l'esprit de cette citation, je vous recommande de simplement regrouper cet exécutable avec l'application finale.

Seulement mes 2 centimes.

Une approche légèrement différente de celle qui consiste à utiliser un tableau char non signé * consiste à placer l'ensemble du binaire exécutable en tant que ressource de la dll. Au moment de l'exécution, vous pouvez enregistrer les données binaires en tant que fichier temporaire local et exécuter l'application. Je ne sais pas s'il existe un moyen d'exécuter un exécutable en mémoire, cependant.

  

Pour que la bibliothèque fonctionne correctement   l'application d'aide doit être dans le bon   emplacement

Sous Windows, s'agirait-il du répertoire Program Files ou du répertoire System32?

Cela pourrait être un problème. Lorsqu'une application est installée, en particulier dans un environnement d'entreprise, cela se produit généralement dans un contexte doté de droits d'administration. Sous Vista et versions ultérieures avec UAC activé (par défaut), il est nécessaire d'écrire dans certains répertoires. Et la plupart des versions Unix ont des restrictions sensibles comme ça depuis aussi longtemps que l’on se souvient.

Ainsi, si vous essayez de le faire au moment où l'application hôte appelle votre bibliothèque, il se peut que le contexte dans lequel il se trouve ne dispose pas de droits suffisants pour installer les fichiers. Votre bibliothèque imposerait donc des contraintes à l'application hôte.

(Une autre chose à exclure concerne les modifications du registre ou les mises à jour des fichiers de configuration sur les divers Unices, si l'application hôte n'a pas la capacité d'élever le processus à un niveau administratif.)

Cela dit, vous dites que vous envisagez de décompresser les assistants dans un répertoire temporaire, alors tout est peut-être discutable.

Qt dispose d'une excellente méthode pour y parvenir: QResource

" Le système de ressources Qt est un mécanisme indépendant de la plate-forme permettant de stocker des fichiers binaires dans l'exécutable de l'application. "

Vous ne dites pas si vous utilisez actuellement Qt, mais vous dites & "C ++ pour une utilisation multiplateforme sous Windows et Linux &" ;, même si vous ne l'utilisez pas, vous peut vouloir envisager de commencer.

Il existe un moyen dans Windows d'exécuter un exécutable à partir de la mémoire sans l'écrire sur le disque. Le problème est qu’en raison des systèmes de sécurité modernes (DEP), cela ne fonctionnera probablement pas sur tous les systèmes et presque tout scanner d’anti-malware le détectera et avertira l’utilisateur.

Mon conseil est de simplement intégrer l'exécutable dans votre distribution, c'est certainement le moyen le plus fiable pour y parvenir.

Bien, ma première pensée serait: qu'est-ce que cet exécutable auxiliaire ne pourrait pas faire dans le code même de votre bibliothèque, peut-être en utilisant un thread secondaire si nécessaire. Cela pourrait être quelque chose à considérer.

Mais comme pour la question actuelle ... Si votre " bibliothèque " est en fait une dll (ou même un exe) alors au moins Windows supporte relativement facilement l'intégration de fichiers dans votre bibliothèque.

Le mécanisme de ressources permettant d'intégrer des informations de version et des icônes dans des fichiers exécutables peut également autoriser des fragments de données arbitraires. Puisque je ne sais pas quel environnement de développement vous utilisez, je ne peux pas dire exactement comment faire cela. Mais en gros, vous devez créer une ressource personnalisée avec un type de & "FILE &"; ou quelque chose de sensé comme ça et pointez-le sur l'exe que vous voulez intégrer.

Ensuite, lorsque vous voulez l'extraire, vous écrivez quelque chose comme

HRSRC hResource = FindResource(NULL, MAKEINTRESOURCE(IDR_MY_EMBEDDED_FILE), "FILE");
HGLOBAL hResourceData = LoadResource(NULL, hResource);
LPVOID pData = LockResource(hResourceData);
HANDLE hFile = CreateFile("DestinationPath\\Helper.exe", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dwBytesWritten = 0;
WriteFile(hFile, pData, SizeofResource(NULL, hResource), &dwBytesWritten, NULL);
CloseHandle(hFile);

(en indiquant votre chemin souhaité, votre nom de fichier et toute vérification d'erreur appropriée bien sûr)

Après cela, l'exécutable assistant existe sous la forme d'un fichier exe normal et vous pouvez donc l'exécuter comme vous le feriez normalement.

Pour supprimer le fichier après utilisation, vous devez examiner les indicateurs pour CreateFile, en particulier FILE_FLAG_DELETE_ON_CLOSE. Vous pouvez également envisager d'utiliser MoveFileEx lorsque vous associez l'indicateur MOVEFILE_DELAY_UNTIL_REBOOT à NULL transmis pour le nouveau nom de fichier. Et bien sûr, vous pouvez toujours le supprimer dans votre propre code si vous savez quand le fichier exécutable est terminé.

Je ne connais pas suffisamment les exécutables Linux, donc je ne sais pas si une fonctionnalité similaire est disponible sur ce site.

Si Linux ne fournit pas de mécanisme pratique et / ou si cette idée ne répond pas à vos besoins sous Windows, alors je suppose que votre idée de générer un tableau de caractères non signé à partir du contenu du fichier EXE assistant serait la meilleure solution façon d'intégrer l'exe dans votre bibliothèque.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top