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.