Zitat von AsmoAlles anzeigenHier habt ihr mal nen bsp das wens man es ausbaut
grundlage f?r ein in Delphi Geschriebenes Rootkit sein kann:
exe-PE Datein haben eine sog. IAT (Import Adress Table) in der die Functionsadressen der aufzuruffenden Functionen bsp
von geladeten / zu benutzenden API's / DLL stehen.
Hir in diesem Bsp ist die MessageBoxA-Function exportiert.
Wenn man jetzt die Functionsadresse auf eine andere Adresse umbiegt bez diese ?berschreibt werden s?mptliche
Aufr?ffe dieser Function umgeleitet wobei die alte immer noch vorhanden bleibt man muss sich nur die alte merken.
PatchFunction (von Hamtaro):
Code
_IMAGE_IMPORT_DESCRIPTOR = packed recordcase Integer of0:(Characteristics: DWORD);1:(OriginalFirstThunk:DWORD;TimeDateStamp:DWORD;ForwarderChain: DWORD;Name: DWORD;FirstThunk: DWORD);end;IMAGE_IMPORT_DESCRIPTOR=_IMAGE_IMPORT_DESCRIPTOR;PIMAGE_IMPORT_DESCRIPTOR=^IMAGE_IMPORT_DESCRIPTOR;
Code
procedure PatchIAT(strMod : Pchar; Alt, Neu : Pointer);varpImportDir : pImage_Import_Descriptor;size : CardinaL;Base : Cardinal;pThunk : PDWORD;beginBase := GetModuleHandle(0);pImportDir := ImageDirectoryEntryToData(Pointer(Base),True,IMAGE_DIRECTORY_ENTRY_IMPORT,size);while pImportDIr^.Name <> 0 Do begin If (lstrcmpiA(Pchar(pImportDir^.Name+ Base),strMod) = 0) then begin pThunk := PDWORD(Base + pImportDir^.FirstThunk); While pThunk^ <> 0 Do begin if DWORD(Alt) = pthunk^ Then begin pthunk^ := Cardinal(Neu); end; Inc(pThunk); end; end; Inc(PImportDir);end;end;
Eine kleine Modifikation, die die Sache aber viel praktischer macht:
Code
procedure PatchIAT(Base : Cardinal; strMod : Pchar; Alt, Neu : Pointer);
var
pImportDir : pImage_Import_Descriptor;
size : CardinaL;
//Base : Cardinal;
pThunk : PDWORD;
begin
pImportDir := ImageDirectoryEntryToData(Pointer(Base),True,IMAGE_DIRECTORY_ENTRY_IMPORT,size);
while pImportDIr^.Name <> 0 Do begin
If (lstrcmpiA(Pchar(pImportDir^.Name+ Base),strMod) = 0) then begin
pThunk := PDWORD(Base + pImportDir^.FirstThunk);
While pThunk^ <> 0 Do begin
if DWORD(Alt) = pthunk^ Then begin
pthunk^ := Cardinal(Neu);
end;
Inc(pThunk);
end;
end;
Inc(PImportDir);
end;
end;
Alles anzeigen
man will ja nicht immernur die Funktionen der Exe hooken, sondern auch der DLL-Module