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!