[Résolu] Batch to C

Batch to C [Résolu] - C - Programmation

Marsh Posté le 15-02-2010 à 02:51:39    

Bonjour,
 
J'ai un fichier .bat que j'aimerai convertir en C, afin de "cacher" mon code.
J'ai trouvé quelques convertisseur sur le net mais les exe produits sont douteux (virus/trojan?!..)
 
J'aimerai alors le faire moi-meme, j'ai tout bêtement pensé à la fonction system() de stdlib.h qui permet cela.
Mon problème est sur la commande 'cd', il ne l'exécute pas :
 

Code :
  1. system("cd" );
  2. system("cd %temp%" );
  3. system("cd" );


Sortie :
 

c:\Users\xxx\Documents\Visual Studio 2008\Projects\bat2exe\bat2exe
c:\Users\xxx\Documents\Visual Studio 2008\Projects\bat2exe\bat2exe


 
Pas de changement de dossier donc..
Avec ca je ne peux pas avancer car mon bat se baladent dans plusieurs dossiers.
Comment faire ?
 
Merci pour votre aide.


Message édité par tabb le 16-02-2010 à 23:57:28
Reply

Marsh Posté le 15-02-2010 à 02:51:39   

Reply

Marsh Posté le 15-02-2010 à 10:48:28    

Essayer avec un nom de répertoire en dur, pour voir si le problème viendrait de %temp%
Essayer chdir() ou _chdir(), voir http://msdn.microsoft.com/en-us/li [...] S.80).aspx


Message édité par olivthill le 15-02-2010 à 10:49:09
Reply

Marsh Posté le 15-02-2010 à 10:52:31    

le pb vient du fait que chaque appel à system se résout dans un bash different quie st perdu à la fin de l'appel.

Reply

Marsh Posté le 15-02-2010 à 11:06:00    

@olivthill : Merci, mais ca ne change rien.
 
@Joel F : Oui c'est surement ca.. Comment faire alors ?!

Reply

Marsh Posté le 15-02-2010 à 11:07:24    

pas utilsiez system mais l'API C de manipulation du chemin courant genre chdir et cie.
 
Sinon en C++, passez par boost::filesystem

Reply

Marsh Posté le 15-02-2010 à 11:13:04    

Un programme ne peut pas changer l'environnement du programme qui l'appelle.  Donc utiliser system ne permet pas de faire ca non plus.  
 
En passant system() qui ne fait que lancer le shell, et comme tes chaines seront en clair, j'ai du mal a voir l'interet -- en fait, si c'est suffisemment complique que pour qu'il y ait un interet a le cacher, je me vois mal ecrire la chose en shell.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 15-02-2010 à 11:32:01    

Ok.
Je vais voir du coté de boost.
 
Comment font les programmes "batch2exe converter" et cie pour faire ce travail alors ?!

Reply

Marsh Posté le 15-02-2010 à 11:33:47    

Il utilise les appels qui vont bien (chdir, putenv ou equivalent, etc...) pour faire ce qui modifie le contexte et ne passent pas par system() pour ca.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 15-02-2010 à 11:42:51    

ah ok. je vais voir de ce coté là.
Et pour répondre à ta question de l'intérêt, c'est parce que mon batch appel entre autre un utilitaire à qui je passe en paramètre mes credentials.
N'importe qui regardant la source de mon batch voit :
call prog.exe -user toto -passwd monPass
 
le programme en question en closed-source je ne peux donc pas le modifier pour y intégrer mes credentials.
C'est pour cela que j'aimerai créer un exécutable afin de masquer ca.

Reply

Marsh Posté le 15-02-2010 à 13:25:40    

Plop,
Sous vista/seven il y a un onglet pour voir les processus en cours, et dans cet onglet il y a une colonne pour voir la ligne de commande qui a servi a créer le processus...
Alors niveau sécurité...
Sinon en C (windows) il y a createprocess ( http://msdn.microsoft.com/en-us/li [...] 85%29.aspx ) qui te permet de lancer programmatiquement un executable (batch compris sans doute) avec arguments, statut initial de la fenêtre...


Message édité par breizhbugs le 15-02-2010 à 13:29:03
Reply

Marsh Posté le 15-02-2010 à 13:25:40   

Reply

Marsh Posté le 15-02-2010 à 13:48:27    

Oui je me doute que niveau sécurité ce n'est pas terrible.
Mais pour l'instant je vais ignorer cette partie là. J'y reviendrai quand mon C/CPP fonctionnera.
 

Citation :

Sinon en C (windows) il y a createprocess


Ok, le C va lancer mon .bat mais le .bat devra toujours etre présent qqpart.. et donc lisible par qqun qui le trouve.

Reply

Marsh Posté le 15-02-2010 à 16:44:48    

OK, donc j'ai créé mon programme en C++ à l'aide de CreateProcess qui appelle mon batch. Mes credentials ne sont plus en clair, c'est déjà ca !
 
Question au passage, quand je lance mon prog en c++ j'ai une fenetre console qui s'ouvre et part, le temps d'appeler le batch quoi.
Comment enlever cet "popup" ?
Merci

Reply

Marsh Posté le 15-02-2010 à 17:25:24    

J'ignore ce que fait ton batch en plus que d'appeler ton programme mais peut-être que tu peut tout convertir en C? (donc dans ce cas, plus de fenêtre console...)
Sinon Pour la fenêtre console, intéresses toi aux paramètres de createprocess notamment a STARTUPINFO.wShowWindow en ayant positionné STARTUPINFO.dwflags comme il faut.
( http://msdn.microsoft.com/en-us/li [...] S.85).aspx )

Reply

Marsh Posté le 15-02-2010 à 17:40:51    

Oui, j'ai déjà cacher la fenetre d'appel au bat grace au STARTUPINFO.wShowWindow etc, ca marche super.
Mais il me reste toujours la fenetre-console de mon programme c++.
 
Quand tu dis convertir en C, tu pense à quoi ?
Mon programme actuel ne fais que CreateProcess pour lancer le batch. 10 ligne de code quoi. Je ne vois pas pourquoi il ouvre une popup pour cela !
Quand j'ai créé mon projet avec VS, j'ai mit "application console", ca viendrai de là ?
il faut mettre quoi ?
 
Je viens de convertir tout en C. La fenetre s'ouvre quand meme..
Merci

Reply

Marsh Posté le 15-02-2010 à 19:01:54    

Je vais essayer d'etre plus précis :)
Voilà le code,
 

Code :
  1. int main(int argc, char * argv[])
  2. {
  3. char cmd[100];
  4. STARTUPINFO   si;
  5. PROCESS_INFORMATION pi;
  6.    
  7. strcpy(cmd, "C:\\MyBatch.bat" );
  8. memset(&si, 0, sizeof(si));
  9. memset(&pi, 0, sizeof(pi));
  10. si.cb = sizeof(si);
  11. si.dwFlags = STARTF_USESHOWWINDOW;   // pour masquer le .bat
  12. si.wShowWindow = SW_HIDE;
  13. CreateProcess(NULL,
  14.  cmd,
  15.  NULL,
  16.  NULL,
  17.  FALSE,
  18.  CREATE_NO_WINDOW,
  19.  NULL,
  20.  NULL,
  21.  &si,
  22.  &pi);
  23. CloseHandle( pi.hProcess );
  24. CloseHandle( pi.hThread );
  25. return 0;
  26. }


 
Voilà, c'est assez bete comme code..
Mais pourquoi m'ouvre-t-il une console ?
Comment l'empecher ?
Merci.  :hello:


Message édité par tabb le 15-02-2010 à 19:02:44
Reply

Marsh Posté le 15-02-2010 à 19:26:18    

tabb a écrit :


Quand tu dis convertir en C, tu pense à quoi ? (1)
 
Mon programme actuel ne fais que CreateProcess pour lancer le batch. 10 ligne de code quoi. Je ne vois pas pourquoi il ouvre une popup pour cela !
Quand j'ai créé mon projet avec VS, j'ai mit "application console", ca viendrai de là ? (2)
il faut mettre quoi ? (3)


 
(1) -> et bien si ton batch ne fait qu'appeler " call prog.exe -user toto -passwd monPass " tu peux directement faire un createprocess sur prog.exe avec les paramètres qui vont bien
Sinon peut etre peut tu faire en C ce que le batch d'autre. Cela aurait l'avantage de te passer complètement du fichier batch, l'inconvénient étant qu'il est parfois pas facile de convertir un batch en C, en qu'en cas de modif simple des action a effectuer faut refaire le programme.
 
(2) -> oui, les programmes consoles sont plus facile à faire mais font apparaitre la console!
 
(3) -> tu peux faire une application windows normale mais sans fenêtre (il n'y a que la déclaration du main qui change quasiment dans ton cas) (si jamais tu as besoin d'afficher quelque chose tu peux utiliser http://msdn.microsoft.com/en-us/li [...] 85%29.aspx  - printf n'affichant rien ~)

Reply

Marsh Posté le 15-02-2010 à 19:45:42    

Mon batch fait d'autres actions, qui ne seront pas facile a convertir en C.

breizhbugs a écrit :

tu peux faire une application windows normale mais sans fenêtre (il n'y a que la déclaration du main qui change quasiment dans ton cas)


Ca m'intéresse,  donc je créé un projet "application windows win32", il me créé une dizaine de fichiers.. quoi modifier et où ?
Merci :)
 

Reply

Marsh Posté le 15-02-2010 à 22:49:36    

J'ai trouvé :  

Code :
  1. int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR args, int show)
  2. {
  3. // code
  4. return 0;
  5. }


 
et voilà pas de fenetre :)

Reply

Marsh Posté le 16-02-2010 à 12:18:40    

:hello:  
Ouais le plus compliqué c'est de virer le code inutile pour la gestion des fenêtres.
 
Résolu alors?

Reply

Marsh Posté le 16-02-2010 à 23:57:04    

Yep =)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed