AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Alternative zu FindFirst/Next im SpeedCommander ??
Thema durchsuchen
Ansicht
Themen-Optionen

Alternative zu FindFirst/Next im SpeedCommander ??

Ein Thema von F.W. · begonnen am 14. Apr 2008 · letzter Beitrag vom 20. Apr 2008
 
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#4

Re: Alternative zu FindFirst/Next im SpeedCommander ??

  Alt 15. Apr 2008, 10:19
Zitat:
Wie hookst Du? IAT? EAT? Code Overwriting? Ich hoffe mal Du denkst daran, daß Du bei IAT Hooks dynamic linking selbst abfangen musst über nen GetProcAddress Hook.
Vielleicht zeigt sich jetzt wieder mein gefährliches Halbwissen, aber was ist IAT und EAT?
Ich habe gerade nach der Quelle gesucht, von der ich die Prozedur zum Adressen patchen genommen habe, aber ich find sie nicht mehr. Es war hier aus der DP, ich glaube ein Beitrag von Luckie, ich habe jedenfalls noch den Ahang des Threads hier auf der Platte, er heißt "MutexHook", dazu findet die Forensuche aber nichts ^^

Ich poste sie einfach mal:
Delphi-Quellcode:
function PointerToFunctionAddress(Code: Pointer): PPointer;
var
  func: PImportCode;
begin
  Result := nil;
  if Code = nil then Exit;
  try
    func := code;
    if (func.JumpInstruction = $25FF) then
    begin
      Result := func.AddressOfPointerToFunction;
    end;
  except
    Result := nil;
  end;
end;

function FinalFunctionAddress(Code: Pointer): Pointer;
var
  func: PImportCode;
begin
  Result := Code;
  if Code = nil then Exit;
  try
    func := code;
    if (func.JumpInstruction = $25FF) then
    begin
      Result := func.AddressOfPointerToFunction^;
    end;
  except
    Result := nil;
  end;
end;


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;
Den Rest hab ich selbst geschrieben, eben einen ganz normalen Hook, den ich aber nur benutze um in die Prozesse zu gelangen:
Delphi-Quellcode:
function GetMsgProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
 Result := CallNextHookEx(PData^.HookHandle, nCode, wParam, lParam);
end;
Zitat:
Eigentlich fast alle ANSI Funktionen sind nur Wrapper für die WideChar Funktionen.
Ich habe das gerade mal ausprobiert. Ich benutze in meinen Programmen meist nur die einfache FindFirst Version, wenn ich in der Dll aber jetzt nur die Unicode Varianten patche, bekomme ich gar nichts mehr. Also sind zumindest gerade diese keine Wrapper. Oder es hängt damit zusammen, dass ich die Adressen im Programm patche und wenn ein Programm eben FindFirst oder FindFirstA aufruft ist ja klar, dass ich dann nichts mehr mitbekomme.

Zitat:
Nimm den Dependency Walker und lade den SC.
Den Dependency Walker schaue ich mir gleich mal an!
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:05 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