Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Vista: Einige API Hooks nicht mehr möglich? (https://www.delphipraxis.net/88888-vista-einige-api-hooks-nicht-mehr-moeglich.html)

Zacherl 22. Mär 2007 15:59


Vista: Einige API Hooks nicht mehr möglich?
 
Hi,

ich habe versucht einige APIs unter Vista zu hooken. Bei NtTerminateProcess, CreateProcessA, etc funktioniert dies wunderbar. Bei einigen anderen APIs wie Module32First oder NtQuerySystemInformation wird die neue Funktion einfach gar nicht aufgerufen.

Hat jemand eine Idee, woran das liegen kann, bzw wie man das umgehen kann?

Bernhard Geyer 22. Mär 2007 17:40

Re: Vista: Einige API Hooks nicht mehr möglich?
 
Hast Du UAC aktiviert bzw am laufen?
Evtl. ist aufgrund der "erhöhten Sicherheit" in Vista es einfach nicht mehr möglich mit nicht MS-Zertifizierten (oder generell gar nicht mehr) möglich bestimmte Kernel-Funktionen zu hooken). Selbst die Virenscanner-Hersteller scheinen ja mit dem neuen Vista-Sicherheitskonzept so ihre Probleme zu haben. Vermutlich haben die ähnliche Probleme.

DP-Maintenance 22. Mär 2007 17:55

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Internet / LAN / ASP.NET" nach "Windows API / MS.NET Framework API" verschoben.
Ist hier wohl besser aufgehoben.

SirThornberry 22. Mär 2007 18:06

Re: Vista: Einige API Hooks nicht mehr möglich?
 
welche Variante der Api-Hooks (Funktionsprinzip) nutzt du denn?

Zacherl 22. Mär 2007 20:38

Re: Vista: Einige API Hooks nicht mehr möglich?
 
Also .. UAC ist aus, also sollte mein Hook mit Admin-Rechten laufen. Ich habe den Hook frei nach Luckies "ExecuteHook" Beispiel geschrieben. Die Hook Funktion ist somit folgende:

Delphi-Quellcode:
function PatchAddress(OldFunc, NewFunc: Pointer): integer;
var
  BeenDone: TList;

  function PatchAddressInModule(hModule: THandle; OldFunc, NewFunc: Pointer): integer;
  var
    Dos: PImageDosHeader;
    NT: PImageNTHeaders;
    ImportDesc: PImage_Import_Entry;
    rva: DWORD;
    Func: PPointer;
    DLL: string;
    f: Pointer;
    written: DWORD;
  begin
    Result := 0;
    Dos := Pointer(hModule);
    if BeenDone.IndexOf(Dos) >= 0 then Exit;
    BeenDone.Add(Dos);
    OldFunc := FinalFunctionAddress(OldFunc);
    if IsBadReadPtr(Dos, SizeOf(TImageDosHeader)) then Exit;
    if Dos.e_magic <> IMAGE_DOS_SIGNATURE then Exit;
    NT := Pointer(integer(Dos) + dos._lfanew);
    // if IsBadReadPtr(NT,SizeOf(TImageNtHeaders)) then exit;

    RVA := NT^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;

    if RVA = 0 then Exit;
    ImportDesc := Pointer(integer(Dos) + RVA);
    while (ImportDesc^.Name <> 0) do
    begin
      DLL := PChar(integer(Dos) + ImportDesc^.Name);
      PatchAddressInModule(GetModuleHandle(PChar(DLL)), OldFunc, NewFunc);
      Func := Pointer(integer(DOS) + ImportDesc.LookupTable);
      while Func^ <> nil do
      begin
        f := FinalFunctionAddress(Func^);
        if f = OldFunc then
        begin
          WriteProcessMemory(GetCurrentProcess, Func, @NewFunc, 4, written);
          if Written > 0 then Inc(Result);
        end;
        Inc(Func);
      end;
      Inc(ImportDesc);
    end;
  end;
begin
  BeenDone := TList.Create;
  try
    Result := PatchAddressInModule(GetModuleHandle(nil), OldFunc, NewFunc);
  finally
    BeenDone.Free;
  end;
end;
Allerdings lassen sich die genannten APIs auch nicht mit der madCodeHook, der uallHook oder der afxCodeHook Unit hooken. :x


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz