IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Exécuter une ressource incorporée.


Sujet :

C#

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2007
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 677
    Par défaut Exécuter une ressource incorporée.
    Bonjour à tous,

    Je reviens une nouvelle fois vers vous, mais cette fois c’est davantage pour lever un (petit) doute sur la faisabilité d’une chose.

    Tout d’abord, le contexte :
    J’ai un programme c# dans lequel est incorporé en ressource un exécutable crypté. Le but étant d’exécuter cet exécutable (oui jusque là, rien d’extraordinaire), mais sans l’extraire sur le disque.. et là, c’est déjà beaucoup plus délicat (à mon avis pas faisable).

    En gros, la question est : peut-on, depuis un programme c#, lancer un exécutable qui est en mémoire ?

    S’il est confirmé qu’un programme ne peut être lancé que depuis un disque, j’ai toujours la piste de compiler dynamiquement une ressource incorporée, mais ça ne m’emballe que moyennement.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Par défaut
    Salut,

    Je ne connais pas de solution de faire cela. Il y a bien eu une évolution en .NET 4 avec les "memory mapped files" mais c'est pour la lecture/écriture uniquement (ce qui est déjà très bien).

    En solution de contournement, tu peux essayer de faire un wrapper qui copie ton exe dans un répertoire temporaire pour l'exécution (attention aux droits) puis le supprime à la fin du traitement. Qu'en penses tu ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2007
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 677
    Par défaut
    Effectivement la version actuelle de mon programme extrait tout simplement le flux de mon binaire sur le disque (après avoir décrypté ledit flux), et exécute via un bête Process l’exécutable créé.
    Ça c’est fait, et ça fonctionne parfaitement.. mais ça ne convient pas à mon « client » qui ne souhaite pas voir la création d’un nouvel exécutable sur son unité (pour des raisons qui le regarde après tout), et ce même s’il est supprimé après coup.

    Je vais donc devoir faire évoluer mon programme sous peu, et si la piste de l’exécution d’un exécutable en mémoire n’aboutit à rien, je vais opter pour la compilation dynamique du code source (incorporée en ressource et crypté) du programme à exécuter.

    Cela dit, ton histoire "memory mapped files" du prochain Framework titille ma curiosité =D . Ça peut être une autre piste (car ce projet risque de s’étaler un peu sur l’année, du coup j’ai le temps de voir venir la bête).

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Par défaut
    Salut,
    dans mes souvenir, sous DOS (ouai c'est loin)
    on pouvait créer un RAMDrive (un disque dur dans la RAM avec sa lettre et tout)
    un pote s'amusait même à charger ses jeux dans son disque en RAM et les lancer de là...

    je ne sais pas quel programme permet ça aujourd'hui mais ça pourrait peut être te convenir...

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2007
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 677
    Par défaut
    ^^
    J’ai fait ça dans un passé beaucoup moins lointain (mais lointain quand même hein.. on parle de windows 98 >.< ). Je créais un Ramdrive sur lequel pointaient tous mes fichiers temporaires et autre cache internet (pourquoi pas hein). A chaque redémarrage, j’étais « clean » (la bonne époque où chaque octet comptait).

    Bref.. je ne sais pas vraiment si je vais pouvoir creuser de ce coté dans le cadre de mon projet (mais je ne vais pas m’avancer pour autant, avant d’avoir posé la question.. ).

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 19
    Par défaut re.
    Réponse oui, on peut facilement lancer un binaire en mémoire à partir de C#:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    byte[] data;
     
    // Chargement de ton assembly (ton binaire) dans le tableau 'datas'
    // Puis ....
     
    // Tentative de chargement de l'assembly
    assembly = Assembly.Load(datas);
    // Vérification si le point d'entrée nous renvoie bien un Type
    type = assembly.EntryPoint.ReturnType;
     
    if (type != null)
    {
       // Lancement du programme 
       object obj = assembly.CreateInstance(assembly.EntryPoint.Name);
       // Appel de la méthode d'entrée de l'assembly et attente jusqu'à ce que le 
       // programme chargé en mémoire se termine  
       assembly.EntryPoint.Invoke(obj, BindingFlags.InvokeMethod, null, null, null);
       assembly = null;
    }
    else
    {
      MessageBox.Show("Données corrompues ou incompatibles", "Erreur",  MessageBoxButtons.OK, MessageBoxIcon.Stop);
    }

    PS: L'assembly chargée en mémoire ne sera réellement déchargée que lorsque le programme qui a lancé l'assembly sera terminée.

    @++

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Par défaut
    Citation Envoyé par vincentbo Voir le message
    Réponse oui, on peut facilement lancer un binaire en mémoire à partir de C#:


    byte[] data;

    // Chargement de ton assembly (ton binaire) dans le tableau 'datas'
    // Puis ....

    // Tentative de chargement de l'assembly
    assembly = Assembly.Load(datas);
    // Vérification si le point d'entrée nous renvoie bien un Type
    type = assembly.EntryPoint.ReturnType;

    if (type != null)
    {
    // Lancement du programme
    object obj = assembly.CreateInstance(assembly.EntryPoint.Name);
    // Appel de la méthode d'entrée de l'assembly et attente jusqu'à ce que le
    // programme chargé en mémoire se termine
    assembly.EntryPoint.Invoke(obj, BindingFlags.InvokeMethod, null, null, null);
    assembly = null;
    }
    else
    {
    MessageBox.Show("Données corrompues ou incompatibles", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    }


    PS: L'assembly chargée en mémoire ne sera réellement déchargée que lorsque le programme qui a lancé l'assembly sera terminée.

    @++
    Je garde ta proposition dans mes cartons mais elle ne permet de lancer que des assembly DotNet. Ce post fait référence je pense à tout type d'exe.

Discussions similaires

  1. Charger une police depuis ressource incorporée
    Par Xdjack dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/11/2008, 09h07
  2. [VB6] Exécuter une macro Access
    Par Nektanebos dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 22/02/2006, 16h32
  3. [Reflection] Exécuter une méthode donnée d'une classe
    Par schousso dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 03/06/2004, 10h35
  4. Accès à une ressource ?
    Par Neilos dans le forum C++Builder
    Réponses: 2
    Dernier message: 20/03/2004, 16h29
  5. Inclure une dll dans une ressource
    Par bgcode dans le forum C++Builder
    Réponses: 4
    Dernier message: 21/08/2003, 11h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo