Home | Chi sono | Contattami
 

Progr. lineare

Delphi
 
Componenti
  Database
 
Miei articoli

Windows

Miei articoli 

 

Intercettare le api di Windows su qualsiasi processo diverso da quello corrente
 

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 ha

1) Esempio

2) MessageDlgDll

3) HookProject

Api_hook.zip

 

 
 
Your Ad Here