Newsgroup: it.comp.programmare.win32
Titolo: Key Logger

Come promesso un po` di giorni fa, invio il link di un semplice key
logger.  E` in Delphi ma e` facilmente adattabile, scorgendo i
sorgenti, in qualsiasi altro linguaggio:
http://www.geocities.com/andrealaforgia/keylogger.zip

ossia !!!!!!!!!
cosa dovrebbe essere ??
"Andrea Laforgia" <x@x.x> ha scritto nel messaggio
news:u8m9uuk49pobtsmvi...@4ax.com...


cosa dovrebbe essere ??
Vedi messaggio in questo gruppo, intitolato "Keylogger" di Vinz486,
del 18/11/2002 alle 22.59.

> 
http://www.geocities.com/andrealaforgia/keylogger.zip
Grazie. Ma nel frattempo ho sbattuto la testa e sono riuscito a farlo
da solo in VC++
Invece che scrivere sul file dalla dll, ho preferito inviare un
user-message all'exe con il carattere premuto nei parametri.
Funziona perfettamente tranne che per un piccolo particolare:
Aprendo un terminale DOS (sotto XP) i caratteri digitati non appaiono.
Il keylogger li riceve, ma alla finestra dos non arriva nulla.
Non capisco il perchč...

 >> sorgenti, in qualsiasi altro linguaggio:
Caro Andrea Laforgia,
sono una programmatrice mediocre che non riesce a trasportare il tuo
programma in c++Builder...
Ho fatto tutto a dovere (cosi' almeno credevo) anche rifacendomi alle
windows sdk.
Ho creato la:
LRESULT __stdcall KeyboardProc(int Code, WPARAM WP, LPARAM LP)
{
if (Code>0) PostMessage(HWND_BROADCAST, WMKeyNotify, WP, LP);
return      CallNextHookEx(HookHandle,Code,WP,LP);
}
Che poi richiamo con:
extern "C" __declspec(dllexport) void InstallKeyboardSystemWideHook()
{
HookHandle = SetWindowsHookEx(
    WH_KEYBOARD,
    &KeyboardProc,
    GetModuleHandle("DllLoggia.dll"),
    0);
}
Niente, mi da questo errore, e non so.. forsedevo fare un cast a void dei
parametri della funzione?
[C++ Error] UnitDllLogger.cpp(50): E2034 Cannot convert 'long (__stdcall
*)(int,unsigned int,long)' to 'int (__stdcall *)()'
[C++ Error] UnitDllLogger.cpp(50): E2342 Type mismatch in parameter 'lpfn'
(wanted 'int (__stdcall *)()', got 'long (__stdcall *)(int,unsigned
int,long)')

int,long)')
Se non ricordo male, in C++ Builder c'e` da giocare con:
#define STRICT
#define WIN32_LEAN_AND_MEAN

-> ogni programma la ricarica.
L'hook viene installato 1 sola volta.  
Della DLL viene, poi, sfruttata solo la callback.

    0);
La dll la carico con LadLibrary e poi uso una sua funzione per settare
l'hook. In questo modo l'handle è già all'interno della dll e lo salvo
una sola volta sulla Process Attach.
Comunque sia appena risolvo un fastidiosissimo problema (i tasti
digitati in finestra dos non appaiono anche se la HOOK li riceve..) vi
posto un link dove sacricare il sorgente in VC++ (come non mi ricordo
chi aveva chiesto).
Per il builder... non saprei.
Penso che ci sia solo da correggere l'impostazione del data segment
condiviso.
Poichè la dll è caricata da tutti i processi che fanno usa della
tastiera, anche le proprie variabili diventano parte dell processo che
la usa.
Salvando quindi un qualsiasi handle, questo sarà diverso per ogni
processo che carica la dll. Per risolvere questo problema è necessario
usare un'area di memoria condivisa da tutti i processi che usano la
dll.
In VC si fa cosi:
#pragma data_seg ("shared")
static HHOOK hhook = NULL;			//handle dell'hook
static HANDLE hMod = NULL;			//handle di questa dll
#pragma data_seg ()
//
L'inizializzazione delle variabili è OBBLIGATORIA altrimenti non
funge.
Poi in Project->Settings TAB Link bisogna aggiungere
/SECTION:shared,RWS
che indica al linker che i dati compresi nel data_seg() di nome
"shared" sono accessibili in lettura(R) scrittura(W) e sono
condivisi(S).
Chi usa Builder dovrà trovare il parametro giusto da aggiungere alle
opzioni del linker. Credo che nell'help ci sia un qualche riferimento.

if (nCode < 0)  return CallNextHookEx(hhook, nCode, wParam, lParam);
Il codice che io ho scritto nella DLL e` corretto.
Se Code > 0 allora puoi comunicare il tasto alla tua applicazione.
Ma CallNextHookEx e` bene che sia chiamata *sempre*, a fine
elaborazione.  L'unico accorgimento e` che se Code < 0 allora devi
saltare la tua elaborazione e passare direttamente a questa chiamata.