Page 1 sur 2

Recuperer des donnees d'un programme lance en runpe

Publié : mer. 17/mai/2017 9:46
par ChaudEf
Bonjour
J'utilise une fonction de RunPe pour inclure un programme dans mon programe et l'executer sans devoir le deposer sur l'ordinateur, ma question est est-ce qu'il est possible de recuperer des donnes de ce programme? disons je veux que ce programme (child) transmette un chiffre ou une string au programme parent, y-a-t-il un moyen?
merci

n.b. en fait le probleme est que cette fonction depose le programme dans la memoire de l'ordinateur, le lance, et le programme parent se ferme tout de suite et n'attends pas que le child se termine.

la fonction que j'utilise:

Code : Tout sélectionner

Procedure RunPE(lBuff, parameters.s) 
;http://forums.purebasic.com/english/viewtopic.php?p=311116&sid=71318ad4a9f408ffe97d5eb450eef191#p311116
	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 

Re: Recuperer des donnees d'un programme lance en runpe

Publié : mer. 17/mai/2017 9:51
par Zorro
ChaudEf a écrit : je veux que ce programme (child) transmette un chiffre ou une string au programme parent, y-a-t-il un moyen?
merci
peut etre les MailSlot ....
http://www.purebasic.fr/french/viewtopi ... ot#p183637

Re: Recuperer des donnees d'un programme lance en runpe

Publié : mer. 17/mai/2017 9:58
par ChaudEf
Merci Zorro.
Et aurai-tu une idee pourquoi les antivirus n'aiment pas ce runpe?
j'ai fait un programme tout bete, qui ouvre un messagerequester et c'est tout, je l'ai compile et inclu en runpe et recompile, et 22 antivirus le detectent comme virus!!!

https://www.virustotal.com/fr/file/c45c ... 495011602/

mon code:
petit fichier, compile et nomme test.exe

Code : Tout sélectionner

MessageRequester("", "")
"grand" fichier, qui inclu la fonction runpe

Code : Tout sélectionner

XIncludeFile "RunPe.pbi"


RunPE(?file, "") 


DataSection 
	file:
	IncludeBinary "test.exe" 
EndDataSection
Incroyable, non?

Re: Recuperer des donnees d'un programme lance en runpe

Publié : mer. 17/mai/2017 10:30
par Zorro
ben oui, c'est plutot normal en fait .....

un Virus c'est quoi ?

un prg qui se replique lui meme , et qui accessoirement fout le bazar sur l'ordinateur Hote ! (car a l'origine c'etait juste des prg pour le fun, pas de but malveillant la dedans )

donc par définition, un virus , est un prg qui se contient lui -meme ! (ou contient une variante de lui meme, dans ce cas on parle de polymorphisme )
dans un but de "reproduction" (d'auto-réplication ) , par analogie dans Stargate la serie, ils les appel les "Réplicateur"

donc, ce que tu fait est une structure de Virus de base !

meme si tu n'as pas d'intention bélliqueuse , les anti-virus, n'en savent rien eux , de tes intentions
alors par defaut, il declenche une alerte, et direct en Quarantaine !!

pour te donner une idée , mon Stater est juste un lanceur d'applications , rien de plus
mais parceque justement il lance des applications, il est vu comme un virus potentiel (des fois qu'il veuille se lancer lui meme .... )
de plus , je l'ai appelé "Starter" , ben figure toi qu'il y a eu en son temps un virus qui porte ce nom ...
donc, mon pauvre lanceur d'applications, est vu comme un virus ! :roll:

c'est le mal moderne

Re: Recuperer des donnees d'un programme lance en runpe

Publié : mer. 17/mai/2017 10:49
par ChaudEf
Donc si je veux pallier a ce probleme, c'est quoi les solutions?

a priori, le fait d'inclure un exe dans mon programme, et meme de le dupliquer sur l'ordinateur, n'est pas detecte comme virus. seulement la fonction runpe qui charge l'exe en memoire, non?

Re: Recuperer des donnees d'un programme lance en runpe

Publié : mer. 17/mai/2017 11:01
par GallyHC
Bonjour,

J'utilise aussi un "RunPE" pour l'utilisation d'un programme externe avec un programme en PB. Pour le dialogue, je me suis conforme a celui du programme externe (un accès mémoire commun au x programme(s)). En gros cela donne :

Code : Tout sélectionner

Global *ShareData
Global hMapFile.i
Global hMapSize.i          = 2500
Global VirtualFileName.s   = "ShareYourName"

Procedure OpenMapFile()
;
;
;
  CompilerSelect #PB_Compiler_Processor
    CompilerCase #PB_Processor_x86
      hMapFile = CreateFileMapping_($FFFFFFFF, #Null, #PAGE_READWRITE, 0, hMapSize, VirtualFileName)
    CompilerCase #PB_Processor_x64
      hMapFile = CreateFileMapping_($FFFFFFFFFFFFFFFF, #Null, #PAGE_READWRITE, 0, hMapSize, VirtualFileName)
  CompilerEndSelect    
  If hMapFile = 0
    MessageRequester(sMessageTitle, "Error creating memory mapped file", #PB_MessageRequester_Ok)
  Else
    *ShareData = MapViewOfFile_(hMapFile, #FILE_MAP_WRITE, 0, 0, hMapSize)
    If *ShareData = 0
      MessageRequester(sMessageTitle, "Error creating memory mapped file", #PB_MessageRequester_Ok)
    EndIf
  EndIf

EndProcedure

Procedure CloseMapFile()
;
;
;
  UnmapViewOfFile_(*ShareData)
  CloseHandle_(hMapFile)

EndProcedure
OpenMapFile() pour ouvrir (ou créer) un accès a cette partie mémoire et CloseMapFile() forcément pour terminer cette accés.
hMapSize.i donne la taille allouer à la mémoire commune.
VirtualFileName.s donne le nom de cet accès mémoire.

Pour la lecture ou l’écriture :

Code : Tout sélectionner

Procedure.s GetShareData()
;
;
;
  If hMapFile And *ShareData
    ProcedureReturn PeekS(*ShareData, -1, #PB_Ascii)
  EndIf

EndProcedure

Procedure SetShareData(svalue.s)
;
;
;
  If hMapFile And *ShareData
    FillMemory(*ShareData, hMapSize, 0, #PB_Byte)
    If svalue <> #Null$
      PokeS(*ShareData, svalue, Len(svalue), #PB_Ascii)
    EndIf
  EndIf

EndProcedure
GetShareData() Lit l’information dans cette partie mémoire et SetShareData() écrit dans cette partie de mémoire.

J'espère que cela peux vous aidez (ou même quelqu'un d'autre).

Cordialement,
GallyHC

PS: mon seul problème avec un "RunPE" est que le nom du programme en mémoire et le même que le nom du programme "Maitre".

Re: Recuperer des donnees d'un programme lance en runpe

Publié : mer. 17/mai/2017 11:02
par ChaudEf
Merci
et les AV en pensent quoi?

Re: Recuperer des donnees d'un programme lance en runpe

Publié : mer. 17/mai/2017 11:04
par Ar-S
Y'a pas de solutions toutes faites car les antivirus ne fonctionnent et ne réagiront pas tous de la même façon (même si le comportement d'un runpe risque d'en faire tiquer plus d'un). La seule chose judicieuse à faire est de terminer ton soft puis de l'envoyer aux éditeurs en tant que faux positif. Il sont assez réactif en général.

Re: Recuperer des donnees d'un programme lance en runpe

Publié : mer. 17/mai/2017 11:08
par GallyHC
le peu d'antivirus que j'ai utiliser avec mon programme ne dises rien a cela.

Cordialement,
GallyHC

Re: Recuperer des donnees d'un programme lance en runpe

Publié : mer. 17/mai/2017 11:12
par ChaudEf
Merci
et quel fonction de runpe tu utilise?

Re: Recuperer des donnees d'un programme lance en runpe

Publié : mer. 17/mai/2017 11:18
par GallyHC
ChaudEf a écrit :Merci
et quel fonction de runpe tu utilise?
Je ne comprend pas trop la question?

Je lance un programme du programme principal dans la mémoire directement. Le programme en mémoire envois directement des informations a une boitier Velleman VM116, comme ci-dessous :
Image

Cordialement,
GallyHC

Re: Recuperer des donnees d'un programme lance en runpe

Publié : mer. 17/mai/2017 11:20
par Ar-S
GallyHC a écrit :le peu d'antivirus que j'ai utiliser avec mon programme ne dises rien a cela.
Cordialement,
GallyHC
Cool, si tu lances ton exe sur https://www.virustotal.com/ ça donne quoi ?

Re: Recuperer des donnees d'un programme lance en runpe

Publié : mer. 17/mai/2017 11:29
par GallyHC
le résultat (c'est une DLL ou il y a le "RunPE") : https://www.virustotal.com/fr/file/fce5 ... 495016875/

Pour voir le code la DLL, http://www.koakdesign.info/pbfrance/?ur ... ewer&val=2
la partie du code avec le "RunPE" http://www.koakdesign.info/pbfrance/php ... num=2#p325

Cordialement,
GallyHC

Re: Recuperer des donnees d'un programme lance en runpe

Publié : mer. 17/mai/2017 12:18
par Marc56
... inclure un programme dans mon programme et l’exécuter sans devoir le déposer sur l'ordinateur,...
Si tu ne veux pas risquer de laisser un EXE sur le disque, utilises un disque virtuel,
mais évite ce genre de bidouille (exe inclus) qui sera toujours vue comme un virus
et qui entache la réputation de PB :roll:

Re: Recuperer des donnees d'un programme lance en runpe

Publié : mer. 17/mai/2017 13:07
par ChaudEf
utilises un disque virtuel
Que veut tu dire?