Autor Beitrag
misko2k
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 25.10.12 01:13 
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 ?) :

ausblenden volle Höhe 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;//jump relative
  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=0then
   begin
     hmod := LoadLibraryA(dll) ;
     unload := True ;
   end ;

   if (hmod<>0then
   begin
     farpro := GetProcAddress(hmod,func) ;
      if farpro <> nil then
         Redirect(farpro,@NewFunc) ;
   end;

   if unload then
     FreeLibrary(hmod) ;
end;


Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: BenBE, misko2k
misko2k Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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!" 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: 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 ab.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.