Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Отправить пакет на свою сетевую карту

Добрый день, коллеги.
Есть вопрос, но нет решения. Условия таковы:
Есть сетевой интерфейс, назовем его eth10, не имеющий ip-адреса. Есть программа, которая ловит каждый пакет на этом самом интерфейсе.
Вопрос: можно ли отправить пакет на этот сетевой интерфес с сервера, на котором он находится, т.е. самому себе, чтобы программа, которая ловит пакеты, смогла прочитать его? 
Ответ:
Добрый день, коллеги.
Есть вопрос, но нет решения. Условия таковы:
Есть сетевой интерфейс, назовем его eth10, не имеющий ip-адреса. Есть программа, которая ловит каждый пакет на этом самом интерфейсе.
Вопрос: можно ли отправить пакет на этот сетевой интерфес с сервера, на котором он находится, т.е. самому себе, чтобы программа, которая ловит пакеты, смогла прочитать его? 
Вопрос: Изменение ip сетевой карты

Кто знает как с помощью qt получить доступ к настройке сетевой карты,как можно изменить ip ?
Ответ: вариант 1 - самому отсылать и принимать сетевые пакеты ,wpcap.lib в помощь.
вариант 2 - написать дровину - фильтр , тогда можно заиметь контроль над всем трафиком.
Вопрос: Модуль ядра и прерывания от сетевой карты

Здравствуйте! Учусь писать модули ядра.
Посоветуйте, каким образом можно осуществить перехват прерываний от сетевой карты и модифицировать пакеты?
Например, клиент "пингует" сервер сообщением "Are you alive?". Сервер отвечает "Alive". При работе модуля возможно заменить "Alive" на любое другое значение.
И каким образом можно так пинговать сервер?
Направьте, пожалуйста, в нужное русло..
Ответ: Начнем с базиса. Версия кернела и тип карты?
Общее направления одним словом это DPDK.
Вопрос: Несколько адресов на одну сетевую карту

Если сетевой карте назначено больше одного адреса, как TCP/IP стек решает при формировании IP-пакета, какой адрес использовать в поле Local IP?
Очевидный ответ — «согласно таблице маршрутизации», но она сопоставляет паре Destination IP + Mask номер сетевого интерфейса, а не его IP-адрес (см. GetIpForwardTable).
route print пытается вывести IP-адреса интерфейсов, но, похоже, не принимает во внимание, что их может быть несколько, и просто печатает первый попавшийся адрес.
Ответ: Ааа... пишется средство автоматической настройки... но в такой ситуации в общем случае я не вижу корректного способа определения требуемого адреса иначе как попыткой соединения с целевым узлом и последующего определения локального адреса, с которого был выполнен доступ.
Вопрос: Отправить пакет данных через WebRequest

Привет форумчане!
Интересует, можно ли как нибудь отправить пакет данных, который отправляет любой браузер, используя WebRequest или HttpWebRequest
Имею в виду вот такой пакет:
Код Code
1
2
3
4
5
6
7
8
GET http://mail.ru/ HTTP/1.1
Host: mail.ru
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: mrcu=9D8E511293E06DE6972A0A01060A; VID=3ilWyk1S-D1K00000102141K:; i=AQAk4QdVAQATAAgcCVAAAV0AASoBAYIBASMDASoDAXsEAQoIAQsIAQ==
Connection: keep-alive
к примеру вытащить из этого пакета хост, чтобы знать куда отправлять, и потом на этот хост отправить весь пакет.
Ответ: посмотрел проект по ссылке
всё работает, но только при включённом фидлере. как только выключаю его, то получаю тот же 400 bad request
ещё не могу понять, для чего эта часть:
и как это работает
Код C#
1
2
3
4
5
6
7
TcpClient client = new TcpClient(proxy, proxyPort);
            NetworkStream stream = client.GetStream();
 
            // Establish Tcp tunnel
            byte[] tunnelRequest = Encoding.UTF8.GetBytes(String.Format("CONNECT {0}:443  HTTP/1.1\r\nHost: {0}\r\n\r\n", host));
            stream.Write(tunnelRequest, 0, tunnelRequest.Length);
            stream.Flush();
потому что там указан
Код C#
1
2
string proxy = "127.0.0.1";//host;
            int proxyPort = 8888;//443;
и из за этого возникает у меня вопрос, почему создаётся соединение клиента с локалхостом на этот порт?

Добавлено через 3 часа 48 минут
Методом гугла и "тыка" смог сообразить такой вариант, работающий без фиддлера:
Код C#
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
using System;
using System.Text;
using System.Net.Sockets;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
 
namespace SslTcpClient
{
    public class SslTcpClient
    {
        public static void Main(string[] args)
        {
            string host = "mail.ru";
            string proxy = host;
            int proxyPort = 443;
 
            byte[] buffer = new byte[2048];
            int bytes;
 
            // Connect socket
            TcpClient client = new TcpClient(proxy, proxyPort);
            NetworkStream stream = client.GetStream();
 
            // Wrap in SSL stream
            SslStream sslStream = new SslStream(stream,true,new RemoteCertificateValidationCallback(ValidateServerCertificate),null);
            sslStream.AuthenticateAsClient(host);
 
            // Send request
            byte[] request = Encoding.UTF8.GetBytes(String.Format("GET https://{0}/  HTTP/1.1\r\nHost: {0}\r\n\r\n", host));
            sslStream.Write(request, 0, request.Length);
            sslStream.Flush();
 
            // Read response
            do
            {
                bytes = sslStream.Read(buffer, 0, buffer.Length);
                Console.Write(Encoding.UTF8.GetString(buffer, 0, bytes));
            } while (bytes != 0);
 
            client.Close();
            Console.ReadKey();
        }
 
        public static bool ValidateServerCertificate(
              object sender,
              X509Certificate certificate,
              X509Chain chain,
              SslPolicyErrors sslPolicyErrors)
        {
            if (sslPolicyErrors == SslPolicyErrors.None)
                return true;
 
            Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
 
            // Do not allow this client to communicate with unauthenticated servers.
            return false;
        }
    }
}
Вопрос: Получить MAC-адреса всех сетевых карт

Доброго времени суток!
Так могу получить MAC только одной сетевой карты
Код:

function GetMACAdress: string;
var
  NCB: PNCB;
  Adapter: PAdapterStatus;
  RetCode: Char;
  I: Integer;
  Lenum: PlanaEnum;
  _SystemID: String;
begin
  Result := '';
  _SystemID := '';
  Getmem(NCB, SizeOf(TNCB));
  Fillchar(NCB^, SizeOf(TNCB), 0);
  Getmem(Lenum, SizeOf(TLanaEnum));
  Fillchar(Lenum^, SizeOf(TLanaEnum), 0);
  Getmem(Adapter, SizeOf(TAdapterStatus));
  Fillchar(Adapter^, SizeOf(TAdapterStatus), 0);
  Lenum.Length := Chr(0);
  NCB.ncb_command := Chr(NCBENUM);
  NCB.ncb_buffer := Pointer(Lenum);
  NCB.ncb_length := SizeOf(Lenum);
  RetCode := Char(Netbios(NCB));
  I := 0;
  repeat
    FillChar(NCB^, SizeOf(TNCB), 0);
    Ncb.ncb_command := Chr(NCBRESET);
    Ncb.ncb_lana_num := Lenum.lana[I];
    RetCode := Char(Netbios(Ncb));
    FillChar(NCB^, SizeOf(TNCB), 0);
    Ncb.ncb_command := Chr(NCBASTAT);
    Ncb.ncb_lana_num := Lenum.lana[I];
    // Must be 16
    Ncb.ncb_callname := '*               ';
    Ncb.ncb_buffer := Pointer(Adapter);
    Ncb.ncb_length := SizeOf(TAdapterStatus);
    RetCode := Char(Netbios(Ncb));
    //---- calc _systemId from mac-address[2-5] XOR mac-address[1]...
    if (RetCode = Chr(0)) or (RetCode = Chr(6)) then
    begin
      _SystemId := IntToHex(Ord(Adapter.adapter_address[0]), 2) + '-' +
      IntToHex(Ord(Adapter.adapter_address[1]), 2) + '-' +
      IntToHex(Ord(Adapter.adapter_address[2]), 2) + '-' +
      IntToHex(Ord(Adapter.adapter_address[3]), 2) + '-' +
      IntToHex(Ord(Adapter.adapter_address[4]), 2) + '-' +
      IntToHex(Ord(Adapter.adapter_address[5]), 2);
    end;
    Inc(I);
  until (I >= Ord(Lenum.Length)) or (_SystemID <> '00-00-00-00-00-00');
  FreeMem(NCB);
  FreeMem(Adapter);
  FreeMem(Lenum);
  GetMacAdress := _SystemID;
end;

Как можно получить MAC-адреса всех имеющихся Включенных/Активных сетевых карт?
Ответ: Решено
Код:

function GetMACAdress: string;
var
  NCB: PNCB;
  Adapter: PAdapterStatus;
  RetCode: Char;
  I: Integer;
  Lenum: PlanaEnum;
  _SystemID: String;
begin
  Result := '';
  _SystemID := '';
  Getmem(NCB, SizeOf(TNCB));
  Fillchar(NCB^, SizeOf(TNCB), 0);
  Getmem(Lenum, SizeOf(TLanaEnum));
  Fillchar(Lenum^, SizeOf(TLanaEnum), 0);
  Getmem(Adapter, SizeOf(TAdapterStatus));
  Fillchar(Adapter^, SizeOf(TAdapterStatus), 0);
  Lenum.Length := Chr(0);
  NCB.ncb_command := Chr(NCBENUM);
  NCB.ncb_buffer := Pointer(Lenum);
  NCB.ncb_length := SizeOf(Lenum);
  RetCode := Char(Netbios(NCB));
  I := 0;
  repeat
    FillChar(NCB^, SizeOf(TNCB), 0);
    Ncb.ncb_command := Chr(NCBRESET);
    Ncb.ncb_lana_num := Lenum.lana[I];
    RetCode := Char(Netbios(Ncb));
    FillChar(NCB^, SizeOf(TNCB), 0);
    Ncb.ncb_command := Chr(NCBASTAT);
    Ncb.ncb_lana_num := Lenum.lana[I];
    // Must be 16
    Ncb.ncb_callname := '*               ';
    Ncb.ncb_buffer := Pointer(Adapter);
    Ncb.ncb_length := SizeOf(TAdapterStatus);
    RetCode := Char(Netbios(Ncb));
    //---- calc _systemId from mac-address[2-5] XOR mac-address[1]...
    if (RetCode = Chr(0)) or (RetCode = Chr(6)) then
    begin
      _SystemID := _SystemID + ', ' + IntToHex(Ord(Adapter.adapter_address[0]), 2) + '-' +
      IntToHex(Ord(Adapter.adapter_address[1]), 2) + '-' +
      IntToHex(Ord(Adapter.adapter_address[2]), 2) + '-' +
      IntToHex(Ord(Adapter.adapter_address[3]), 2) + '-' +
      IntToHex(Ord(Adapter.adapter_address[4]), 2) + '-' +
      IntToHex(Ord(Adapter.adapter_address[5]), 2);
    end;
    Inc(I);
  until (I >= Ord(Lenum.Length)){ or (_SystemID <> '00-00-00-00-00-00')};
  FreeMem(NCB);
  FreeMem(Adapter);
  FreeMem(Lenum);
  GetMacAdress := Copy(_SystemID, 3, Length(_SystemID));
end;

Вопрос: Получить и изменить ip адрес моей сетевой карты

Здравствуйте! Нужно получить и изменить ip моей сетевой карты. Пробовал с помощью библиотеки System.Net.Dns, но тогда выводится ip моего компьютера в интернете, а мне надо именно локальный ip моего компьютера. Подскажите библиотеку, пожалуйста.
Ответ:
Сообщение от OwenGlendower
попробуй через WMI
Как то слишком сложно для меня пока. Буду изучать, спасибо!
Вопрос: Определение mac-адреса сетевой карты

Приветствую. Ребят, дайте пожалуйста действующий способ определения mac-адреса сетевой карты на билдере.
Ответ:

В заголовочном файле не забудь написать
C++
1
#include <iphlpapi.h>
Далее в cpp-файле
C++
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#pragma comment(lib, "iphlpapi.lib")
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
String PrintMACaddress(BYTE *addr)
{
  String result = "";
  for (int i = 0; i < 6; ++i)
    result += IntToHex(*addr++, 2) + ((i < 5) ? "-" : "\n");
  return result;
}
//---------------------------------------------------------------------------
String GetMACaddress()
{
  IP_ADAPTER_INFO AdapterInfo[16];        // информация о 16 адаптерах макс
  DWORD dwBufLen = sizeof (AdapterInfo);  // кол-во байт в буффере
 
  DWORD dwStatus = GetAdaptersInfo(AdapterInfo, &dwBufLen);
  if (dwStatus != ERROR_SUCCESS)
  {
    ShowMessage("GetAdaptersInfo failed. err=" + String(GetLastError()));
    return 0;
  }
 
  PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo;  // информация о текущем адаптере
  String address = "";
  while (pAdapterInfo)                          // пока есть информация об адаптерах
  {
    if (pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET)
    {
      address = PrintMACaddress(pAdapterInfo->Address);  // печатаем MAC
      break;
    }
    pAdapterInfo = pAdapterInfo->Next;  // переходим к информации о следующем адаптере
  }
 
  return address;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonClick(TObject *Sender)
{
  Label->Caption = GetMACaddress();
}
//---------------------------------------------------------------------------
Вопрос: Отправить пакет с интерфейса без ip-адреса

Доброго вечера.

Есть несколько вопросов, на которые я пока что не смог найти ответ.

Есть сетевой интерфейс. У него есть свой mac-адрес, но отсутствует ip-адрес (это обязательное условие). Карточка подключена кабелем напрямую к другой карточке (к другому компу). Как можно отправить свои созданные пакеты с этого интерфейса, просто отправить в никуда, к примеру широковещательный(вообще желательно широковещательный, т.е. dest mac-адрес FF:FF:FF:FF:FF:FF). 
И как можно принимать пакеты с такого же интерфеса (без ip-адреса).

Вот то, что я пытался сделать (вкратце):
Код

int sock
sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
 
дальше формировал пакет(ethernet-frame). вот такой он получился (по байтам в 16 с/с):
FF FF FF FF FF FF 64 66 B3 01 80 DD 08 00 45 00 00 20 00 00 00 00 FF 11 05 74 C0 A8 01 84 AD C2 46 6A 13 56 13 56 00 0C 5A F7 54 65 73 74

FF FF FF FF FF FF - destination mac-адрес
64 66 B3 01 80 DD - source mac-адрес
08 00 - означает, что в eth-фрейм вложен ip пакет.
45 - первая цифра - версия ip-протокола, вторая цифра - размер ip-заголовка в байтах.
00 - то, что не имеет значение в данном случае (тип службы и что-то еще)
00 20 - размер ip-пакета (без eth-заголовка) в байтах, вместе с ip-заголовком. 0x20 = 32 байта. 20 байт заголовок ip, 8 байт заголовок udp, 4 байта - данные.
00 00 - идентификатор пакета
00 00 - флаги/смещение
FF - время жизни
11 - номер вложенного протокола, в данном случае - UDP
05 74 - контрольная сумма ip-заголовка
C0 A8 01 84 - source ip-адрес (192.168.1.132)
AD C2 46 6A - dest ip-адрес (173.194.70.106)
13 56 - порт отправителя
13 56 - порт получателя
00 0C - длина датаграммы
5A F7 - контрольная сумма udp
54 65 73 74 - собственно данные  - слово "T e s t" (без пробелов)

заполняю структуру
Код

struct sockaddr_ll s_ll;
memset(&s_ll, 0, sizeof(s_ll));
s_ll.sll_ifindex = 0; // в моем случае индекс интерфейса = 0
s_ll.sll_family = AF_PACKET;
memcpy(s_ll.sll_addr, source_mac, 6);  //source_addr содержит FF:FF:FF:FF:FF:FF
s_ll.sll_halen = htons(6); 

//и отправляю
send_bytes = sendto(sock, buff, length_buff, (struct sockaddr *)&s_ll, sizeof(s_ll));


perror выводит ошибку: sendto() failed: Network is down

И еще раз напишу, а то к концу прочтения можно забыть, что у меня не получается:
Есть сетевой интерфейс. У него есть свой mac-адрес, но отсутствует ip-адрес (это обязательное условие). Карточка подключена кабелем напрямую к другой карточке (к другому компу). Как можно отправить свои созданные пакеты с этого интерфейса, просто отправить в никуда, к примеру широковещательный(вообще желательно широковещательный, т.е. dest mac-адрес FF:FF:FF:FF:FF:FF). 
И как можно принимать пакеты с такого же интерфеса (без ip-адреса).

Если кто-то знает или есть догадки, как это можно сделать, поделитесь, пожалуйста.

P.S. Если светофор, который описывает побайтово пакет, напрягает кого-то, напишите - исправлю. Спасибо
Ответ:
Цитата(tzirechnoy @  11.2.2014,  21:14 )
А что говорит на этот интэрфейс ip link ? 


Он как раз говорил о том, что state DOWN

Цитата(tzirechnoy @  11.2.2014,  22:01 )
Да что там, собственно. Чтобы отправлять пакеты через AF_PACKET, SOCK_RAW -- не требуется ip-адрес, но интэрфейс должэн быть UP. 


Вы правы, сработало. Спасибо


UPD: Но теперь другая проблема. Wireshark видит, что пакет отправляется. А на другой машине, wireshark не видит этот пакет.

UPD2: Все видит. Это я в своих интерфейсах запутался. Утро:(

tzirechnoy, Спасибо  :thank_you2

Это сообщение отредактировал(а) konshyn - 12.2.2014, 10:08
Вопрос: Что происходит при перехвате пакета.

Привет всем, в который раз:)

Собственно суть. Ставлю я  сетевую карту в PROMISK режим, создаю пакетный сокет. Принимаю ВСЕ(которые мне и которые не мне, но проходят через меня) пакеты. Пришел пакет. Без изменений он передается сокету. 
Насколько я понимаю, на сокет приходит копия пакета(или нет?). Что делает OC(unix/linux) с этим пакетом? Она его передает дальше, куда он шел? Если да, то можно это как-то убрать, чтобы я сам решал, пускать этот пакет дальше или нет? И можно как-то перехватывать адресованные мне пакеты и решать, пускать их к приложению или нет?

Это сообщение отредактировал(а) konshyn - 22.10.2013, 11:03
Ответ:
Комедия недопониманий  :smile 


Вопросы к ТС.
Цитата(konshyn @  24.10.2013,  17:40 )
Мой комп будет выступать как маршрутизатор.

Что есть маршрутизатор, и обязательно ли хост с тремя работающими интерфейсами является маршрутизатором?

Цитата(konshyn @  24.10.2013,  17:40 )
Именно ж в этом случае, чтобы на сокет ОСой передался не предназначенный моему компу пакет, нужно поставить его в PROMISC режим. Или я не прав?

Что есть этот самый "неразборчивый режим"? Зачем он нужен? Почему и без него работают маршрутизаторы?

PS В данном случае Вашими пакетами являются все пакеты, у которых MAC-адрес совпадает с MAC-адресом Вашего узла-маршрутизатора - это канальный уровень, даже если конечный пункт доставки пакета (по протоколу IP - это сетевой уровень) не совпадает с Вашим узлом. Именно эти пакеты Вы можете перехватить и изменить.



Цитата(konshyn @  24.10.2013,  17:40 )
Пакет нужно разделить на несколько частей и его части отправить на маршрутизатор другой сети. А там его собрать и отправить адресату. А чтобы знать, пришедший пакет является "моим" и нужно ли его собирать, нужно хотя бы добавить идентификатор. Но там еще 5 полей. Чтобы собрать его правильно.

IP-тунелирование? Зачем делить пакет, MTU не позволяет?


Цитата(konshyn @  24.10.2013,  17:40 )
Тут подкинули идею, настроить IP таблицу, и с определенного IP адреса, с которого должны приходить пакеты, отправлять их на IP "0.0.0.0" или 127.0.0.1, на локальныый хост, в общем.
Но как-то не хочется, можно ли просто запретить?

Простой файервол, поднятый на узле-маршрутизаторе, не поможет?


Цитата(konshyn @  24.10.2013,  17:40 )
Тогда не понимаю, как на мой комп может прийти чужой пакет(не широковещательный), если я не в качестве маршрутизатора выступаю.

Вот поэтому-то и встречный вопрос: "что есть неразборчивый режим?"  :girl_crazy 

Это сообщение отредактировал(а) feodorv - 24.10.2013, 18:32