Ping sans rawsocket et sans ms-dos (fonctionne sous nt4 en mode utilisateur)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 459 fois - Téléchargée 30 fois

Contenu du snippet

Voici le problème que j'avais, je doit réaliser un petit pingueur pour une société, la compilation marche parfaitement chez moi, et au moment de l'installé dans la société, impossible de l'executer, rien ne marche....

apres plusieurs recherche je me rend compte que cela viens du RAW-SOCKET qui ne peut pas être executer sous windows en mode simple utilisateur.

Apres quelques recherche je suis tombé sur cette excelente source.
qui n'utilise ni RAW-socket, ni commande MS-DOS

Source / Exemple :


#include <iostream.h>
#include <winsock.h>
#include <windowsx.h>
file://#include "icmpdefs.h"
 
typedef struct {
    unsigned char Ttl;                         // Time To Live
    unsigned char Tos;                         // Type Of Service
    unsigned char Flags;                       // IP header flags
    unsigned char OptionsSize;                 // Size in bytes of options data
    unsigned char *OptionsData;                // Pointer to options data
} IP_OPTION_INFORMATION, * PIP_OPTION_INFORMATION;
 
typedef struct {
    DWORD Address;                             // Replying address
    unsigned long  Status;                     // Reply status
    unsigned long  RoundTripTime;              // RTT in milliseconds
    unsigned short DataSize;                   // Echo data size
    unsigned short Reserved;                   // Reserved for system use
    void *Data;                                // Pointer to the echo data
    IP_OPTION_INFORMATION Options;             // Reply options
} IP_ECHO_REPLY, * PIP_ECHO_REPLY;
 

int ping(char* NomHote)
{
    WSAData wsaData;
    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
        return 255;
    }
 
    // Load the ICMP.DLL
    HINSTANCE hIcmp = LoadLibrary("ICMP.DLL");
    if (hIcmp == 0) {
        cerr << "Unable to locate ICMP.DLL!" << endl;
        return 2;
    }
 
    // Look up an IP address for the given host name
    struct hostent* phe;
    if ((phe = gethostbyname(NomHote)) == 0) {
        cerr << "Could not find IP address for " << NomHote << endl;
        return 3;
    }
 
    // Get handles to the functions inside ICMP.DLL that we'll need
    typedef HANDLE (WINAPI* pfnHV)(VOID);
    typedef BOOL (WINAPI* pfnBH)(HANDLE);
    typedef DWORD (WINAPI* pfnDHDPWPipPDD)(HANDLE, DWORD, LPVOID, WORD,
            PIP_OPTION_INFORMATION, LPVOID, DWORD, DWORD); // evil, no?
    pfnHV pIcmpCreateFile;
    pfnBH pIcmpCloseHandle;
    pfnDHDPWPipPDD pIcmpSendEcho;
    pIcmpCreateFile = (pfnHV)GetProcAddress(hIcmp,
            "IcmpCreateFile");
    pIcmpCloseHandle = (pfnBH)GetProcAddress(hIcmp,
            "IcmpCloseHandle");
    pIcmpSendEcho = (pfnDHDPWPipPDD)GetProcAddress(hIcmp,
            "IcmpSendEcho");
    if ((pIcmpCreateFile == 0) || (pIcmpCloseHandle == 0) || 
            (pIcmpSendEcho == 0)) {
        cerr << "Failed to get proc addr for function." << endl;
        return 4;
    }
 
    // Open the ping service
    HANDLE hIP = pIcmpCreateFile();
    if (hIP == INVALID_HANDLE_VALUE) {
        cerr << "Unable to open ping service." << endl;
        return 5;
    }
   
    // Build ping packet
    char acPingBuffer[64];
    memset(acPingBuffer, '\xAA', sizeof(acPingBuffer));
    PIP_ECHO_REPLY pIpe = (PIP_ECHO_REPLY)GlobalAlloc(
            GMEM_FIXED | GMEM_ZEROINIT,
            sizeof(IP_ECHO_REPLY) + sizeof(acPingBuffer));
    if (pIpe == 0) {
        cerr << "Failed to allocate global ping packet buffer." << endl;
        return 6;
    }
    pIpe->Data = acPingBuffer;
    pIpe->DataSize = sizeof(acPingBuffer);      
 
    // Send the ping packet
    DWORD dwStatus = pIcmpSendEcho(hIP, *((DWORD*)phe->h_addr_list[0]), 
            acPingBuffer, sizeof(acPingBuffer), NULL, pIpe, 
            sizeof(IP_ECHO_REPLY) + sizeof(acPingBuffer), 5000);
    if (dwStatus != 0) {
        cout << "Addr: " <<
                int(LOBYTE(LOWORD(pIpe->Address))) << "." <<
                int(HIBYTE(LOWORD(pIpe->Address))) << "." <<
                int(LOBYTE(HIWORD(pIpe->Address))) << "." <<
                int(HIBYTE(HIWORD(pIpe->Address))) << ", " <<
                "RTT: " << int(pIpe->RoundTripTime) << "ms, " <<
                "TTL: " << int(pIpe->Options.Ttl) << endl;
    }
    else {
        cerr << "Error obtaining info from ping packet." << endl;
    }
 
    // Shut down...
    GlobalFree(pIpe);
    FreeLibrary(hIcmp);
    WSACleanup();
    return 0;
}
 
int main(int argc, char* argv[])
{
    // Check for correct command-line args
    if (argc < 2) {
        cerr << "usage: ping <host>" << endl;
        return 1;
    }
    int retval = ping(argv[1]);
    cout << "Code Retour:" << retval;
    return retval;
}
 

file://icmpdefs.h
// Structures required to use functions in ICMP.DLL

A voir également

Ajouter un commentaire

Commentaires

rootroot1985
Messages postés
8
Date d'inscription
lundi 27 octobre 2008
Statut
Membre
Dernière intervention
19 décembre 2008

bon merci pour le code mais j'arrive pas a le faire tourner sur ma machine

le fichier icmpdefs.h n'existe pas.

tu peut me donner le code complet qui comporte ce fichier et merci une autre foi
5h33ck0n
Messages postés
4
Date d'inscription
mardi 20 avril 2004
Statut
Membre
Dernière intervention
26 avril 2004

ca a lair cool comme truc, moi j essai de faire ca mais avec un shellexecut, le pb c'est que je suis en MFC et j'ai un problème de Updatedata, le resultat voulu ne s'affiche seulement après avoir cliquer deux fois sur le bouton !! et la je tombe sur cette source qui a l'air pas mal, mais je comprend pas un truc, le "icmpdefs.h" ! je ne lai pa du tout dans le pc ! (j'ai bien VC++ 6)

merci d avance !!
cs_aardman
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Si tu n'a rien modifié c'est normal, c'est un projet VC++ 6.0,
Dev c++ comprend pas les pragma comments et autres.
cbestern
Messages postés
25
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
17 novembre 2003

je ne sais pas, j'utilise pourant dev-c++, je n'ai rien modifier dans les bibluiothèques, bref, pour tous ceux qui veullent voir un autre: chercher: UN PETIT "PINGER" (WIN32) , c le même style
cs_aardman
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Bizzare, car c'est les meme api que j'utilise.

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.