Entwickler-Ecke
Windows API - API Hooks unter XE3 ?
misko2k - Do 25.10.12 01:13
Titel: API Hooks unter XE3 ?
Hallo,
Suche seit tagen loesung für mein problem , nämlich nach dem umstieg von RAD2007 auf XE3, wie zu erwarten funktionieren einige sachen nicht , das nervigste sind die Hooks... (Muss Hooken CreateProcessA,CreateProcessW,ShellExecute,DeleteFileA)
Hat jemand für mich ein beispiel wie man dies unter XE3 machen kann ? (will keine madCodeHook nutzen)
Irgendwie kriege ich nicht die Proceduren Adresse Patchen, habe hier einen kurzen Beispiel wie ich versucht hab (kann so was in der form funktionieren ?) :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| type PInstruction = ^TInstruction; TInstruction = packed record Opcode: byte; Offset: Integer; end;
procedure Patch(Address: Pointer; const NewCode; Size: Integer); var NumberOfBytes: Size_T; begin WriteProcessMemory(GetCurrentProcess, Address, @NewCode, SizeOf(NewCode), NumberOfBytes); end;
procedure Redirect(OldAddress, NewAddress: Pointer); var NewCode: TInstruction; begin NewCode.Opcode := $E9; NewCode.Offset := Cardinal(NewAddress)-Cardinal(OldAddress)-SizeOf(NewCode); Patch(OldAddress, NewCode, SizeOf(NewCode)); end;
procedure SetHook (dll,func : LPCSTR;OldFunc : Pointer; const NewFunc) ; const W_SIZE = 4 ; var hmod : Cardinal ; farpro : Pointer ; unload : boolean ; begin unload := false ; hmod := GetModuleHandleA(dll) ; if (hmod=0) then begin hmod := LoadLibraryA(dll) ; unload := True ; end ;
if (hmod<>0) then begin farpro := GetProcAddress(hmod,func) ; if farpro <> nil then Redirect(farpro,@NewFunc) ; end;
if unload then FreeLibrary(hmod) ; end; |
Moderiert von
Martok: Delphi-Tags hinzugefügt
jaenicke - Do 25.10.12 07:56
Hallo und :welcome:
Injizierst du eine DLL mit diesem Quelltext dann in den Zielprozess?
Das mit GetModuleHandle kannst du dir jedenfalls sparen, denn LoadLibrary schaut schon selbst, ob die DLL bereits geladen ist. Und entladen wird sie dann auch nicht, wenn sie schon vorher geladen war, da die Anzahl des Ladens und des Entladens als Referenzzähler beachtet werden.
misko2k - Do 25.10.12 10:25
Erst mal Danke für die Willkommens grüße :),
Ich habe eine hook dll und drin diesen Quellcode, und versuche damit in kernel32.dll CreateProcess/A/W zu hooken.
Da es nicht klappt muss ich nicht wohl erwähnen ? :D
Das mit GetModuleHandle hast recht, in diesem Beispiel wird NIE die Loadlibrary aufgerufen.
So wie kriegt mann es am laufen unter XE und 64bit ?
BenBE - Di 06.11.12 00:23
Dein Hook-Code sieht stark nach 32-Bit-Hooking aus, was aber bei 64-Bit-Prozessen so nicht funktioniert.
Selbst wenn Du also
deiner Katze sagst "Platz!" [
http://xkcd.com/722/] wird sie zwar nicht gleich abstürzen, aber zumindest auch nicht machen, was Du willst ;-)
Bliebe noch eine andere Unangenehmheit von Wow64-Prozessen: Die enthalten eigentlich alle System-DLLs doppelt: Einmal als 64-Bit und einmal als Trampolin in 32-Bit.
GetProcAddress liefert dir aber AFAIK nur die für das Trampolin.
Bliebe noch die Sache mit den
Pointern [
http://xkcd.com/138/]: Die sind 64-Bit bei 64-Bit-Code. Bei Wow64-Prozessen ist das aber gemischt und man muss anhand des Modulheaders abfragen, ob ein bestimmtes Code-Segment grade mit 32-Bit oder 64-Bit ausgeführt wird.
Wenn du nativen 64-Bit-Code hast, ist der 32-Bit-Jump trotzdem falsch.
Und zu guter letzt noch der Hinweis: Bitte
fang Fehlercodes [
http://xkcd.com/371/] ab.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!