![]() |
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? |
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
Dieses Thema wurde von "Matze" von "Internet / LAN / ASP.NET" nach "Windows API / MS.NET Framework API" verschoben.
Ist hier wohl besser aufgehoben. |
Re: Vista: Einige API Hooks nicht mehr möglich?
welche Variante der Api-Hooks (Funktionsprinzip) nutzt du denn?
|
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:
Allerdings lassen sich die genannten APIs auch nicht mit der madCodeHook, der uallHook oder der afxCodeHook Unit hooken. :x
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz