Comment developper un keylogger en C? [Résolu]

Aumenov 9 Messages postés dimanche 23 décembre 2007Date d'inscription 13 janvier 2008 Dernière intervention - 23 déc. 2007 à 22:42 - Dernière réponse : cs_vicenzo 179 Messages postés mardi 16 août 2005Date d'inscription 25 août 2010 Dernière intervention
- 26 déc. 2007 à 12:11
Salut,

Je souhaite développer un keylogger en C. J'ai trouvé sur ce site un code qui permet de le faire :
http://www.cppfrance.com/infomsg_COMPILATION-DRIVER-WINDOWS_918558.aspx

Mais je souhaite plutot, pour une initiation,  comprendre comment programmer un keylogger: quelles sont les différentes étapes en détails. Connaissez vous des sites qui en parlent?

Merci beaucoup

Bonnes fetes
Afficher la suite 

Votre réponse

16 réponses

Meilleure réponse
cs_vicenzo 179 Messages postés mardi 16 août 2005Date d'inscription 25 août 2010 Dernière intervention - 24 déc. 2007 à 07:33
3
Merci
En C90 -> déclaration obligatoire des variables en début de bloc
En C99 -> déclaration des variables n'importe ou dans les blocs pour augmenter la compatibilité avec le C++

Les compilateurs C de Microsoft (VC++, VS200X) sont quasiment les seuls à ne pas implémenter du tout le C99.

Merci cs_vicenzo 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_vicenzo
cs_vicenzo 179 Messages postés mardi 16 août 2005Date d'inscription 25 août 2010 Dernière intervention - 23 déc. 2007 à 23:21
0
Merci
des dizaines de sources de keylogger ont été soumis sur cppfrance. Il n'y a que l'embarras du choix !

Fais une recherche par mot clé 'keylogger'..
Commenter la réponse de cs_vicenzo
Aumenov 9 Messages postés dimanche 23 décembre 2007Date d'inscription 13 janvier 2008 Dernière intervention - 24 déc. 2007 à 00:52
0
Merci
J'ai commencé la programmation et je me trouve confronté à un problème lors de la compilation. Je vous mets ci-dessous le code de la fonction où se produit l'erreur.
KTIMER est défini dans la bibliothèque ntddk.h. Je fais l'inclusion de cette dernière mais j'ai le message d'erreur suivant:

c:\monkeylogger\keyslogger.c(21) : error C2275: 'KTIMER' : illegal use of this t
ype as an expression
c:\monkeylogger\keyslogger.c(21) : error C2146: syntax error : missing ';' befor
e identifier 'kTimer'
c:\monkeylogger\keyslogger.c(21) : error C2065: 'kTimer' : undeclared identifier

c:\monkeylogger\keyslogger.c(22) : error C2275: 'LARGE_INTEGER' : illegal use of
 this type as an expression
c:\monkeylogger\keyslogger.c(22) : error C2146: syntax error : missing ';' befor
e identifier 'timeout'
c:\monkeylogger\keyslogger.c(22) : error C2065: 'timeout' : undeclared identifie
r
c:\monkeylogger\keyslogger.c(23) : error C2224: left of '.QuadPart' must have st

#include <ntddk.h>
#include "keysLogger.h"

int numPendingIrps = 0;

//The Unload routine performs any operations that are necessary before the system unloads the driver
VOID Unload( IN PDRIVER_OBJECT pDriverObject){
    
    // Get the pointer to the device extension.
  PDEVICE_EXTENSION pKeyboardDeviceExtension = (PDEVICE_EXTENSION) pDriverObject->DeviceObject->DeviceExtension;
  DbgPrint("Driver Unload Called...\n");

    // Detach from the device underneath that we're hooked to.
      IoDetachDevice(pKeyboardDeviceExtension->pKeyboardDevice);
    DbgPrint("Keyboard hook detached from device...\n");

    // Create a timer.
  KTIMER  kTimer;
  LARGE_INTEGER timeout;
  timeout.QuadPart = 1000000;// .1 s
  KeInitializeTimer(&kTimer);
    
  while(numPendingIrps > 0){
   // Set the timer.
   //les deux fonctions qui suivent prennent en paramètre bel et bien un pointeur sur un KTIMER
   //donc je ne comprend pas pourquoi c'est marqué "illegal use of .... as an expression"!!!!!!!
   KeSetTimer(&kTimer,timeout,NULL);
   KeWaitForSingleObject(&kTimer,Executive,KernelMode,FALSE,NULL);
  }

    // Set our key logger worker thread to terminate.
  pKeyboardDeviceExtension->bThreadTerminate = 1;
    // Wake up the thread if its blocked & WaitForXXX after this call.
  KeReleaseSemaphore(&pKeyboardDeviceExtension->semQueue,0,1,TRUE);

    // Wait until the worker thread terminates.
  DbgPrint("Waiting for key logger thread to terminate...\n");
  KeWaitForSingleObject(pKeyboardDeviceExtension->pThreadObj,Executive,KernelMode,FALSE,NULL);
  DbgPrint("Key logger thread terminated\n");
    // Close the log file.
  ZwClose(pKeyboardDeviceExtension->hLogFile);

    // Delete the device.
  IoDeleteDevice(pDriverObject->DeviceObject);
  DbgPrint("Tagged IRPs dead...Terminating...\n");
  return;
}

Est ce que vous avez une idée  de comment ce problème peut être résolu?

Merci pour votre aide!
Commenter la réponse de Aumenov
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 24 déc. 2007 à 01:02
0
Merci
Si tu compiles en C, les variables doivent être déclarées en début de fonction.

C++ (@++)
Commenter la réponse de SAKingdom
Aumenov 9 Messages postés dimanche 23 décembre 2007Date d'inscription 13 janvier 2008 Dernière intervention - 24 déc. 2007 à 01:41
0
Merci
Effectivement, c'est ça le problème! Est ce que tu m'expliquer pourquoi? merci
Commenter la réponse de Aumenov
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 24 déc. 2007 à 01:55
0
Merci
Non je l'ignore.
En fait, ce n'est pas obligatoirement en début de fonction, ce peut être aussi au début d'un bloque de code:

if (x == 1) {
    int i = 5; // <- VALIDE (utilisable seulement dans ce if)
    printf("%d\n", i);
}

while (x == 1) {

    int i = 5; // <- VALIDE (utilisable seulement dans ce while)

    printf("%d\n", i);

}

etc. etc. etc.

Une fois le code compilé, ça reviendra au même que de l'avoir déclaré en début de fonction. Cependant, la porté de la variable sera limité à son bloque de code.

C++ (@++)
Commenter la réponse de SAKingdom
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 24 déc. 2007 à 10:14
0
Merci
Espérons que ça dure, ce C99 est une daube de nivellement par le bas.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
cs_vicenzo 179 Messages postés mardi 16 août 2005Date d'inscription 25 août 2010 Dernière intervention - 24 déc. 2007 à 11:54
0
Merci
Entièrement d'accord avec toi...

La révision 99 essaie juste de gommer les disparités en C et C++ et comme tu le précises nivelle vers le bas (tableaux dynamiques, ...)
La seule chose qui pourrait m'intéresser ce sont les macro à argument variables...

Noeux Joel !
Commenter la réponse de cs_vicenzo
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 24 déc. 2007 à 16:05
0
Merci
vicenzo >> Oui c'est sûr mais...
Pourquoi avec un compilateur non C99, il faut obligatoirement déclarer ses variables en début de bloc ? C'est une raison esthétique, technique ?
Pour ma part c'est clair que déclarer une variable au début d'un bloc est bien plus lisible que de la déclarer au milieux de nul part mais y a t-il une autre raison ?

C++ (@++)
Commenter la réponse de SAKingdom
cs_vicenzo 179 Messages postés mardi 16 août 2005Date d'inscription 25 août 2010 Dernière intervention - 24 déc. 2007 à 16:48
0
Merci
SAKingDom >> la déclaration en début de bloc est imposé par la norme... Le C99 l'autorise pour s'aligner sur le c++ qui lui l'autorise. Cette fonctionnalité peut être paraître alléchante mais au final c'est plus casse gueule... De plus, quand tes variables sont déclarées en début de bloc, tu ne te poses pas de questions où ta variable a été déclaré. C'est plus simple et donc plus "robuste".
Commenter la réponse de cs_vicenzo
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 24 déc. 2007 à 18:00
0
Merci
Ok merci. C'est donc pour une question de lisibilité.

"Cette fonctionnalité peut paraitre alléchante"

Peut-être quand on débute mais pas quand on a un minimum d'expérience. Rien de plus bordélique dans un code que d'avoir des variables déclaré à droite et à gauche ou ne pas savoir justement où une variable a été déclaré.

J'ai toujours trouvé ça drôle qu'en cours, on nous apprennes à programmer "structuré" et à éviter les break et continue dans une boucle parce que ça fait pas zolie zolie dans un code (ah bon ?) mais que l'on nous autorise à déclarer des variables dans les endroits les plus sombres de notre code.

C++ (@++)
Commenter la réponse de SAKingdom
luhtor 2023 Messages postés mardi 24 septembre 2002Date d'inscription 28 juillet 2008 Dernière intervention - 26 déc. 2007 à 00:37
0
Merci
"tu ne te poses pas de questions où ta variable a été déclaré."
=> Suffit de faire précéder tes variables locales par un "l" (L) pour ne plus te poser la question.



Juste pour rajouter ma sauce. Je suis totalement contre l'argument de la lisibilité de déclarer les variables en début de bloc. Personnellement, je déclare les variables le plus proche possible de leur utilisation pour des questions de lisibilité justement.
Comme quoi, tout ne doit être qu'une histoire d'habitude.
Commenter la réponse de luhtor
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 26 déc. 2007 à 02:28
0
Merci
Fallait que luhtor s'en mêle ;)
"Comme quoi, tout ne doit être qu'une histoire d'habitude."
Sans aucun doute mais je reste sur ma position. Des variables déclarées en début de bloc donne un code plus facilement compréhensible que des variables déclarées un peu partout.

C++ (@++)
Commenter la réponse de SAKingdom
cs_vicenzo 179 Messages postés mardi 16 août 2005Date d'inscription 25 août 2010 Dernière intervention - 26 déc. 2007 à 07:55
0
Merci
Lhutor, la plus part (voir la quasi totalité) des languages procéduraux classiques oblige la déclaration des variables en début de bloc (C, Pascal, ...).

Le C++ (et malheusement le C99 et Java dans la foulée et certians OO que j'oubli) l'autorise. T'es tu jamais demandé pourquoi ?

- à cause des références qui doivent recevoir une valeur lors de leur declaration
- parce que C++ peux retourner un objet
- ....

Donc C++ a eu ses raisons (bien qu'évitables) que le C n'avait pas.

Enfin pour revenir à ta remarque du prefixe 'l' dans les variables locales... Je ne veux relancer pas ce débat stérile mais puisque :
- les variables globales ne devraient être que très rarement utilisées
- Un fonction a généralement plus de variable globale que d'arguments

Si je t'écoutais 90 % de mes variables commancerai par 'l'... Bonjour la visibilité !!!!

Chacun code comme il veux, à la hongroise, à la VB, R&K, ...

Question notation, Kernighan dans son bouquin "l'art de programmer" y fais allusion et prends une position que je trouve juste et pragmatique que je te conseille de lire...

lBonnnes lfêtes let lbonnes lannée !
Commenter la réponse de cs_vicenzo
luhtor 2023 Messages postés mardi 24 septembre 2002Date d'inscription 28 juillet 2008 Dernière intervention - 26 déc. 2007 à 10:57
0
Merci
[auteur/SAKINGDOM/617077.aspx SAKingdom]


"

Fallait que luhtor s'en mêle ;)"
= > Erf, et oui, ma sauce habituelle :)

Moi aussi je reste sur ma position et pour les memes arguments que les tiens ^^.

[auteur/VICENZO/564300.aspx vicenzo]
"- Un fonction a généralement plus de variable globale que d'arguments"
=> Et beh, moi je n'ai JAMAIS de variables globales autre que les variables membres de la classe dans une fonction/méthode.

"Donc C++ a eu ses raisons (bien qu'évitables) que le C n'avait pas."
=> Ca dépend si on considère la possibilité de déclarer ses variables n'importe ou comme un mal :)

"
Si je t'écoutais 90 % de mes variables commancerai par 'l'... Bonjour la visibilité !!!!"
=> Moi je parlais des variables locales (déclarées dans ta fonction) or par définition, une variable globale n'est pas locale... A moins d'un malheureux lapsus ?

"- les variables globales ne devraient être que très rarement utilisées"
=> Bien d'accord, le "l" (L) c'est principalement pour différencier les variables (arguments), des variables (locales), et des variables membres (ah vous etes encore à l'age de pierre ? pas de POO ? bon ok ok, j'arrete ^^). Donc finalement ton 90% tombe plutot a 50%. Encore une fois, ca dépend des habitudes de prog.

Et puis bon, j'invente rien non plus, ces quelques règles de codages, sont aussi celle utilisées dans le monde professionnel auquel j'ai pu etre confronté, comme quoi...

Donc pour conclure, c'est toujours marrant ce genre de débat (stérile ?), car personne ne changera d'avis mais est convaincu qu'il fait mieux que les autres :)
Aller, bonne journée.
Commenter la réponse de luhtor
cs_vicenzo 179 Messages postés mardi 16 août 2005Date d'inscription 25 août 2010 Dernière intervention - 26 déc. 2007 à 12:11
0
Merci
J'ai trop abusé du chocolat ... Il fallait lire bien évidemment lire

"Un fonction a généralement plus de variable locales
que d'arguments..."

bien sur , locale ou au lieu de globale
Commenter la réponse de cs_vicenzo

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.