Traceroute (sans raw ping)

Soyez le premier à donner votre avis sur cette source.

Vue 9 983 fois - Téléchargée 632 fois

Description

un traceroute tout con avec les api de icmp.dll

merci à aardman pour sa source sur l 'icmp...

Source / Exemple :


#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")

typedef unsigned long IPAddr;

typedef struct ip_option_information {  
	UCHAR Ttl;  
	UCHAR Tos;  
	UCHAR Flags;  
	UCHAR OptionsSize;  
	PUCHAR OptionsData;
} IP_OPTION_INFORMATION, *PIP_OPTION_INFORMATION;

typedef struct icmp_echo_reply {  
	IPAddr Address; 
	ULONG Status;  
	ULONG RoundTripTime;  
	USHORT DataSize;  
	USHORT Reserved; 
	PVOID Data;  
	IP_OPTION_INFORMATION Options;
} ICMP_ECHO_REPLY, *PICMP_ECHO_REPLY;

typedef DWORD (WINAPI *ICMPSendEcho)(
  HANDLE IcmpHandle,
  IPAddr DestinationAddress,
  LPVOID RequestData,
  WORD RequestSize,
  PIP_OPTION_INFORMATION RequestOptions,
  LPVOID ReplyBuffer,
  DWORD ReplySize,
  DWORD Timeout
);

typedef HANDLE (WINAPI *ICMPCreateFile)(void);
typedef BOOL (WINAPI *ICMPCloseHandle)( HANDLE IcmpHandle);

ICMPSendEcho	pIcmpSendEcho;
ICMPCreateFile	pIcmpCreateFile;
ICMPCloseHandle pIcmpCloseHandle;

struct hostent *host;
struct ip_option_information ip_option;

SOCKADDR_IN Addr;
ICMP_ECHO_REPLY *replyinfo;

BOOL fonction()
{

HINSTANCE hIcmpDll;
hIcmpDll = LoadLibrary ("icmp.dll"); 
if (hIcmpDll != NULL)
    {
		pIcmpSendEcho = (ICMPSendEcho)GetProcAddress( hIcmpDll, "IcmpSendEcho" );
		if( !pIcmpSendEcho )
			{
			return FALSE;
			}

		pIcmpCreateFile = (ICMPCreateFile)GetProcAddress( hIcmpDll, "IcmpCreateFile" );
		if( !pIcmpCreateFile )
			{
			return FALSE;
			}
		pIcmpCloseHandle = (ICMPCloseHandle)GetProcAddress( hIcmpDll, "IcmpCloseHandle" );
		if( !pIcmpCloseHandle )
			{
			return FALSE;
			}
	}
else
	return FALSE;

FreeLibrary( hIcmpDll );

return TRUE;
}

int main(int argc,char *argv[])
{
int z;

HANDLE hICMP;
WSADATA wsa;

char *DataBuffer;
char *ReplyBuffer;

WORD size=0;
char *AddrIP = NULL;

if(argc!=3)
{
	printf("%s destination + taille du packet",argv[0]);
	return -1;
}
else
AddrIP	= argv[1];
size	= atoi(argv[2]);

if(size < 0 || size > 102400)
{
	printf("%s destination + taille du packet (0 - 102400)",argv[0]);
	return -1;
}

if((WSAStartup(0x02, &wsa))!=0)
{
	printf("erreur WSAStartup %d",WSAGetLastError());
	return -1;
}
	
if(!fonction())
{
	printf("erreur fonction");
	return -1;
}

hICMP = pIcmpCreateFile();
if(hICMP == INVALID_HANDLE_VALUE)
{
	printf("erreur IcmpCreateFile %d",GetLastError());
	return -1;
}

z=1;

do
{
	ip_option.Ttl=(unsigned char)z;

	host = gethostbyname(AddrIP);
	if(host == NULL)
	{
		printf("erreur gethostbyname %d",WSAGetLastError());
		return -1;
	}

	Addr.sin_addr.s_addr=*((u_long*)host->h_addr_list[0]);

	ReplyBuffer = (char *)malloc(256+size+1);
	DataBuffer = (char *)malloc(size+1);

	memset(ReplyBuffer, 0, 256+size+1);
	memset(DataBuffer, 'F', size);

	if(!pIcmpSendEcho(
		hICMP,
		Addr.sin_addr.s_addr, 
		DataBuffer, 
		size, 
		&ip_option, 
		ReplyBuffer, 
		256+size,
		2000))

			{
			if(GetLastError() == WSA_QOS_ADMISSION_FAILURE)
				{
				printf("%02d RTT: NULL,\tTTL: %d\t",z,replyinfo->Options.Ttl );
				printf(" inconnu ");
				break;
				}
			else
				{
				printf("erreur IcmpSendEcho %d",GetLastError());
				return -1;
				}
			}
		
	replyinfo = (struct icmp_echo_reply *)ReplyBuffer;

	printf("%02d RTT: %dms\tTTL: %d\t",z,replyinfo->RoundTripTime,replyinfo->Options.Ttl );

	host = gethostbyaddr((char *)&replyinfo->Address,4,PF_INET);
	if ( host != 0) 
		
        printf(" %s\n",host->h_name);
	else 
		printf(" %s\n",inet_ntoa(*(struct in_addr *) &replyinfo->Address));

z++;
}
while (!replyinfo->Status == 0);

pIcmpCloseHandle(hICMP);
WSACleanup();
free(ReplyBuffer);
free(DataBuffer);
return 0;

}

Conclusion :


je débute en c/c++ donc premier programe pas trop complex
laissez vos commentaires :)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2
Date d'inscription
mardi 29 mars 2005
Statut
Membre
Dernière intervention
8 février 2006

slt voilà le problème que j'ai eu en executant ton code:
error C2065: 'WSA_QOS_ADMISSION_FAILURE' : undeclared identifier

j'ai chercher par tout mais j'arrive pas à reseoudre ce bleme!!!
merci d'avance!!!
Messages postés
1
Date d'inscription
mercredi 12 juin 2002
Statut
Membre
Dernière intervention
26 octobre 2005

Messages postés
1
Date d'inscription
mardi 25 mars 2003
Statut
Membre
Dernière intervention
17 novembre 2003

Salut,
moi aussi je débute en C/C++, et je pense que quelque commentaires dans t'a source serais le bien venu pour nous autres novices...
Mais c'est pas mal, continue comme ca...

@+
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Content que ca ai pu te servir!

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.