Избавление от антивирусного предупреждения: использование getaddrinfo вместо GetHostByName для получения IP-адреса в Delphi и Pascal
Разработчики, работающие с языками программирования Delphi и Pascal, иногда сталкиваются с проблемами, связанными с безопасностью и антивирусной защитой. В частности, использование функции GetHostByName для получения IP-адреса по имени хоста может вызвать ложное срабатывание антивирусной программы Kaspersky Internet Security 2013, которая обнаруживает попытку создания ключа в реестре HKLM\SYSTEM\CONTROLSET001\SERVICES\TCPIP\PARAMETERS. Это может привести к проблемам, если у пользователя нет прав администратора. В этом случае использование функции GetHostByName становится невозможным.
Альтернативный способ получения IP-адреса
Для решения этой проблемы можно использовать функцию getaddrinfo, которая не вызывает изменений в реестре и, соответственно, не приводит к срабатыванию антивирусного ПО. Пример кода на Object Pascal (Delphi) для использования getaddrinfo:
program Project2;
{$APPTYPE CONSOLE}
uses
Winsock;
type
PAddrInfo = ^TAddrInfo;
TAddrInfo = packed record
ai_flags: Integer;
ai_family: Integer;
ai_socktype: Integer;
ai_protocol: Integer;
ai_addrlen: LongWord;
ai_canonname: array of Char;
ai_addr: PSOCKADDR;
ai_next: PAddrInfo;
end;
function getaddrinfo(const nodename: PChar; const servname : PChar; const hints: PAddrInfo; var res: PAddrInfo): Integer; stdcall; external 'ws2_32.dll' name 'getaddrinfo';
procedure freeaddrinfo(ai: PAddrInfo); stdcall; external 'ws2_32.dll' name 'freeaddrinfo';
var
DummyWSA: WSADATA;
SocketHint, SocketResult: PAddrInfo;
begin
if WSAStartup($0202, DummyWSA) = 0 then
begin
// Инициализация структуры для подсказок
SocketHint := nil; // Можно использовать заполненную структуру для более точных подсказок
getaddrinfo('localhost', nil, SocketHint, SocketResult);
// Обязательно освободить память, выделенную функцией getaddrinfo
freeaddrinfo(SocketResult);
end;
Readln;
end.
Важно отметить, что использование getaddrinfo позволяет поддерживать работу с IPv6, что делает этот метод более предпочтительным для современных приложений.
Проблема с Kaspersky Internet Security 2013
Использование getaddrinfo не приводит к записи в реестр, что исключает конфликт с Kaspersky Internet Security 2013. Однако, стоит отметить, что проблема с GetHostByName может быть связана с внешним кодом, который перехватывает вызов этой функции. Это можно проверить, используя инструменты для мониторинга реестра, такие как Process Monitor.
Поддержка Windows 2000
Если необходимо поддержка Windows 2000, стоит учесть, что getaddrinfo доступен начиная с Windows Vista. Для более старых версий операционной системы можно использовать альтернативные подходы, например, с помощью Winsock API.
Заключение
При использовании функций для работы с сетью важно учитывать совместимость с различными версиями операционных систем и избегать действий, которые могут привести к срабатыванию антивирусного ПО. В данном случае, переход на использование getaddrinfo позволяет решить проблему с Kaspersky Internet Security 2013 и поддерживает современные стандарты работы с сетью.
Разработчики языков Delphi и Pascal сталкиваются с антивирусным предупреждением при использовании функции `GetHostByName` и ищут решение, предлагая использовать `getaddrinfo` для получения IP-адреса без изменения реестра.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.