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

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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.
Dernière modification par falsam le sam. 29/août/2015 12:01, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
vurvur
Messages : 60
Inscription : ven. 29/août/2014 19:52

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

Message 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?
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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..)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
vurvur
Messages : 60
Inscription : ven. 29/août/2014 19:52

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

Message 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).
jmg49
Messages : 153
Inscription : mer. 26/févr./2014 8:53

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

Message 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.....
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

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

Message 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)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

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

Message par Lord Nelson »

[17 :47 :50] [COMPILER] Ligne 24: Champs de structure introuvable: Ebx
Version 5.30 X 64
Avatar de l’utilisateur
caussatjerome
Messages : 50
Inscription : lun. 24/sept./2012 20:57
Localisation : Somme

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

Message 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 
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

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

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

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

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
caussatjerome
Messages : 50
Inscription : lun. 24/sept./2012 20:57
Localisation : Somme

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

Message 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.
Répondre