Prozeduren von fremden Prozessen ausführen (Windows)
Verfasst: 19.05.2007 21:31
Da ich einige Tools für Spiele entwickle, stellt sich mir öfter die Problematik, das ich eine spielinterne Prozedur aufrufen will. Z.B. um Text auf den Screen des Spiels zu bekommen oder sonstiges.
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.
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