Lancer un EXE en mémoire

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Lancer un EXE en mémoire

Message par kwandjeen »

Bonjour en examinant plusieurs code un peu partout sur la toile, j'ai essayé de faire un lancement d'EXE depuis la mémoire car toutes les libs que j'ai trouvé ne sont que pour système 32 bits et je suis en 64 bits.

Code : Tout sélectionner

Structure IMAGE_SECTION_HEADER
          SecName.b[8]
          StructureUnion
             PhysicalAddr.l
             VirtualSize.l
          EndStructureUnion
          VirtualAddress.l
          SizeOfRawData.l
          PointerToRawData.l
          PointerToRelocations.l
          PointerToLinenumbers.l
          NumberOfRelocations.w
          NumberOfLinenumbers.w
          Characteristics.l
       EndStructure
      
        
Procedure run_program(name$,buffer.l)
  Startupinfo.STARTUPINFO
  ProcessInfo.PROCESS_INFORMATION
  Context.CONTEXT
  BaseAddress.i
  addr.i
  Structure IMAGE_SECTION_HEADERS
   sec.IMAGE_SECTION_HEADER[95]
 EndStructure
   *NtHeaders.IMAGE_NT_HEADERS
   *Sections.IMAGE_SECTION_HEADERS
   ret.l
 ZeroMemory_(@Startupinfo,SizeOf(Startupinfo))
 ;CreateProcess, addr myname, 0, 0, 0, 0, CREATE_SUSPENDED, 0, 0, addr sinfo, addr pinfo
 CreateProcess_(@name$,0,0,0,0,CREATE_SUSPENDED, 0, 0,@Startupinfo,@ProcessInfo)
 ZeroMemory_(@Context,SizeOf(context))
 Context\ContextFlags = #CONTEXT_INTEGER
 GetThreadContext_(ProcessInfo\hThread, Context)
 GetModuleHandle_(0)
 ReadProcessMemory_(ProcessInfo\hProcess,Context\Rbx+8,@addr,SizeOf(addr),#Null)
 ZwUnmapViewOfSection_(ProcessInfo\hProcess,addr)
 *adr.IMAGE_DOS_HEADER = Buffer
 *NtHeaders = Buffer + *adr\e_lfanew
 BaseAddress = VirtualAllocEx_(ProcessInfo\hProcess,*NtHeaders\OptionalHeader\ImageBase,*NtHeaders\OptionalHeader\SizeOfImage, #MEM_COMMIT | #MEM_RESERVE, #PAGE_EXECUTE_READWRITE)
 WriteProcessMemory_(ProcessInfo\hProcess,BaseAddress,buffer,*NtHeaders\OptionalHeader\SizeOfHeaders,@ret)
 *Sections = *NtHeaders\OptionalHeader + *NtHeaders\FileHeader\SizeOfOptionalHeader
 For i = 0 To *NtHeaders\FileHeader\NumberOfSections-1
  WriteProcessMemory_(ProcessInfo\hProcess,BaseAddress+*Sections\sec[i]\VirtualAddress,Buffer+*Sections\sec[i]\PointerToRawData,*Sections\sec[i]\SizeOfRawData,@ret)
 Next
                
    WriteProcessMemory_(ProcessInfo\hProcess,Context\Rbx+8,@BaseAddress,SizeOf(BaseAddress),#NUL)
    Context\Rax = BaseAddress + *NtHeaders\OptionalHeader\AddressOfEntryPoint
    Result = SetThreadContext_(ProcessInfo\hThread, Context)
    ResumeThread_(ProcessInfo\hThread)
    ProcedureReturn ProcessInfo\hProcess  
EndProcedure

stream =ReadFile(#PB_Any, GetEnvironmentVariable("windir") + "\notepad.exe")
;size = ?endfile-?startfile
;*buffer = AllocateMemory(size)
;CopyMemory(?startfile,*buffer,size)
  *buffer = AllocateMemory(Lof(stream))
    ReadData(Stream, *Buffer, Lof(Stream))
    CloseFile(stream)
    idprocess = run_program(GetEnvironmentVariable("windir") + "\notepad.exe", *buffer)
    Delay(2000)
    TerminateProcess_(idprocess, 0)
    
    DataSection
      startfile:
      ;IncludeFile "C:\Windows\notepad.exe"
      endfile:
    EndDataSection
    
Ce code fonctionne quand je lis un fichier. Par contre je n'arrive pas à lancer un fichier que je mets en includefile. :cry:
Je suis preneur d'un petit tuyau ? :D
El Papounet
Messages : 57
Inscription : mer. 09/juin/2010 23:47

Re: Lancer un EXE en mémoire

Message par El Papounet »

Un bout de code de hipy001 du forum anglais adapté pour fonctionner sous Seven x64

Code : Tout sélectionner

EnableExplicit

Structure IMAGE_SECTION_HEADER
	SecName.b[8]
	StructureUnion
		PhysicalAddr.l
		VirtualSize.l
	EndStructureUnion
	VirtualAddress.l
	SizeOfRawData.l
	PointerToRawData.l
	PointerToRelocations.l
	PointerToLinenumbers.l
	NumberOfRelocations.w
	NumberOfLinenumbers.w
	Characteristics.l
EndStructure

Structure IMAGE_SECTION_HEADERS
	ish.IMAGE_SECTION_HEADER[95]
EndStructure

Procedure EndThread(hProcess.i, hThread.i)

	TerminateProcess_(hProcess, #NUL)
	CloseHandle_(hThread)
	CloseHandle_(hProcess)

EndProcedure

Procedure RunPE(*BinaryImage, CommandLine.s)
 	
 	Protected *tIMAGE_DOS_HEADER.IMAGE_DOS_HEADER = *BinaryImage
	Protected *tIMAGE_SECTION_HEADERS.IMAGE_SECTION_HEADERS
	Protected tPROCESS_INFORMATION.PROCESS_INFORMATION
	Protected *tIMAGE_NT_HEADERS.IMAGE_NT_HEADERS
	Protected tSTARTUPINFO.STARTUPINFO
	Protected BaseAddress.i
	Protected tCONTEXT.CONTEXT
	Protected Buffer.i, NumberOfBytesWritten.l, i.l

	If *BinaryImage
		CreateProcess_(#NUL, ProgramFilename() + " " + CommandLine, #NUL, #NUL, #False, #CREATE_SUSPENDED, #NUL, #NUL, @tSTARTUPINFO, @tPROCESS_INFORMATION)
		tCONTEXT\ContextFlags = #CONTEXT_INTEGER
 		If GetThreadContext_(tPROCESS_INFORMATION\hThread, tCONTEXT) = 0
 			EndThread(tPROCESS_INFORMATION\hProcess, tPROCESS_INFORMATION\hThread)
 			ProcedureReturn
 		
 		EndIf
	
		ReadProcessMemory_(tPROCESS_INFORMATION\hProcess, tCONTEXT\Rdx + 16, @Buffer, 8, #NUL)
		If ZwUnmapViewOfSection_(tPROCESS_INFORMATION\hProcess, Buffer)
			EndThread(tPROCESS_INFORMATION\hProcess, tPROCESS_INFORMATION\hThread)
 			ProcedureReturn
		
		EndIf
		*tIMAGE_NT_HEADERS = *BinaryImage + *tIMAGE_DOS_HEADER\e_lfanew
		BaseAddress = VirtualAllocEx_(tPROCESS_INFORMATION\hProcess, *tIMAGE_NT_HEADERS\OptionalHeader\ImageBase, *tIMAGE_NT_HEADERS\OptionalHeader\SizeOfImage, #MEM_COMMIT|#MEM_RESERVE, #PAGE_EXECUTE_READWRITE)
		WriteProcessMemory_(tPROCESS_INFORMATION\hProcess, BaseAddress, *BinaryImage, *tIMAGE_NT_HEADERS\OptionalHeader\SizeOfHeaders, @NumberOfBytesWritten)
	
		*tIMAGE_SECTION_HEADERS = *tIMAGE_NT_HEADERS\OptionalHeader + *tIMAGE_NT_HEADERS\FileHeader\SizeOfOptionalHeader
		For i = 0 To *tIMAGE_NT_HEADERS\FileHeader\NumberOfSections - 1
			WriteProcessMemory_(tPROCESS_INFORMATION\hProcess, BaseAddress + *tIMAGE_SECTION_HEADERS\ish[i]\VirtualAddress, *BinaryImage + *tIMAGE_SECTION_HEADERS\ish[i]\PointerToRawData, *tIMAGE_SECTION_HEADERS\ish[i]\SizeOfRawData, @NumberOfBytesWritten)
	
		Next
	
		WriteProcessMemory_(tPROCESS_INFORMATION\hProcess, tCONTEXT\Rdx + 16, @BaseAddress, 8, #NUL)
		tCONTEXT\Rcx = BaseAddress + *tIMAGE_NT_HEADERS\OptionalHeader\AddressOfEntryPoint
		SetThreadContext_(tPROCESS_INFORMATION\hThread, tCONTEXT)
		ResumeThread_(tPROCESS_INFORMATION\hThread)
		
	EndIf
	
EndProcedure

RunPE(?file, "")

DataSection
	file: IncludeBinary "c:\windows\notepad.exe"
EndDataSection
Dernière modification par El Papounet le dim. 10/juil./2011 11:27, modifié 1 fois.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Lancer un EXE en mémoire

Message par Kwai chang caine »

Bonjour à vous

J'aurais une question, car j'ai pas vraiment compris :(
Quand vous parlez de "lancer un EXE en mémoire", ça veut dire quoi exactement ???
Car un exe se lance bien toujours en mémoire non ??

N'est ce pas plutôt, lancer un exe inclus dans un autre ???
Ou alors j'ai encore rien compris, comme dab :oops:

Merci 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Lancer un EXE en mémoire

Message par Backup »

non là, il veut lancer un exécutable qui serai inclus

mais sans ecrire celui-ci sr le disque préalablement ..
comme si tu avait l’exécutable dans un sous programme
et que tu lancerai avec Gosub ...


du reste, c'est les bases pour un virus ...
c'est ce qui m’inquiète là dedans ...

perso , mon prg "pond" l'executable , et le lance
ça fait un passage par le disque ...

mais eux veulent l'executer directement a partir de la Ram
je sus pas sur que le prg ne soit pas considéré comme un virus par les Anti-Virus ... mais bon
peut etre qu'en cryptant l’exécutable inclu ....

... je suis pas sur que ce soit bien de donner la soluce sur un forum publique ...
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Lancer un EXE en mémoire

Message par Kwai chang caine »

Aaaahh d'accord !!! 8O
Merci beaucoup DOBRO pour l'explication 8)

J'comprenait pas bien l'interet :roll:
T'es un peu comme moi..tu vois le mal partout :oops:
Mais bon t'as raison, si c'est ce que tu dit....

D'un autre coté, c'est cool comme truc
J'comprend ce que tu veux dire....
il suffirait de creer du code malfaisant, et d'inclure un exe bien connu et clean.
Renommer cet exe avec le nom de l'exe clean d'origine.....

Remarque d'un autre coté, y'a tellement de codes qui pourraient être détournés pour être un virus :roll:
Difficile de bloquer ce genre de codes, surtout qu'ils doivent aussi avoir d'autres utilités.... non ????
J'sais pas laquelle...peut etre Kandjeen et El papounet pourraient nous en donner ???? :roll:

J'savais pas comment y faisaient "les vilains" :?
Encore merci pour ta reponse
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Re: Lancer un EXE en mémoire

Message par kwandjeen »

Point de virus ne t'inquiète pas Dobro :wink:

Je vous explique pourquoi.
Un ami veut faire un site ou les gens peuvent déposer leur logiciels mais limité dans le temps afin de les rémunérer.Si le logiciel plaît à l'utilisateur il choisi de donner 1 euro symbolique pour le programmeur et obtiens une version non bridé.
Il m'a demandé comment faire et je me suis dit qu'en lançant un executable en mémoire sans qu'il soit écrit sur le disque et en maitrisant la durée d'utilisation du logiciel ce serait bien pour lui.

Merci el papounet pour le code je vais regarder ça à tête reposé :D

Edit : Je ne pense pas que les codeurs de virus se servent de Purebasic :wink:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Lancer un EXE en mémoire

Message par Anonyme2 »

El Papounet, le code ne fonctionne pas en 64 bits sous seven PRO sur mon portable.

L'API WriteProcessMemory_() dans la boucle échoue avec l'erreur système 487, ERROR_INVALID_ADDRESS.
Si je met les droits admins, j'ai une fenêtre qui me dit que cela n'a pas pu démarrer.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Lancer un EXE en mémoire

Message par graph100 »

perso j'ai un problème de structure avec CONTEXT:
-> tCONTEXT\Rdx : champs de structure introuvable
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
El Papounet
Messages : 57
Inscription : mer. 09/juin/2010 23:47

Re: Lancer un EXE en mémoire

Message par El Papounet »

Denis a écrit :El Papounet, le code ne fonctionne pas en 64 bits sous seven PRO sur mon portable.

L'API WriteProcessMemory_() dans la boucle échoue avec l'erreur système 487, ERROR_INVALID_ADDRESS.
Si je met les droits admins, j'ai une fenêtre qui me dit que cela n'a pas pu démarrer.
C'est effectivement bizarre, ça ne semble pas fonctionner sous Seven Pro. Je suis sous une version Ultimate.
J'ai quand même pu faire le test sur une version pro mais en vain...

Le problème est le même avec un script Autoit que l'on peut trouver ici: http://www.autoitscript.com/forum/topic ... un-binary/.

Désolé, j'avoue ne pas pouvoir expliquer le pourquoi de la chose.
Je me suis simplement contenter d'adapter un code pour qu'il fonctionne avec un OS 64bits.
graph100 a écrit :perso j'ai un problème de structure avec CONTEXT:
-> tCONTEXT\Rdx : champs de structure introuvable
Je pense que c'est parce que tu compiles en 32bits. La structure CONTEXT est différente (64bits =>Rdx / 32bits => Ebx)
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Re: Lancer un EXE en mémoire

Message par kwandjeen »

sous Seven Ulti ça fonctionne chez moi.

Comme le dit elpapounet les registre RDX,RAX etc sont EDX, EAX en 32 bits
Répondre