Программирование на C++ глазами хакера

Изменение IP-адреса


Попытаюсь ответить на часто задаваемый вопрос и объяснить, как программно поменять IP-адрес. Зная, как это делается, легко можно написать программу, которая будет через определенные промежутки времени менять адрес компьютера. Это повысит безопасность компьютера, создав защиту от многих видов атак.

Сетевая карта может иметь несколько адресов одновременно, поэтому есть функции для добавления и удаления адресов. Для добавления воспользуйтесь функцией AddIPAddress, у которой следующие параметры:

IP-адрес;

маска сети для адреса;

индекс адаптера, для которого добавляется адрес;

контекст адреса. По своему опыту советую указывать нулевое значение. Контекст будет устанавливаться системой;

экземпляр, который чаще всего оставляют нулевым.

5.З. Окно будущей программы ChangeIPAddress

Каждый IP-адрес привязывается к определенному адаптеру. Например, если в системе две сетевые карты, то для них будут формироваться две отдельные записи для хранения адреса. Контекст однозначно идентифицирует запись об адресе в системе. Не может быть двух записей с одним и тем же контекстом для одного или разных сетевых адаптеров.

Зная контекст адреса, вы можете легко удалить адрес с помощью функции DeleteIPAddress, которой нужно передать в качестве единственного параметра именно этот контекст.

Продемонстрирую все сказанное на примере. Для этого создайте новое приложение MFC Application на основе диалога с именем ChangeIPAddress. На 5.3 показано главное окно будущей программы.

По нажатию кнопки List adapters информация о сетевых адресах будет получена и выведена в элементе List Box, который растянут вдоль нижней части окна. Код, который должен выполняться по нажатию этой кнопки, приведен в листинге 5.2.



Листинг 5.2. Вывод информации об установленных адресах
void CChangeIPAddressDlg::OnBnClickedButton3() { PIP_ADAPTER_INFO pAdapterInfo, pAdapter; ULONG iAdapterInfo; int iErr; CString Str;

iAdapterInfo = 0; iErr=GetAdaptersInfo(NULL, iAdapterInfo); if ((iErr!= 0) (iErr != ERROR_BUFFER_OVERFLOW)) { AfxMessageBox("GetAdaptersInfo failed"); return; }


if ((pAdapterInfo = (PIP_ADAPTER_INFO) GlobalAlloc(GPTR, iAdapterInfo)) == NULL) { AfxMessageBox("Memory allocation error\n"); return; }

if (GetAdaptersInfo(pAdapterInfo, iAdapterInfo) != 0) { AfxMessageBox("GetAdaptersInfo failed"); return; }

pAdapter = pAdapterInfo; lAdapters.AddString("======================"); while (pAdapter) { Str="Adapter: "; lAdapters.AddString(Str+pAdapter-AdapterName);

char s[20]; Str=itoa(pAdapter-Index, s, 10); Str="Index: "+Str; lAdapters.AddString(Str);

PIP_ADDR_STRING chAddr = (pAdapter-IpAddressList); while(chAddr) { lAdapters.AddString("------------------------------");

Str=itoa(chAddr-Context, s, 10); Str="Context: "+Str; lAdapters.AddString(Str);

Str="IP Address: "; lAdapters.AddString(Str+chAddr-IpAddress.String);

Str="Subnet Mask: "; lAdapters.AddString(Str+chAddr-IpMask.String);

chAddr = chAddr-Next; } pAdapter = pAdapter-Next; }

}

Вся информация об адресах получена так же, как и в разд. 5.1, с помощью функции GetAdaptersInfo. Напомню, что в качестве первого параметра нужно указать структуру типа PIP_ADAPTER_INFO. В этой структуре в параметре Index хранится индекс сетевого устройства, который надо будет указывать в качестве третьего параметра функции AddIPAddress при добавлении нового IP, а в параметре IpAddressList — массив из структур типа PIP_ADDR_STRING. В этой структуре нас интересует параметр Context, в котором хранится контекст IP-адреса. В параметре IpAddress хранится адрес, а в IpMask находится маска сети.

По нажатию кнопки Change IP добавляется новый адрес для сетевого адаптера. Можно перед добавлением найти и удалить все уже существующие адреса, а потом присоединить новый. Пример кода, который должен выполнятся по нажатию этой кнопки, приведен в листинге 5.3.

Листинг 5.3. Добавление нового адреса для первого сетевого адаптера в системе
void CChangeIPAddressDlg::OnBnClickedButton1() { PIP_ADAPTER_INFO pAdapterInfo, pAdapter; ULONG iAdapterInfo; int iErr; ULONG iInst, iContext; iInst=iContext=0;



iAdapterInfo = 0; iErr=GetAdaptersInfo(NULL, iAdapterInfo); if ((iErr!= 0) (iErr != ERROR_BUFFER_OVERFLOW)) { AfxMessageBox("GetAdaptersInfo failed"); return; }

if ((pAdapterInfo = (PIP_ADAPTER_INFO) GlobalAlloc(GPTR, iAdapterInfo)) == NULL) { AfxMessageBox("Memory allocation error\n"); return; }

if (GetAdaptersInfo(pAdapterInfo, iAdapterInfo) != 0) { AfxMessageBox("GetAdaptersInfo failed"); return; }

pAdapter = pAdapterInfo;

char sNewAddr[20], sNewMask[20];

eIPEdit.GetWindowText(sNewAddr, 20); eMaskEdit.GetWindowText(sNewMask, 20);

iErr=AddIPAddress(inet_addr(sNewAddr), inet_addr(sNewMask), pAdapter-Index, iContext, iInst); if (iErr!=0) AfxMessageBox("Can't change address"); }

Чтобы добавить новый адрес, необходимо знать индекс сетевого адаптера. Для его определения используется функция GetAdaptersInfo. После этого можно вызывать функцию AddIPAddress.

По нажатию кнопки Del IP будет удаляться адрес с контекстом, указанным в поле IP Context. Код, который должен выполняться по нажатию этой кнопки, можно увидеть в листинге 5.4.

Листинг 5.4. Удаление IP-адреса
void CChangeIPAddressDlg::OnBnClickedButton2() { char sContext[20]; eContext.GetWindowText(sContext, 20);

int Context=atoi(sContext); if (DeleteIPAddress(Context) != 0) { AfxMessageBox("Can't delete address"); } }

Интересного эффекта можно добиться, если просто удалить все IP-адреса. В этом случае компьютер исчезнет из сети и не сможет с ней работать. Но это уже из серии программ-шуток.

Напоследок хотел бы вас предупредить, что функции будут корректно работать только при правильно настроенной сети. Даже если просто выдернут сетевой кабель, функции не работают. На 5.4 показан результат работы программы на моем ноутбуке. Перед нажатием кнопки List adapters я отключил сетевой кабель, и в результате IP-адрес и маска сети стали нулевыми (0.0.0.0).



5.4. Результат работы программы ChangeIPAddress без сетевого кабеля

Примечание
Исходный код примера, описанного в этом разделе, вы можете найти на компакт - диске в каталоге \Demo\Chapter5\ChangeIPAddress.

Содержание раздела