Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro Yann
    Ingénieur Radiofréquences
    Inscrit en
    août 2005
    Messages
    194
    Détails du profil
    Informations personnelles :
    Nom : Homme Yann
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : août 2005
    Messages : 194
    Points : 174
    Points
    174

    Par défaut .EXE qui lance un autre exe contenu en lui

    Bonjour,

    Pour un système de mise à jour automatique je cherche à faire la chose suivante :

    Un exécutable qui charge un autre .exe en mémoire, et qui le lance.

    Pour se faire, j'ai utilisé ce code :


    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	STARTUPINFO si;
    	PROCESS_INFORMATION pi;
    	memset(&si,0,sizeof(si));
    	memset(&pi,0,sizeof(pi));
    	si.cb = sizeof(si);
    //	if (CreateProcess(NULL,"element.exe",0,0,FALSE,CREATE_DEFAULT_ERROR_MODE,0,0,&siStartupInfo,&piProcessInfo) != false)
     
    	if (CreateProcess(NULL,"element.aze",0,0,FALSE,CREATE_SUSPENDED,0,0,&si,&pi) != false)
    	{
    		HANDLE buffer;
    		buffer = pi.hProcess;
    		char *buff;
    		buff =(char*) pi.hThread; // tentative de récupérer un pointeur sur le code exécutable : ça ne fonctionne pas :(
    		// attendre la fin de l'execution de l'element.exe
     
    		ResumeThread(pi.hThread);
    		int ExitCode = WaitForSingleObject(pi.hProcess,20000);
     
    		MessageBox(0,"2","mklj",0);
    	}
     
    }
    Sauf que maintenant je voudrais que mon element.exe ( renommé element.aze afin de faire moins "executable" de l'extérieur ) puisse être modifié afin d'empecher son lancement seul ( genre enlever le "MZ" du début de fichier EXE, ou modifier les premiers octets du code exécutable ).

    Est-il possible de récupérer un pointeur sur le code exécutable afin de remettre les premiers octets correctes avant de le lancer.

    Je voudrais vraiment le faire uniquement en mémoire, sans modifier le fichier "avant lancement".

    Est-ce possible ?
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  2. #2
    Expert Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 025
    Points : 12 833
    Points
    12 833

    Par défaut

    Le problème c'est que CreateProcess va échouer si ce n'est pas un executable !

    Si "element.aze" est un exe fait en C++Builder, tu peux dans le WinMain gérer un système pour autoriser le lancement, un échange de message entre les deux Exe par exemple, via Pipe, FileMapping, WM_COPYDATA ...

    Pourquoi ne pas faire une DLL au lieu d'un Exe ?

    Si tu n'es pas l'auteur alors

    Un sujet à lire Comment exécuter du code présent uniquement en mémoire ?
    Ecrire dans la partie segment code au runtime

    Tu peux jouer avec CreateProcess en CREATE_SUSPENDED et WriteProcessMemory comme dans ce source C++
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

    Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !

  3. #3
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro Yann
    Ingénieur Radiofréquences
    Inscrit en
    août 2005
    Messages
    194
    Détails du profil
    Informations personnelles :
    Nom : Homme Yann
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : août 2005
    Messages : 194
    Points : 174
    Points
    174

    Par défaut

    Bonjour Shaï,

    Oui effectivement le code n'est pas de moi.
    J'avais déjà vu les posts sur les DLL sur ce forum mais cela ne correspond malheureusement pas à mon besoin.

    J'essaye d'utiliser la solution "CreateProcess en CREATE_SUSPENDED", modification du contenu de la mémoire, puis lancement du thread.
    J'avais pas mal cherché sur google, je suis tombé sur une personne qui avait réussi à faire ça, mais il n'a pas précisé malheureusement comment il avait écrit en mémoire, je pense que tu as donné une solution avec le "WriteProcessMemory" (et "ReadProcessMemory" j'ai vu aussi).

    Je pense que ce sont les 2 commandes qui peuvent m'aider, cependant je n'ai pas encore compris quels paramètres leur mettre, mais je vais chercher.

    Par contre ce qui m'inquiète le plus, c'est que j'ai reproduis/adapté en C++ builder le code source C++ , en mettant en ressource un .EXE non modifié, il trouve bien la ressource mais au ResumeThread du thread, rien ne se produit ( j'ai pris "notepad.exe" pour tester )

    Bref, j'avance, merci pour le tuyau, je te tiens au courant
    Désolé, on savait pas que c'était impossible, alors on l'a fait

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •