procedure TForm1.FormCreate(Sender: TObject);
var lib: hModule;
begin
lib := LoadLibrary('
Kernel32.dll');
if Lib <> INVALID_HANDLE_VALUE
then
try
FindNextOld := GetProcAddress(Lib,'
FindNextFileA');
finally
FreeLibrary(lib);
end;
end;
procedure TForm1.Button7Click(Sender: TObject);
var hProc: THandle;
br,old: Cardinal;
jmp: Pointer;
begin
GetMem(jmp,5);
hProc := GetCurrentProcess;
try
// Sicherung anlegen und in FinNextHooked schreiben
VirtualProtect(@FindNextOld,5,PAGE_EXECUTE_WRITECOPY,old);
GetMem(Sicherung,5);
ReadProcessMemory(hProc,@FindNextOld,Sicherung,5,br);
WriteProcessMemory(hProc,@FindNextHooked,Sicherung,5,br);
// Schreiben
PByte(jmp)^ := $E9;
inc(PByte(jmp));
PCardinal(jmp)^ := Cardinal(@FindNextHooked) - Cardinal(@FindNextOld) - 5;
dec(PByte(jmp));
WriteProcessMemory(hProc,@FindNextOld,jmp,5,br);
finally
FreeMem(jmp);
CloseHandle(hProc);
end;
end;
// geht nur mit globalen variablen irgendwie.. o.O
var param1: THandle;
param2: PWin32FindData;
procedure FindNextHooked;
asm
nop
// 5 Bytes für den gesicherten FindNextFileA-Code
nop
nop
nop
nop
// Parameter1 (THandle) sichern
mov Param1,eax
// Parameter2 (PWin32FindData) sichern
push esi
mov esi,[ebp+$0C]
mov Param2, esi
pop esi
// Parameter ablegen
mov eax, Param2
push eax
mov eax, Param1
push eax
// Adresse von FindNextFileA ab Byte 6 in eax schieben
mov eax,FindNextOld
add eax,5
// Rücksprungadresse = Hier hin zurück! *)
lea esi, FindNextHooked
// FindNextFileA (ab Byte 6) aufrufen
call eax
// AfterFindNext aufrufen *)
jmp AfterFindNext
end;
// Darin will ich die Ergebnisse von FindNext auswerten/verändern
function AfterFindNext(hFindFile: THandle;
var lpFindFileData: TWIN32FindData): BOOL;
stdcall;
begin
Result := true;
// debug
ShowMessage('
hi!');
// debug
end;