2009-05-11 6 views
2

Tout d'abord, le keylogger que je développe n'est pas du tout à des fins offensives et destructrices. :)Problème de keylogger Client Monitoring

Je développe une application de surveillance client en C# .NET. Keylogging est l'une des fonctionnalités de mon application. Bien que j'ai développé le code pour le keylogger, je n'ai pas été en mesure de l'implémenter correctement dans mon application.

Il y a deux projets dans ma solution. UserInterface - côté serveur. Le Tracker - pour les PC côté client. Le module keylogging Keylogger fait partie du projet Tracker.

J'ai utilisé les classes auxiliaires pour la programmation de socket - TcpClient, TcpListener et NetworkStream pour les aider.

En outre, j'utilise le mode asynchrone pour la communication.

Je posterai la partie du code avec lequel je suis confronté au problème:

//This code resides on the server-side monitoring interface.When //the administrator hits a btnKeyLog button, a 

message //"StartKeyLog" is sent to the respective client, and the keylogging //is handled on the client. 

private void (object sender, EventArgs e) {btnKeyLog_Click MessageBuffer = new byte [100];

if (btnKeyLog1.Text == "Start Keylogging") 
    { 
     btnKeyLog1.Text = "Stop Keylogging"; 
     message = "StartKeyLog"; 

     messageBuffer = Encoding.ASCII.GetBytes (message); 
     try 
     { 
       //begin writing on the stream. 
     clientConnections[0].networkStream.BeginWrite (messageBuffer, 0, messageBuffer.Length, new 

AsyncCallback (onDataWrite), null); 
     } 
     catch (Exception exc) 
     { 
      MessageBox.Show (exc.Message + exc.StackTrace); 
     } 
    } 
    else 
    { 
     btnKeyLog1.Text = "Start Keylogging"; 
     message = "StopKeyLog"; 

     messageBuffer = Encoding.ASCII.GetBytes (message); 
     try 
     { 
     clientConnections[0].networkStream.BeginWrite (messageBuffer, 0, messageBuffer.Length, new 

AsyncCallback (onDataWrite), null); 
     } 
     catch (Exception exc) 
     { 
      MessageBox.Show (exc.Message + exc.StackTrace); 
     } 
    } 
} 

Maintenant, le code côté client:

public void onDataReceived (IAsyncResult ar) 
{ 
    int nBytesRead = 0; 
    try 
    { 
     nBytesRead = clientConnection.networkStream.EndRead (ar); 
    } 
    catch (Exception exc) 
    { 
     MessageBox.Show (exc.Message + exc.StackTrace); 
    } 
    message = Encoding.ASCII.GetString (messageBuffer,0, nBytesRead); 
    switch (message) 
    { 
     case "StartKeyLog" : 
      MessageBox.Show ("Keylogger started."); 
         //the following static method wraps the Win32 //implementation of SetWindowsHookEx - all given in Keylogger //module 
      KeyboardHook.installHook (); 
         //after this method is called, the hook is //actually installed; the callback function KeyboardHookProc is also //called.   

    Here, keylogger seems to be working fine, except that the //system slows down considerably when i type keystrokes. 
     break; 

     case "StopKeyLog": 
      MessageBox.Show ("Keylogger stopped."); 
         // the following method releases the hook 
      KeyboardHook.releaseHook (); 
     break; 
    } 

    try 
    { 
     messageBuffer = new byte[100]; 
     clientConnection.networkStream.BeginRead (messageBuffer, 0, messageBuffer.Length, new AsyncCallback (onDataReceived), null); 
    } 
    catch (Exception exc) 
    { 
     MessageBox.Show (exc.Message + exc.StackTrace); 
    } 
    //MessageBox.Show ("Stop"); 
//as soon as this function ends, however, the callback function of //the keyboard hook stops being called; keystrokes are not //processed. 
//the keystrokes are caught until this function the control is in this //function. i assume that it has to do something with the thread. 
} 

Je suis en train d'expliquer la situation ici. Pour démarrer le keylogging, l'interface utilisateur du serveur envoie un message "StartKeyLog" au client. A la réception du message, le client le traitera dans la fonction de rappel "onDataReceived". Dans cette fonction, le message est traité et la méthode

installHook() est appelée, qui installe le hook.

Lorsque j'ai exécuté l'application, le crochet a été installé; En outre, le rappel KeyboardHookProc() a été appelé correctement et les séquences de touches ont été traitées. Mais ce

était seulement le cas jusqu'à ce que la méthode de rappel onDataReceived soit vivante. Dès que cette méthode s'est terminée, KeyboardHookProc() a cessé d'être appelé; Les clés

ne sont plus traitées, comme si le crochet n'avait jamais été installé.

Un autre problème était qu'après l'installation du crochet, le système devenait très lent lorsque je frappais une touche quelconque. Mon hypothèse est que les deux choses ont quelque chose à voir avec le threading qui se passe ici. Mais, je ne suis pas en mesure d'obtenir le problème exact. J'ai fait de mon mieux pour expliquer la situation. Toutes les questions sont les bienvenues. Quelqu'un pourrait-il me fournir la solution?

Répondre

0

Eh bien, j'ai réussi à résoudre mon problème. Le problème était que je mettais le crochet sur un fil que le fil principal de mon application avait invoqué. Enfait, j'avais commencé ce fil juste pour installer le crochet. Je viens de restructurer mon code pour que le hook soit installé sur le thread principal. Il a résolu tout le problème.:)

0

Vous devez ajouter le code de votre KeyboardHook.

Questions connexes