Hier eine Prozedur mir der das ohne weiteres möglich ist.
hTarget: Handle des fremden Prozesses
ProcAddr: Adresse der Prozedur im fremden Prozess
Params: Long-Array mit beliebig vielen Parametern, die an die Prozedur übergeben werden sollen.
Wait: Wenn 1 dann wartet das Programm mit der weiteren Ausführung bis die fremde Prozedur komplett abgearbeitet ist.
Gibt die Prozedur 0 zurück ist sie gescheitert.
Code: Alles auswählen
;Written by Thorium
;PureBasic 4.02 Windows
Macro ArrayIndex(Array)
PeekL(Array-8)-1
EndMacro
Procedure.l RemoteCallProc(hTarget.l,ProcAddr.l,Params.l(1),Wait.b)
Define.l i,Position,ParamsCnt,hThread,BytesWritten,ProcCallAddr,CodeBuffer
ParamsCnt = ArrayIndex(Params())
CodeBuffer = AllocateMemory($1000)
;Parameter-Pushen generieren: push const
For i = ParamsCnt To 0 Step -1
PokeB(CodeBuffer + Position,$68)
Position + 1
PokeL(CodeBuffer + Position,Params(i))
Position + 4
Next
;Prozeduraufruf generieren: mov eax,const : call eax
PokeB(CodeBuffer + Position,$B8)
Position + 1
PokeL(CodeBuffer + Position,ProcAddr)
Position + 4
PokeW(CodeBuffer + Position,$D0FF)
Position + 2
;Rücksprung generieren: ret
PokeB(CodeBuffer + Position,$C3)
Position + 1
;Speicher für Code im Zielprozess allokieren
ProcCallAddr = VirtualAllocEx_(hTarget,0,Position,#MEM_COMMIT | #MEM_RESERVE,#PAGE_EXECUTE_READWRITE)
If ProcCallAddr = 0
ProcedureReturn 0
EndIf
;Code in den Zielprozess schreiben
If WriteProcessMemory_(hTarget,ProcCallAddr,CodeBuffer,Position,@BytesWritten) = 0
ProcedureReturn 0
EndIf
If WrittenBytes <> Position
ProcedureReturn 0
EndIf
FreeMemory(CodeBuffer)
;Code ausführen indem ein Thread im Zielprozess erzeugt wird
hThread.l = CreateRemoteThread_(hTarget,0,0,ProcCallAddr,0, 0, 0)
If hThread = 0
ProcedureReturn 0
EndIf
;falls erwünscht warten bis der Thread beendet ist
If Wait = 1
WaitForSingleObject_(hThread,#INFINITE)
;Speicher im Zielprozess wieder freigeben
VirtualFreeEx_(hTarget,ProcCallAddr,0,#MEM_RELEASE)
EndIf
ProcedureReturn 1
EndProcedure