Здравствуйте! При попытке пинга роутера, ответ приходит, но с внешнего узла ответа нет. В чём может быть причина? Структуры:
| Код | #pragma pack(push,1) //Ethernet Header typedef struct ethernet_header { UCHAR dest[6]; //Total 48 bits UCHAR source[6]; //Total 48 bits USHORT type; //16 bits }ETH_HDR; #pragma pack(pop)
#pragma pack(push,1) typedef struct IP_header { unsigned char ver; unsigned char ServicesField; unsigned short TotalLength; unsigned short Identification; unsigned short FragmentFlags; unsigned char TimeToLive; unsigned char NextProtocol; unsigned short Checksum; unsigned int ip_srcaddr; // Source address unsigned int ip_destaddr; // Destination address }IP_HDR; #pragma pack(pop)
#pragma pack(push,1) typedef struct ICMP_HEADER { unsigned char type; unsigned char code; unsigned short checksum; unsigned short id; unsigned short seqno; }ICMP_HDR; #pragma pack(pop)
|
........................
| Код | unsigned char Data_ICMP[32] = {0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69};
// char ip[16]; unsigned char s_mac[6], d_mac[6], packet[0x4A]; char *temp_packet; ETH_HDR eth_header; IP_HDR ip_header; ICMP_HEADER ping_header; // FILE *in, *out, *last; char ip_source[] = "192.168.0.13";//адрес сетевой карты //char ip_dest[16]; char ip_dest[] = "192.168.0.1";//адрес роутера
DWORD pcap; //////////////////////// HANDLE hThread;//Поток DWORD dwThreadId;// Id потока //
USHORT Checksum(PUCHAR Data, USHORT Length ) { ULONG Sum = 0; USHORT ShortSum = 0; PUSHORT WordData = (PUSHORT) Data; USHORT WordCount = Length >> 1;
while( WordCount-- ) Sum += *WordData++;
if( Length & 1 ) Sum += *(PUCHAR)WordData;
Sum = (USHORT) Sum + (Sum >> 16) & 0xFFFF; ShortSum = (USHORT) Sum + (USHORT)(Sum >> 16); return (ShortSum != 0xFFFF) ? ~ShortSum : ShortSum; }
/////////////////
DWORD WINAPI scan(LPVOID param) {
//Заполнение пакета Ethernet memcpy(ð_header.dest, d_mac, 6); memcpy(ð_header.source, s_mac, 6); eth_header.type = htons(0x0800); //Заполнение структуры IP header ip_header.ver = 0x45; ip_header.ServicesField = 0; ip_header.TotalLength = htons(sizeof(ip_header)+sizeof(ping_header)+sizeof(Data_ICMP)); ip_header.Identification = htons(27601); ip_header.FragmentFlags = htons(0); ip_header.TimeToLive = 0x80; ip_header.NextProtocol = 0x01;//0x06 ip_header.Checksum = 0; ip_header.ip_srcaddr = inet_addr(ip_source); ip_header.ip_destaddr = inet_addr(ip_dest);
//ICMP ping_header.type = 0x8; ping_header.code = htons(0x00); ping_header.checksum = 0; ping_header.id = htons(0x200); ping_header.seqno = htons(0x1E00);
ping_header.checksum = Checksum((char*)&ping_header, sizeof(ping_header)); //расчёт контрольной суммы ip header ip_header.Checksum = Checksum((char*)&ip_header, sizeof(ip_header));
//////// printf("Build packet\n"); memcpy(packet, ð_header, sizeof(eth_header)); memcpy(packet+sizeof(eth_header), &ip_header, sizeof(ip_header)); memcpy(packet+sizeof(eth_header)+sizeof(ip_header),&ping_header, sizeof(ping_header)); memcpy(packet+sizeof(eth_header)+sizeof(ip_header)+sizeof(ping_header), Data_ICMP, 32);
//Отправка пакета pcap_sendpacket(adhandle , packet, sizeof(eth_header)+sizeof(ip_header)+sizeof(ping_header)+sizeof(Data_ICMP));
//printf("."); ExitThread(0); return 0; }
void main() { FILE *in, *out; in = fopen("ip.txt", "rb");
memset(packet, '.', sizeof(packet)); //mac роутера d_mac[0] = 0x*; d_mac[1] = 0x*; d_mac[2] = 0x*; d_mac[3] = 0x*; d_mac[4] = 0x*; d_mac[5] = 0x*; //mac моей сетевой карты s_mac[0] = 0x*; s_mac[1] = 0x*; s_mac[2] = 0x*; s_mac[3] = 0x*; s_mac[4] = 0x*; s_mac[5] = 0x*;
Init_Pcap();//Инициализация интерфейса WinPcap Sleep(500);
while (!feof(in)) { fscanf(in,"%s\n",&ip_dest); printf("\nNext %s\n", ip_dest);
hThread = CreateThread(NULL, 0, scan, (LPVOID)scan, 0, &dwThreadId); Sleep(10); WaitForSingleObject(hThread, 0); CloseHandle(hThread); Sleep(1); }
fclose(in); free(packet);
system("pause"); }
|
Прошу Вашей помощи.
|