Einzelnen Beitrag anzeigen

CorVu5

Registriert seit: 31. Dez 2007
26 Beiträge
 
Delphi 7 Professional
 
#1

Probleme beim Patchen der IAT

  Alt 14. Mär 2008, 16:57
Hallo Leute und Hallo Delphi-Praxis,
ich habe folgendes Problem. Und zwar versuche ich grad eine Funktion zu schreiben die die IAT patcht und Funktionsaufrufe sozusagen "umleiten" kann.
Ich stoße dabei auf das Problem ,dass ich zwar die korrekte Adresse ausgegeben bekomme, sagt jedenfalls PEview, @Funktion oder GetProcAddress(GetModuleHAndle('user32.dll'),'Funktion') aber andere Adressen ausgeben.
Möglicherweise liegt ja ein ganz simpler Denkfehler meinerseits vor.


Mein Code bis jetzt:
Delphi-Quellcode:
type
  PImageImportDescriptor = ^TImageImportDescriptor;
  TImageImportDescriptor = packed record
     HintNameTableOffset: DWORD; // RVA to original unbound IAT, aka Characteristics
                                    // 0 for terminating null import descriptor
                                    // PImageThunkData
     TimeDateStamp : DWORD; // 0 if not bound,
                                    // -1 if bound, and real date\time stamp
                                    // in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
                                    // O.W. date/time stamp of DLL bound to (Old BIND)
      ForwarderChain : DWORD; // -1 if no forwarders
      NameOffset : DWORD; // RVA to name of the module we're importing from
      IATOffset : DWORD; // RVA to IAT (if bound this IAT has actual addresses)
                                    // PImageThunkData
  end;

  PImageImportByName = ^TImageImportByName;
  TImageImportByName = packed record
    Hint : WORD;
    Name : array[0..255] of Char;
  end;

  PImageThunkData = ^TImageThunkData;
  TImageThunkData = packed record
    case integer of
      0 : (ForwarderString: PBYTE);
      1 : (FunctionPtr : PDWORD);
      2 : (Ordinal : DWORD);
      3 : (AddressOfData : PImageImportByName);
  end;

Delphi-Quellcode:
procedure PatchIAT(Dll : Pchar; OldFunction : Pointer; newFunc : Pointer);
var
image : LoadedImage;
pImageImportDir : PIMAGEIMPORTDESCRIPTOR;
last : PImageSectionHEader;
size : Cardinal;
dllname : Pchar;
pThunk : PImageThunkData;
lTrue : Boolean;
written : Cardinal;
begin
MapAndLoad(Pchar(ParamStr(0)),nil,@image,True,True);
pImageImportDir := ImageDirectoryEntryToData(
                    image.MappedAddress
                    ,False
                    ,IMAGE_DIRECTORY_ENTRY_IMPORT
                    ,size);

while pImageImportDir.NameOffset <> 0 Do begin
  dllname := ImageRVAToVA(image.FileHeader,image.MappedAddress,pImageImportDir.NameOffset,last);
  If (lstrcmpiA(dllname , Dll) = 0) Then break;
  Inc(pImageImportDir);
end;
{Showmessage(dllname);  }
pThunk := ImageRVAToVA(image.FileHeader,image.MappedAddress,pImageImportDir.IATOffset,last);
While pThunk^.FunctionPtr <> nil Do begin
  Showmessage(FloatTostr(Cardinal(pThunk^.FunctionPtr)));
  Showmessage(IntToStr(Integer(Oldfunction)));
  ltrue := (pThunk^.FunctionPtr = OldFunction );
  If lTrue then begin
    Showmessage('FOUND2');
    {VirtualProtectEx(GetCurrentProcess,pThunk.FunctionPtr,4,PAGE_EXECUTE_READWRITE,written);
    WriteProcessMemory(GetCurrentProcess, pThunk.FunctionPtr, NewFunc, sizeof(NewFunc), Written);
    }
break;
  end;
Inc(Pthunk);
end;
UnmapAndLoad(@image);
end;
ALs Beispielaufruf: PatchIAT('user32.dll',GetProcAddress(GetModuleHAndle('user32.dll'),'MessageBoxA'),@newMessageBoxA);
Danke Im Voraus
CorVu5
Das Leben ist wie ein Strand...und dann stirbt man.
  Mit Zitat antworten Zitat