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

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

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.