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 Frage zu Toms Shellhook beispiel (https://www.delphipraxis.net/136440-frage-zu-toms-shellhook-beispiel.html)

Boldar 30. Jun 2009 14:52


Frage zu Toms Shellhook beispiel
 
Hallo,
Ich habe mal eine Frage zu diesem Beispiel: http://www.michael-puff.de/Developer.../Importe/toms/


Ich verstehe in dieser Funktion nicht, wozu die TList dient:


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;
Der vergleich if BeenDone.IndexOf(Dos) >= 0 then Exit; ist doch immer false, denn es kann doch noch garnichts hinzugefügt worden sein?
:?: :?:

*Liebfrag in Richtung Toms*
mfg Boldar

Apollonius 30. Jun 2009 14:56

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.

Boldar 30. Jun 2009 15:04

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

Apollonius 30. Jun 2009 15:07

Re: Frage zu Toms Shellhook beispiel
 
Verstehst du wirklich, wozu BeenDone verwendet wird?

Boldar 30. Jun 2009 15:10

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

Apollonius 30. Jun 2009 15:18

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