IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[WIN API] DeviceIoControl


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut [WIN API] DeviceIoControl
    Salut a tous !

    Je développe un " driver " , permettant de cacher un processus dans le Task Manager.

    Mon problème est que je n'arrive pas a envoyer un IOCTL a mon driver , avec la fonction DeviceIoControl. Cette fonction me renvoie une erreur 87,
    ceux qui correspond a: ERROR_INVALID_PARAMETER.

    J'ai tous vérifier plein de fois et je vois vraiment pas où je me suis trompé... :/

    Donc si quelqu'un pourrais m'aider ça serait cool .
    J'espère avoir bien expliqué mon problème, sinon dite le moi...

    Voila le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <windows.h>
    #include <winioctl.h>
     
    #define SIOCTL_TYPE 40000
    #define IOCTL_NAME_PROCESS CTL_CODE(SIOCTL_TYPE, 0x801, METHOD_BUFFERED, FILE_READ_DATA|FILE_WRITE_DATA)
     
    static void purger( void )
    {
        int c;
     
        while( ( c = getchar() ) != '\n' && c != EOF )
        {
        }
    }
     
    static void clean( char *string )
    {
        char *p = strchr( string , '\n' );
     
        if( p )
        {
            *p = 0;
        }
        else
        {
            purger();
        }
    }
     
    int __cdecl main(int argc, char* argv[])
    {
        char *process = ( char* )malloc( sizeof( char ) * 50 );
     
        HANDLE hDevice;
        DWORD d;
        DWORD size = sizeof( process );
     
        BOOL test;
     
        printf("Process name: ");
        fgets( process , sizeof( process ) , stdin );
        clean( process );
     
     
        //hDevice = CreateFile( "\\\\.\\ProcessHide.sys" , GENERIC_READ | GENERIC_WRITE , FILE_SHARE_READ | FILE_SHARE_WRITE , 0 , OPEN_EXISTING ,  FILE_ATTRIBUTE_NORMAL , 0 );
     
        //hDevice = CreateFile( "C:\\Users\\Raphaël\\Documents\\DriverProject\\ProcessHide\\ProcessHide.sys" , GENERIC_READ | GENERIC_WRITE , FILE_SHARE_READ | FILE_SHARE_WRITE , 0 , OPEN_EXISTING ,  FILE_ATTRIBUTE_NORMAL , 0 );
     
        hDevice = CreateFile( ".\\ProcessHide.sys" , GENERIC_READ | GENERIC_WRITE , FILE_SHARE_READ | FILE_SHARE_WRITE , 0 , OPEN_EXISTING ,  FILE_ATTRIBUTE_NORMAL , 0 );
     
        if( hDevice == INVALID_HANDLE_VALUE )
        {
            printf("Error Open Device");
            printf("\nError %d", GetLastError() );
     
            Sleep(1000);
        }
        else
        {
     
            printf("Works ! ");
            Sleep(1000);
        }
     
        test = (BOOL)DeviceIoControl( hDevice , IOCTL_NAME_PROCESS , process , size , NULL , 0 , &d , (LPOVERLAPPED) NULL );
     
        if( test == 0 )
        {
            printf("\nError DeviceIoControl");
            printf("\nErro %d", GetLastError() );
     
            Sleep(1000);
        }
     
     
        CloseHandle( hDevice );
     
        return 0;
     
    }
    Merci d'avance !

    PS: Le prototype de DeviceIoControl est disponible ici => http://msdn.microsoft.com/en-us/librar [...] VS.85%29.aspx

    Et je compile avec gcc ( inclus dans la dernière version de codeblocks )

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Bonjour,
    1. Je n'appelle pas ça un driver, mais un rootkit. Cela va à l'encontre de tous mes principes, je refuse donc de t'aider.
    2. J'ai déjà vu une erreur flagrante, mais j'ignore si c'est vraiment elle qui fait foirer la fonction.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut
    Mon but n'est pas de faire un rootkit , mais simplement d'apprendre a coder ce genre de logiciel , pour faire un article pour mon labo.

    Libre a toi de me dire l'erreur que tu a vu ou pas.

    Merci quand meme d'avoir répondu.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je vais t'accorder le bénéfice du doute pour l'instant.
    L'erreur est présente dans ton utilisation de sizeof(), qui te retourne la taille du pointeur et non celle de la zone mémoire allouée.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut
    Deja merci de me faire confiance !

    Ensuite effectivement j'avais pas vu cette erreur , j'ai donc remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DWORD size = sizeof( process );
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DWORD size = sizeof( *process );
    Cependant ça me renvoie la même erreur...

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ça ne change rien.
    L'opérateur sizeof est 100% statique, et ne marche pas sur les zones mémoire allouées dynamiquement.*

    *sauf dans le cas des Variable-Length Arrays (VLAs) de la norme C99, mais c'est vraiment un cas à part.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut
    D'accord , je ne savais pas.

    J'ai essayer aussi comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test = (BOOL)DeviceIoControl( hDevice , IOCTL_DRV_INIT , process , (DWORD)strlen( process ) , NULL , 0 , &d , (LPOVERLAPPED) NULL );
    mais toujours pareil...

    Es ce que l'erreur viens forcément de ce code ou de celui du driver même ?

    Peut-être que le IOCTL que j'ai fait n'est pas coder comme il faut, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define SIOCTL_TYPE 40000
    #define IOCTL_NAME_PROCESS CTL_CODE(SIOCTL_TYPE, 0x801, METHOD_BUFFERED, FILE_READ_DATA|FILE_WRITE_DATA)
    Pourtant j'ai vu plusieurs code similaire au mien , qui devrait normalement marcher , mais j'ai toujours eu ce type d'erreur...

    Par exemple sur les codes que j'ai vu , il utilise la fonction CreateFile de cette maniére:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hDevice = CreateFile( "\\\\.\\ProcessHide.sys" , GENERIC_READ | GENERIC_WRITE , FILE_SHARE_READ | FILE_SHARE_WRITE , 0 , OPEN_EXISTING ,  FILE_ATTRIBUTE_NORMAL , 0 );
    Sauf que moi je suis obliger d'enlever les "\\\\" dans le premier argument.
    Sinon j'ai une erreur comme quoi il ne trouve pas le .sys.

    Désolé de te bombarder de question , mais ça doit faire 3 semaines que je bloque sur cette erreur... :/

    PS: Je code sur Windows 7 Pro.

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Désolé, je ne m'y connais pas sur la création d'IOCTL ni de driver. J'ai juste employé DeviceIoControl() quelques fois dans un projet de défragmenteur.

    Ce que je peux te dire, c'est que je ne vois pas de raison de modifier le nom de fichier dans CreateFile() si CreateFile() réussit.

    Aussi, pour la taille à envoyer, eh bien ça dépend de ce que le driver attend... Mais je parierai pour strlen()+1.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut
    D'accord merci de m'avoir deja expliquer 2-3 truc .

    Je vais essayer de tester un peu tous ça pour voir.

Discussions similaires

  1. [Win API] problème avec WriteFile
    Par acryline dans le forum Windows
    Réponses: 5
    Dernier message: 02/11/2006, 09h26
  2. Win API : GetOpenFileName
    Par acryline dans le forum Windows
    Réponses: 4
    Dernier message: 02/11/2006, 08h16
  3. [Win API] insérer une flexgrid.(c' est une grille)
    Par bmatthieu3 dans le forum Windows
    Réponses: 3
    Dernier message: 15/10/2006, 14h26
  4. [Win API] insérer une flexgrid
    Par bmatthieu3 dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 09/10/2006, 16h46
  5. Réponses: 4
    Dernier message: 05/09/2005, 16h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo