Shellexec-cmdline : lanceur d'application par la ligne de commande

Soyez le premier à donner votre avis sur cette source.

Vue 10 051 fois - Téléchargée 395 fois

Description

Suite à une question sur le forum de www.cppfrance.com, j'ai fait ce petit bout de code afin de m'exercer en ASM et de répondre par la même occasion a la question posée.

Pour ce qui est de son utilité ce programme permet de lancer des applications via la ligne de commande.
Pour exemple, les autorun des CD ne peuvent lancer que des executables.
Ainsi en appellant depuis l'autorun ce petit programme, vous pourrez lancer tout type de fichier.

ex: ShellExec-CmdLine.exe http://www.asmfr.com d:\programme.exe

Voila à vous d'en faire ce que vous voulez.

Shell

Source / Exemple :


.486 
.model flat, stdcall 
option casemap:none 

include \masm32\include\kernel32.inc 
include \masm32\include\user32.inc
include \masm32\include\shell32.inc

includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\user32.lib
includelib \masm32\lib\shell32.lib

.data?
argc     db    ?
argv     dd    256 dup (?)

.data
szType      db "open",0

.code

start: 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Début de récuperation des arguments passés a la ligne de commande
; Code trouvé sur http://www.asmfr.com
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   call GetCommandLine      ; On récupère la ligne de commande sous forme de chaine
   mov esi, eax             ; On copie le pointeur de début de chaine dans ESI
   lea edi, argv            ; On lie le pointeur de argv dans EDI 
   xor ecx, ecx             ; On met ECX a zéro

   cl_skipspace:
   cmp byte ptr [esi], 0    ; Si on est a la fin de la chaine
   je cl_end                ; On sort
   cmp byte ptr [esi], 32   ; Sinon si le caractère lu n'est pas un espace
   jne cl_findarg           ; On lit l'argument passé en allant jusqu'au prochain espace
   inc esi                  ; On incrémente esi pour se lire le caractere suivant dans ESI
   jmp cl_skipspace         ; On ignore les espaces

   cl_findarg:
   mov eax, esi             ; On copie le pointeur de ESI vers EAX qui correspond au début de l'argument (son premier caractere)
   mov edx, 32              ; On stoque le caractere espace dans EDX ( code ASCII = 32)
   cmp byte ptr [esi], 34   ; On regarde si le premier caractere de l'argument est un guillemet (code ASCII = 34)
   sete cl                  ; Dans ce cas, cl = 1 (sinon cl = 0)
   lea edx, [edx + ecx * 2] ; edx = [espace] ou [guillemet]
   add eax, ecx             ; Si le premier caractere est un guillement, on se déplace d'un caractere

   cl_parsearg:
   inc esi                  ; On passe au caractere suivant
   cmp byte ptr [esi], 0    ; On regarde si on est a la fin de la chaine
   je cl_storelastarg       ; Dans ce cas on stoque le pointeur de début du dernier argument dans le tableau argv
   cmp byte ptr [esi], dl   ; On regarde si le premier caractere de l'argument est un guillemet ou un espace
   jne cl_parsearg          ; Dans le cas contraire on continue a lister et sauvegarder les pointeurs de début de chaque argument
   mov byte ptr [esi], 0    ; Sinon on met un caractere NULL a la fin de l'argument
   stosd                    ; On stoque le pointeur dans argv
   inc argc                 ; On incrémente le compteur (argc)
   inc esi                  ; On récupere le caractere suivant
   jmp cl_skipspace         ; On ignore les espaces jusqu'a l'argument suivant

   cl_storelastarg:
   stosd                    ; On stoque le pointeur dans argv
   inc argc                 ; On incrémente le compteur (argc)

   cl_end:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Fin de récuperation des arguments passés a la ligne de commande
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

   lea esi ,argv           ; On copie l'adresse du premier élement de argv dans esi

;;;;;;;;;;;;;;;;;
; Debut de boucle
;;;;;;;;;;;;;;;;;    
deb_for:  
   cmp argc ,1             ; On compare le nombre d'argument restant à 1
   je fin_for              ; Si il reste 1 argument on sort de la boucle car le dernier argument et le chemin de l'executable
   
   add esi, 4              ; On incrémente esi de 4 octets soit la taille d'un pointeur
   
   push 0
   push 0
   push [esi]
   push offset szType
   push 0
   call ShellExecute       ; On execute l'argument

   dec argc                ; On décremente le nombre d'arguments

   jmp deb_for             ; On revient au début de la boucle
fin_for:   
;;;;;;;;;;;;;;;
; Fin de boucle
;;;;;;;;;;;;;;;    
   

   invoke ExitProcess,0    ; On quitte le programme
end start

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_missym
Messages postés
1
Date d'inscription
dimanche 7 août 2005
Statut
Membre
Dernière intervention
27 décembre 2005
-
Bonjour,
j'ai des infos à te demander au sujet de ce programme, pourrais tu me dire à quelle adresse t'envoyer mes questions?
Merci d'avance
Missym
l0st3d
Messages postés
206
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
13 novembre 2009
-
Oui,Oui un commentaire!
Belle source, bien documenté
parfais pour un petit nouveau (je croie puisque je comprend quelque chose!)

Bravo
Bonne prog
DeAtHCrAsH
Messages postés
2674
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
-
Merci beaucoup pour la note c'est gentil et ca motive.

Shell
DeAtHCrAsH
Messages postés
2674
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
-
Pas de commentaires ?
Peut être que mon programme est tout simplement parfait (:
Bref apparement il n'y a pas souvent de commentaires ou de réactions sur AsmFr.
C'est quand meme dommage.
Je sais pas si c'est pareil sur les autres sites du réseau CS ?!

Shell

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.