Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3071 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [Résolu] Batch to C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] Batch to C

n°1965952
tabb
Posté le 15-02-2010 à 02:51:39  profilanswer
 

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
mood
Publicité
Posté le 15-02-2010 à 02:51:39  profilanswer
 

n°1965993
olivthill
Posté le 15-02-2010 à 10:48:28  profilanswer
 

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
n°1965997
Joel F
Real men use unique_ptr
Posté le 15-02-2010 à 10:52:31  profilanswer
 

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

n°1966009
tabb
Posté le 15-02-2010 à 11:06:00  profilanswer
 

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

n°1966011
Joel F
Real men use unique_ptr
Posté le 15-02-2010 à 11:07:24  profilanswer
 

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

n°1966016
Un Program​meur
Posté le 15-02-2010 à 11:13:04  profilanswer
 

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)
n°1966033
tabb
Posté le 15-02-2010 à 11:32:01  profilanswer
 

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

n°1966035
Un Program​meur
Posté le 15-02-2010 à 11:33:47  profilanswer
 

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)
n°1966046
tabb
Posté le 15-02-2010 à 11:42:51  profilanswer
 

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.

n°1966088
breizhbugs
Posté le 15-02-2010 à 13:25:40  profilanswer
 

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
mood
Publicité
Posté le 15-02-2010 à 13:25:40  profilanswer
 

n°1966098
tabb
Posté le 15-02-2010 à 13:48:27  profilanswer
 

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.

n°1966172
tabb
Posté le 15-02-2010 à 16:44:48  profilanswer
 

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

n°1966195
breizhbugs
Posté le 15-02-2010 à 17:25:24  profilanswer
 

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 )

n°1966207
tabb
Posté le 15-02-2010 à 17:40:51  profilanswer
 

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

n°1966248
tabb
Posté le 15-02-2010 à 19:01:54  profilanswer
 

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
n°1966253
breizhbugs
Posté le 15-02-2010 à 19:26:18  profilanswer
 

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 ~)

n°1966264
tabb
Posté le 15-02-2010 à 19:45:42  profilanswer
 

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 :)
 

n°1966351
tabb
Posté le 15-02-2010 à 22:49:36  profilanswer
 

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 :)

n°1966472
breizhbugs
Posté le 16-02-2010 à 12:18:40  profilanswer
 

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

n°1966680
tabb
Posté le 16-02-2010 à 23:57:04  profilanswer
 

Yep =)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [Résolu] Batch to C

 

Sujets relatifs
Aide Programmation C Arguments[Résolu] [Access2007] Création requete complexe
[ KSH ] Etrange comportement d'un while dans un for - RESOLU -Identification utilisateur en C#
Mastermind en algo puis en CComparaison VB 6.0 / C#
[resolu] recherche et insertion structure liste chaine: la V2[Batch] Extraire dans un nom complet de fichier UNC le nom du fichier
[BATCH]Ping avec variable[C++] Spécialisation d'une fonction template un peu tordue...
Plus de sujets relatifs à : [Résolu] Batch to C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR