Sorry.
Aber das scheint mir noch ein wenig zu komplex zu sein.
Ich kann dir zwar nen Code liefern, aber da musst du auch durchsteigen, weil sauber laufen tut der net und ich hab keine Lust da jetzt ewig drann zu hocken.
Das muss als DLL mit Unicode-Unterstützung kompiliert werden und dann in die zu überwachende Anwendung injiziert werden:
Code: Alles auswählen
;/---------------------------------------------------\
;| Beispiel zur Überwachung von "Open File Dialogen" |
;| by Thorium |
;| |
;| Stand: 30.09.2008 |
;| |
;| PureBasic 4.20 |
;\---------------------------------------------------/
EnableExplicit
;OrigProcAddr = Funktion, die gehookt werden soll
;HookProcAddr = Hook-Prozedur
;OrigCodePatchAddr = Adresse in der Hook-Prozedur, wo der Originalcode eingepatcht werden kann
Procedure InstallInlineHook(OrigProcAddr.l,HookProcAddr,OrigCodePatchAddr.l)
Define.l StartPos,EndPos,Length,OldProtect,Dummy
;Ermitteln der Länge des zu patchenden Codes und Einsprungpunkt
StartPos = OrigProcAddr
Repeat
EndPos = DisASMCommand(StartPos)
Length = Length + (EndPos - StartPos)
StartPos = EndPos
Until Length >= 7
;Schreibrechte in Hook-Prozedur setzen
VirtualProtect_(OrigCodePatchAddr,Length + 6,#PAGE_EXECUTE_READWRITE,@OldProtect)
;Patchen der Hook-Prozedur mit dem Code, der in der Original-Funktion überschrieben wird.
CopyMemory(OrigProcAddr,OrigCodePatchAddr,Length)
;Rücksprungcode in Hook-Funktion einpatchen
PokeB(OrigCodePatchAddr + Length,$68) ;push const
PokeL(OrigCodePatchAddr + Length + 1,OrigProcAddr + Length) ;const
PokeB(OrigCodePatchAddr + Length + 5,$C3) ;ret
;Zugriffsrechte in Hook-Prozedur wiederherstellen
VirtualProtect_(OrigCodePatchAddr,Length + 6,OldProtect,@Dummy)
;Schreibrechte in Original-Prozedur setzen
VirtualProtect_(OrigProcAddr,Length + 6,#PAGE_EXECUTE_READWRITE,@OldProtect)
;patchen der Original-Prozedur
PokeB(OrigProcAddr,$68) ;push const
PokeL(OrigProcAddr + 1,HookProcAddr) ;const
PokeB(OrigProcAddr + 5,$C3) ;ret
;Zugriffsrechte in Original-Prozedur wiederherstellen
VirtualProtect_(OrigProcAddr,Length + 6,OldProtect,@Dummy)
EndProcedure
Procedure UninstallInlineHook(OrigProcAddr.l,OrigCodePatchAddr.l)
Define.l StartPos,EndPos,Length,OldProtect,Dummy
;Ermitteln der Länge des überschriebenen Originalcodes
StartPos = OrigProcAddr
Repeat
EndPos = DisASMCommand(StartPos)
Length = Length + (EndPos - StartPos)
StartPos = EndPos
Until Length >= 7
;Patchen der Original-Prozedur mit dem Code, der in der Original-Funktion überschrieben wurde.
;Schreibrechte in Original-Prozedur setzen
VirtualProtect_(OrigProcAddr,Length + 6,#PAGE_EXECUTE_READWRITE,@OldProtect)
;Patchen der Original-Prozedur mit dem Code, der in der Original-Funktion überschrieben wurde.
CopyMemory(OrigCodePatchAddr,OrigProcAddr,Length)
;Zugriffsrechte in Original-Prozedur wiederherstellen
VirtualProtect_(OrigProcAddr,Length + 6,OldProtect,@Dummy)
EndProcedure
Procedure GetOpenFileName_Hook(*lpofn.OPENFILENAME)
If MessageRequester("GetOpenFileName Hook","Anwendung möchte einen OpenFile-Dialog öffnen." + Chr(10) + "Möchten sie dies zulassen?",#PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
;Aufrufen der Originalprozedur
CallFunctionFast(?GetOpenFileName_OrigCode,*lpofn)
If MessageRequester("GetOpenFileName Hook","Ausgewählte Datei: " + PeekS(*lpofn\lpstrFile,#PB_Ignore,#PB_Unicode) + Chr(10) + "Möchten sie das öffnen dieser Datei unterbinden?",#PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
PokeW(*lpofn\lpstrFile,0)
EndIf
EndIf
ProcedureReturn
;in Originalprozedur überschriebenen Code ausführen und Rücksprung
;wird während der Laufzeit gepatcht
GetOpenFileName_OrigCode:
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
!nop
EndProcedure
Procedure InstallOpenFileNameHook()
Define.l hModule,ProcAddr
hModule = OpenLibrary(#PB_Any,"comdlg32.dll")
ProcAddr = GetFunction(hModule,"GetOpenFileNameW")
InstallInlineHook(ProcAddr,@GetOpenFileName_Hook(),?GetOpenFileName_OrigCode)
EndProcedure
Procedure UninstallOpenFileNameHook()
Define.l hModule,ProcAddr
hModule = OpenLibrary(#PB_Any,"comdlg32.dll")
ProcAddr = GetFunction(hModule,"GetOpenFileNameW")
UnInstallInlineHook(ProcAddr,?GetOpenFileName_OrigCode)
EndProcedure
ProcedureDLL AttachProcess(Instance)
InstallOpenFileNameHook()
EndProcedure
ProcedureDLL DetachProcess(Instance)
UninstallOpenFileNameHook()
EndProcedure
Zum Test kann einfach ein universeller DLL-Injector, wie
dieser verwendet werden.
2 große Probleme hat der Code:
Erstens wird der Dateiname nicht richtig ausgelesen oder angezeigt, keine Ahnung warum. Der ist Unicode und sollte eigentlich ausgelesen und angezeigt werden können. Tut aber net.
Zweitens knippst sich die Testanwendung (Notepad) manchmal einfach aus, wenn der Hook installiert ist und man sich im OpenFile-Dialog befindet.