![]() |
Frage zu Toms Shellhook beispiel
Hallo,
Ich habe mal eine Frage zu diesem Beispiel: ![]() Ich verstehe in dieser Funktion nicht, wozu die TList dient:
Delphi-Quellcode:
Der vergleich if BeenDone.IndexOf(Dos) >= 0 then Exit; ist doch immer false, denn es kann doch noch garnichts hinzugefügt worden sein?
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; :?: :?: *Liebfrag in Richtung Toms* mfg Boldar |
Re: Frage zu Toms Shellhook beispiel
PatchAddressInModule ist rekursiv. Da jedoch BeenDone im äußeren Scope liegt, wird für alle Aufrufe von PatchAddressInModule, die aus dem gleichen Aufruf von PatchAddress hervorgehen, die gleiche Liste verwendet; BeenDone kann also Endlosrekursion in PatchAddressInModule unterbinden.
|
Re: Frage zu Toms Shellhook beispiel
Kann man denn die Verwendung von TList irgendwie umgehen?
Weil nur deswegen Die Classes einbinden ist doch irgendwie blöd. Kann man nicht einfach einen Boolean nehmen? mfg Boldar |
Re: Frage zu Toms Shellhook beispiel
Verstehst du wirklich, wozu BeenDone verwendet wird?
|
Re: Frage zu Toms Shellhook beispiel
mmh ich glaube jetzt schon.
Ist das richtig, dass in beendone also die Liste der Bisher behandelten Module gespeichert wird, damit kein Modul mehrfach gepatcht wird? Aber dann könnte man doch auch ein array nehmen, also muss da doch noch etwas anderes sein, was den Einsatz eines arrays verhindert? mfg Boldar |
Re: Frage zu Toms Shellhook beispiel
Du kannst auch ein Array verwenden. Die TList nimmt dir lediglich das Iterieren und die Vergrößerung ab.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:00 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