Page 1 sur 1

Exe en data Section: Lancer un exécutable en mémoire.

Publié : lun. 18/août/2014 16:18
par falsam
Cet exemple permet de lancer en mémoire un exécutable figurant en data section sans avoir au préalable enregistrer sur le disque de l'utilisateur l'éxécutable figurant dans la data section. (Vue sur le forum anglais)

■ Créer un dossier. Enregistrer et créer un exécutable de ce bout de code qui sera l'exécutable à lancer en mémoire sans l'installer sur le disque de l'utilisateur. (demo.exe)

Code : Tout sélectionner

Enumeration
  #Mainform
EndEnumeration

Define.l Event, GEvent

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered

Procedure Open_MainForm()
  OpenWindow(#Mainform, 0, 0, 300, 200, "Demo", WindowStyle)
EndProcedure

Open_MainForm()

Repeat
  Event  = WaitWindowEvent(10)
  GEvent = EventGadget()
  Select Event
    Case #PB_Event_Gadget
      Select GEvent
      EndSelect
        
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
■ Enregistrer maintenant le lanceur dans le même dossier. Créer ensuite un exécutable que vous enregistrerez dans un autre dossier (ou sur le bureaeu)

Code : Tout sélectionner

;http://forums.purebasic.com/english/viewtopic.php?p=311116&sid=71318ad4a9f408ffe97d5eb450eef191#p311116
EnableExplicit 

Enumeration 
  #btn1 
EndEnumeration 

Define.l Event, EventGadget, EventGadget, EventWindow 

Procedure RunPE(lBuff, parameters.s) 
  Protected *idh.IMAGE_DOS_HEADER  = lBuff 
  Protected *ish.IMAGE_SECTION_HEADERS 
  Protected pi.PROCESS_INFORMATION 
  Protected *inh.IMAGE_NT_HEADERS 
  Protected si.STARTUPINFO 
  Protected lpBaseAddres.l 
  Protected Ctx.CONTEXT 
  Protected Addr.l, RET.l, i.l 

  CreateProcess_(#NUL, ProgramFilename() + " " + parameters, #NUL, #NUL, #False, #CREATE_SUSPENDED, #NUL, #NUL, @si, @pi) 
  Ctx\ContextFlags = #CONTEXT_INTEGER 
  If GetThreadContext_(pi\hThread, Ctx) = 0      : Goto EndThread : EndIf 

  ReadProcessMemory_(pi\hProcess, Ctx\Ebx + 8, @Addr, 4, #NUL) 
  If ZwUnmapViewOfSection_(Pi\hProcess, Addr)    : Goto EndThread : EndIf 
  If lBuff = 0                                   : Goto EndThread : EndIf 
  *inh = lBuff + *idh\e_lfanew 

  lpBaseAddres = VirtualAllocEx_(pi\hProcess, *inh\OptionalHeader\ImageBase, *inh\OptionalHeader\SizeOfImage, #MEM_COMMIT | #MEM_RESERVE, #PAGE_EXECUTE_READWRITE) 
  WriteProcessMemory_(pi\hProcess, lpBaseAddres, lBuff, *inh\OptionalHeader\SizeOfHeaders, @ret) 
  *ish = *inh\OptionalHeader + *inh\FileHeader\SizeOfOptionalHeader 

  For i = 0 To *inh\FileHeader\NumberOfSections - 1 
    WriteProcessMemory_(pi\hProcess, lpBaseAddres + *ish\ish[i]\VirtualAddress, lBuff + *ish\ish[i]\PointerToRawData, *ish\ish[i]\SizeOfRawData, @ret) 
  Next 

  WriteProcessMemory_(pi\hProcess, Ctx\Ebx + 8, @lpBaseAddres, 4, #NUL) 
  Ctx\Eax = lpBaseAddres + *inh\OptionalHeader\AddressOfEntryPoint 
  SetThreadContext_(pi\hThread, Ctx) 
  ResumeThread_(pi\hThread) 
  ProcedureReturn 

  EndThread: 
  TerminateProcess_(pi\hProcess, #NUL) 
  CloseHandle_(pi\hThread) 
  CloseHandle_(pi\hProcess) 
EndProcedure 


OpenWindow(0, #PB_Ignore, #PB_Ignore, 140, 50, "", #PB_Window_SystemMenu |#PB_Window_ScreenCentered) 
ButtonGadget(#btn1, 40,15, 60, 20, "Run PE") 

Repeat 
  Event = WaitWindowEvent() 
  Select Event 
    Case #PB_Event_Gadget 
      EventGadget = EventGadget() 
      If EventGadget = #btn1 
        RunPE(?file, "") 
      EndIf 
    Case #PB_Event_CloseWindow 
      EventGadget = EventWindow() 
      If EventWindow = 0 
        CloseWindow(0) 
        Break 
      EndIf 
  EndSelect 
ForEver


DataSection 
  file:
  IncludeBinary "demo.exe" 
EndDataSection 
Exécuter le.

Re: Exe en data Section: Lancer un exécutable en mémoire.

Publié : ven. 29/août/2014 19:55
par vurvur
Sympa, je connaissais déjà en fait (vu sur les forums anglais et allemand) mais ça ne marche pas ici... Ca me donne "Line 24: Structure not found: IMAGE_DOS_HEADER."

Serait-ce parce que j'utilise actuellement la version d'évaluation de PB?

Re: Exe en data Section: Lancer un exécutable en mémoire.

Publié : ven. 29/août/2014 20:11
par Ar-S
vurvur a écrit :Sympa, je connaissais déjà en fait (vu sur les forums anglais et allemand) mais ça ne marche pas ici... Ca me donne "Line 24: Structure not found: IMAGE_DOS_HEADER."

Serait-ce parce que j'utilise actuellement la version d'évaluation de PB?
Oui.
La version démo ne permet pas de gérer les API windows :wink:
Or les commandes que tu vois se terminant par _ ne sont pas des commandes PB mais es API (ReadProcessMemory_ , CloseHandle_ etc..)

Re: Exe en data Section: Lancer un exécutable en mémoire.

Publié : ven. 29/août/2014 20:56
par vurvur
Ar-S a écrit :
vurvur a écrit :Sympa, je connaissais déjà en fait (vu sur les forums anglais et allemand) mais ça ne marche pas ici... Ca me donne "Line 24: Structure not found: IMAGE_DOS_HEADER."

Serait-ce parce que j'utilise actuellement la version d'évaluation de PB?
Oui.
La version démo ne permet pas de gérer les API windows :wink:
Or les commandes que tu vois se terminant par _ ne sont pas des commandes PB mais es API (ReadProcessMemory_ , CloseHandle_ etc..)
OK, c'est ce que je pensais, merci pour la confirmation !
Mais cette astuce fonctionne-t-elle encore avec windows 8? Je pensais avoir lu quelque part (mais je peux me tromper) que non, a cause des nouveaux mécanismes de sécurité (ASLR je crois).

Re: Exe en data Section: Lancer un exécutable en mémoire.

Publié : jeu. 30/oct./2014 8:42
par jmg49
magnifique un RunPE en PureBasic ! merci pour ton code, j'ai pas eu le courage d'en adapter un de VB6 ou Delphi , fonctionne nikel , je m'attendais à une avalanche de détections anti virales,
ben non, 8O , avec les api même pas encodées , CreateProcess, VirtualAlloce etc, en général ça passe pas !
à ne pas mettre entre toutes les mains.....

Re: Exe en data Section: Lancer un exécutable en mémoire.

Publié : jeu. 30/oct./2014 17:27
par Kwai chang caine
J'ai pas tout compris à quoi ça sert, alors j'ai demandé à "Mr Terre Nette" qui sait tout
J'ai lu qu'on pouvait faire des trucs "EBOLIENS", mais aussi comme dans l'antiquité, une histoire de bourrins, j'ai mis au pluriel car y'en a "trois" :mrgreen:
J'ai compris que c'est à peu pres aussi chaud que les keylogger...
Mais pour ce qui est de l'utilisation...diront nous....positive, ça permet d'embarquer par exemple une appli qui est pas à nous, dans une qui est à nous, sans qu'on voie que c'est pas à nous ???
Y'a d'autres utilisations ??

C'est dingue que je comprenne jamais du premier coups..et pourtant une histoire de bourrins...ça devrait me causer, non !! :oops:

En tout cas...merci FALSAM. 8)

Re: Exe en data Section: Lancer un exécutable en mémoire.

Publié : jeu. 30/oct./2014 17:48
par Lord Nelson
[17 :47 :50] [COMPILER] Ligne 24: Champs de structure introuvable: Ebx
Version 5.30 X 64

Re: Exe en data Section: Lancer un exécutable en mémoire.

Publié : dim. 05/avr./2015 23:27
par caussatjerome
Voiçi la source modifier pour toléré la compilation sous système 64 BITS ;-)

Code : Tout sélectionner

;http://forums.purebasic.com/english/viewtopic.php?p=311116&sid=71318ad4a9f408ffe97d5eb450eef191#p311116
;Correction X64 By caussatjerome
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
  Macro _RegB : ebx : EndMacro 
  Macro _RegD : edx : EndMacro
  Macro _RegA : eax : EndMacro
CompilerElse
  Macro _RegB : rbx : EndMacro 
  Macro _RegD : rdx : EndMacro 
  Macro _RegA : rax : EndMacro
CompilerEndIf

Procedure.l FNV32a(*key, len.l)
  EnableASM
  MOV _RegD, *key
  MOV ecx, len
  PUSH _RegB
  !mov eax, 2166136261
  !fnv32a_loop:
  MOVZX ebx, byte [_RegD]
  !xor eax, ebx
  !imul eax, 0x01000193
  INC _RegD
  !dec ecx
  !jnz fnv32a_loop
  POP _RegB
  DisableASM
  ProcedureReturn
EndProcedure

EnableExplicit

Enumeration
  #btn1
EndEnumeration

Define.l Event, EventGadget, EventGadget, EventWindow

Procedure RunPE(lBuff, parameters.s)
  Protected *idh.IMAGE_DOS_HEADER  = lBuff
  Protected *ish.IMAGE_SECTION_HEADERS
  Protected pi.PROCESS_INFORMATION
  Protected *inh.IMAGE_NT_HEADERS
  Protected si.STARTUPINFO
  Protected lpBaseAddres.l
  Protected Ctx.CONTEXT
  Protected Addr.l, RET.l, i.l

  CreateProcess_(#NUL, ProgramFilename() + " " + parameters, #NUL, #NUL, #False, #CREATE_SUSPENDED, #NUL, #NUL, @si, @pi)
  Ctx\ContextFlags = #CONTEXT_INTEGER
  If GetThreadContext_(pi\hThread, Ctx) = 0      : Goto EndThread : EndIf

  ReadProcessMemory_(pi\hProcess, Ctx\_RegB + 8, @Addr, 4, #NUL)
  If ZwUnmapViewOfSection_(Pi\hProcess, Addr)    : Goto EndThread : EndIf
  If lBuff = 0                                   : Goto EndThread : EndIf
  *inh = lBuff + *idh\e_lfanew

  lpBaseAddres = VirtualAllocEx_(pi\hProcess, *inh\OptionalHeader\ImageBase, *inh\OptionalHeader\SizeOfImage, #MEM_COMMIT | #MEM_RESERVE, #PAGE_EXECUTE_READWRITE)
  WriteProcessMemory_(pi\hProcess, lpBaseAddres, lBuff, *inh\OptionalHeader\SizeOfHeaders, @ret)
  *ish = *inh\OptionalHeader + *inh\FileHeader\SizeOfOptionalHeader

  For i = 0 To *inh\FileHeader\NumberOfSections - 1
    WriteProcessMemory_(pi\hProcess, lpBaseAddres + *ish\ish[i]\VirtualAddress, lBuff + *ish\ish[i]\PointerToRawData, *ish\ish[i]\SizeOfRawData, @ret)
  Next

  WriteProcessMemory_(pi\hProcess, Ctx\_RegB + 8, @lpBaseAddres, 4, #NUL)
  Ctx\_RegA = lpBaseAddres + *inh\OptionalHeader\AddressOfEntryPoint
  SetThreadContext_(pi\hThread, Ctx)
  ResumeThread_(pi\hThread)
  ProcedureReturn

  EndThread:
  TerminateProcess_(pi\hProcess, #NUL)
  CloseHandle_(pi\hThread)
  CloseHandle_(pi\hProcess)
EndProcedure


OpenWindow(0, #PB_Ignore, #PB_Ignore, 140, 50, "", #PB_Window_SystemMenu |#PB_Window_ScreenCentered)
ButtonGadget(#btn1, 40,15, 60, 20, "Run PE")

Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      If EventGadget = #btn1
        RunPE(?file, "")
      EndIf
    Case #PB_Event_CloseWindow
      EventGadget = EventWindow()
      If EventWindow = 0
        CloseWindow(0)
        Break
      EndIf
  EndSelect
ForEver


DataSection
  file:
  IncludeBinary "demo.exe"
EndDataSection 

Re: Exe en data Section: Lancer un exécutable en mémoire.

Publié : lun. 06/avr./2015 18:33
par GallyHC
Bonjour,

Je ne vois pas a quoi sert la fonction ci-dessous, car non utiliser dans le code :

Code : Tout sélectionner

Procedure.l FNV32a(*key, len.l)
  EnableASM
  MOV _RegD, *key
  MOV ecx, len
  PUSH _RegB
  !mov eax, 2166136261
  !fnv32a_loop:
  MOVZX ebx, byte [_RegD]
  !xor eax, ebx
  !imul eax, 0x01000193
  INC _RegD
  !dec ecx
  !jnz fnv32a_loop
  POP _RegB
  DisableASM
  ProcedureReturn
EndProcedure
Cordialement,
GallyHC

Re: Exe en data Section: Lancer un exécutable en mémoire.

Publié : mar. 07/avr./2015 10:32
par GallyHC
Bonjour,

Petite question :

Cela sert a exécuter un programme x64 en compilant le programme en x64 ou on peu théoriquement exécuter un programme x32 en compilant en x64 le programme de lancement, car si c'est le cas cela ne fonctionne pas chez moi.

Cordialement,
GallyHC

Re: Exe en data Section: Lancer un exécutable en mémoire.

Publié : lun. 13/avr./2015 14:15
par caussatjerome
cela sert a compiler et lancer sur un système 64 BIS,
de plus la fonction qui n'est pas utiliser, est un oubli de ma part.