Précédent   Forum du club des développeurs et IT Pro > C et C++ > Outils pour C & C++ > C++Builder
C++Builder Environnement de développement RAD C++Builder. Avant de poster -> F.A.Q C++Builder, Sources C++Builder
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 17/01/2013, 14h11   #1
Argol_Medusa
Membre habitué
 
Avatar de Argol_Medusa
 
Homme Yann
Ingénieur Radiofréquences
Inscription : août 2005
Messages : 154
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 : 154
Points : 144
Points : 144
Envoyer un message via MSN à Argol_Medusa
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
Argol_Medusa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2013, 16h49   #2
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 202
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

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

Informations forums :
Inscription : juillet 2006
Messages : 9 202
Points : 13 255
Points : 13 255
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é !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2013, 21h28   #3
Argol_Medusa
Membre habitué
 
Avatar de Argol_Medusa
 
Homme Yann
Ingénieur Radiofréquences
Inscription : août 2005
Messages : 154
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 : 154
Points : 144
Points : 144
Envoyer un message via MSN à Argol_Medusa
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
Argol_Medusa est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h42.


 
 
 
 
Partenaires

Hébergement Web