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?
cs_vicenzo
Messages postés178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 24 déc. 2007 à 07:33
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.
Aumenov
Messages postés9Date d'inscriptiondimanche 23 décembre 2007StatutMembreDernière intervention13 janvier 20084 24 déc. 2007 à 00:52
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!
Vous n’avez pas trouvé la réponse que vous recherchez ?
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 24 déc. 2007 à 01:55
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.
cs_vicenzo
Messages postés178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 24 déc. 2007 à 11:54
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...
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 24 déc. 2007 à 16:05
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 ?
cs_vicenzo
Messages postés178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 24 déc. 2007 à 16:48
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".
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 24 déc. 2007 à 18:00
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.
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 26 déc. 2007 à 00:37
"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.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 26 déc. 2007 à 02:28
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.
cs_vicenzo
Messages postés178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 26 déc. 2007 à 07:55
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...
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 26 déc. 2007 à 10:57
[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.