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 :)
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.