|
Sul sito Delphi jedi si
trovano numerose librerie per Delphi. La Jedi code library (JCL) è veramente
interessante: la unit JclPEImage in particolare contiene componenti per la
manipolazione di eseguibili (esame della struttura di un eseguibile, elenco
funzioni importate, esportate, etc...) tra i quali anche dei componenti per
intercettare le api di windows. Il componente TJclPeMapImgHooks si occupa
proprio di questo. Tra gli esempi disponibili con la JCL ce n' è appunto
uno che ci consente di valutare il funzionamento del suddetto componente.
Tuttavia l' intercettazione delle api di Windows avviene a livello del processo
corrente; così ho pensato che poteva essere interessante sviluppare degli esempi
che dimostrassero l' utilizzo del componente in questione per l' intercettazione
delle api di Windows in qualsiasi processo diverso da quello corrente. In realtà
non ci è voluto molto: basta dare un' occhiata all' articolo
articolo34.htm per rendersi conto di come sia
possibile ed immediato eseguire del codice come thread di un altro processo.
Come esempio mi sono creato 3 applicativi con l' obiettivo di intercettare e
personalizzare l' api MessageBoxA:
1) applicativo che, in seguito alla pressione di un tasto, chiama l' api
MessageBoxA con determinati parametri
2) dll il cui entry point consiste nella creazione del componente
TJclPeMapImgHooks e nella successiva chiamata al metodo HookImport di quest'
ultimo passandogli come paramateri il nome della funzione che si vuole
intercettare (MessageBoxA), il nome della dll in cui è implementata
(user32.dll), un puntatore alla funzione medesima, un puntatore alla funzione
che la deve sostituire (implementata nella stessa dll).
3) applicativo che, chiamando il metodo InjectDll (esposto appunto nell'
articolo articolo34.htm) mappa la dll al punto 2)
nello spazio di memoria del processo al punto 1): a questo punto l' applicativo
al punto 1), in seguito alla pressione del tasto, chiamerà la versione
modificata definita nella dll al punto 2) e di conseguenza il messaggio a video
avrà caratteristiche differenti (in questo caso la funzione di sostituzione va
a modificare caption e testo).
Vado ad esporre il sorgente della dll
library MessageDlgDll;
uses
Windows,
SysUtils,
Classes,
JclPeImage, JclSysUtils;
{$R *.RES}
var
PeImportHooks: TJclPeMapImgHooks;
OldMessageBoxA: function(hWnd: HWND;
lpText,
lpCaption: PAnsiChar;
uType: UINT
): Integer; stdcall = nil;
function NewMessageBoxA(hWnd: HWND;
lpText,
lpCaption: PAnsiChar;
uType: UINT
): Integer; stdcall;
begin
lpText := pAnsiChar(string(lpText) + 'hackerato');
lpCaption := pAnsiChar('api interception');
Result := OldMessageBoxA(hWnd, lpText, lpCaption, uType);
end;
procedure EntryPointProc(reason: integer);
var
str: pChar;
begin
case reason of
DLL_PROCESS_ATTACH:
begin
PeImportHooks := TJclPeMapImgHooks.Create;
PeImportHooks.HookImport(Pointer(GetModuleHandle(nil)),
user32,
'MessageBoxA',
@NewMessageBoxA,
@OldMessageBoxA);
end;
DLL_THREAD_ATTACH:
begin
end;
DLL_PROCESS_DETACH:
begin
FreeAndNil(PeImportHooks);
end;
DLL_THREAD_DETACH:
begin
end;
end;
end;
begin
DllProc := @EntryPointProc;
EntryPointProc(DLL_PROCESS_ATTACH);
end.
di seguito il sorgente ed il binario dei 3 applicativi: con riferimento ai 3 punti elencati precedentemente si ha1) Esempio 2) MessageDlgDll 3) HookProject Api_hook.zip |