Blog. Just Blog

Проверка доступности URL на Ассемблере

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Проверка доступности URL на Ассемблере
Проверка доступности URL на Ассемблере

Понадобилась функция проверки доступности определенного URL. Под доступностью я понимаю успешное соединение с сервером и получение от него корректного ответа с кодом 200. Дополнительно к проверке доступности я сделал возможность запрашивать размер файла по ссылке без скачивания самого файла.

Функция проверки получилась следующая. Два обязательных параметра: lpURL - указатель на строку URL в формате ASCIIZ, который надо проверить на доступность и dGetSize - надо ли запрашивать размер файла по ссылке или только проверить доступность.
  1. ;----------------------------------------------------------------------
  2. ; Функция для проверки доступности URL
  3. ;----------------------------------------------------------------------
  4. ; Параметры:
  5. ;   lpURL - указатель на строку ASCIIZ проверяемого URL
  6. ;   dGetSize - сразу запрашивать размер данных (TRUE/FALSE)
  7. ; На выходе:
  8. ;   EAX = -1 - ссылка недоступна или нет соединения
  9. ;   EAX = 1 - если ссылка доступна и dGetSize = FALSE
  10. ;   EAX = размер данных, если ссылка доступна и dGetSize = TRUE
  11. ;----------------------------------------------------------------------
  12. proc is_valid_url lpURL:DWORD, dGetSize:DWORD
  13.  
  14.         INTERNET_OPEN_TYPE_PRECONFIG = 0x00000000
  15.         INTERNET_FLAG_NO_UI          = 0x00000200
  16.  
  17.         HTTP_QUERY_STATUS_CODE       = 0x00000013
  18.         HTTP_QUERY_CONTENT_TYPE      = 0x00000001
  19.         HTTP_QUERY_CONTENT_LENGTH    = 0x00000005
  20.         HTTP_QUERY_FLAG_NUMBER       = 0x20000000
  21.  
  22.         BUFF_LENGTH = 100h
  23.  
  24.         locals
  25.                 result          dd ?
  26.                 hInet           dd ?
  27.                 dummy           dd ?
  28.                 buff_len        dd ?
  29.                 buff            rb BUFF_LENGTH
  30.         endl
  31.  
  32.         ; Сохранить все регистры
  33.         pusha
  34.  
  35.         ; По умолчанию все плохо
  36.         mov     [result],-1
  37.  
  38.         ; Открыть соединение
  39.         invoke  InternetOpen,NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0
  40.         or      eax,eax
  41.         jz      .loc_ret
  42.  
  43.         ; Положить Handle на стек
  44.         push    eax
  45.  
  46.         ; Запросить соединение с URL
  47.         invoke  InternetOpenUrl,eax,[lpURL],NULL,0,INTERNET_FLAG_NO_UI,0
  48.         or      eax,eax
  49.         jz      .loc_close_hinet
  50.  
  51.         mov     ebx,eax
  52.  
  53.         ; Размер буфера для приема данных
  54.         mov     [buff_len],BUFF_LENGTH
  55.  
  56.         ; Получить код состояния HTTP
  57.         lea     eax,[dummy]
  58.         push    eax
  59.         lea     eax,[buff_len]
  60.         push    eax
  61.         lea     eax,[buff]
  62.         push    eax
  63.         invoke  HttpQueryInfo,ebx,\
  64.                 HTTP_QUERY_STATUS_CODE+HTTP_QUERY_FLAG_NUMBER
  65.         or      eax,eax
  66.         jz      .loc_close_hconnection
  67.  
  68.         ; Код состояния = 200 (OK)?
  69.         lea     eax,[buff]
  70.         cmp     dword [eax],200
  71.         jne     .loc_close_hconnection
  72.  
  73.         ; Надо ли сразу запрашивать размер данных?
  74.         cmp     [dGetSize],TRUE
  75.         jz      @f
  76.  
  77.         ; Ссылка просто доступна
  78.         mov     [result],1
  79.         jmp     .loc_close_hconnection
  80. @@:
  81.         ; Получить размер возвращаемого контента
  82.         lea     eax,[dummy]
  83.         push    eax
  84.         lea     eax,[buff_len]
  85.         push    eax
  86.         lea     eax,[buff]
  87.         push    eax
  88.         invoke  HttpQueryInfo,ebx,\
  89.                 HTTP_QUERY_CONTENT_LENGTH+HTTP_QUERY_FLAG_NUMBER
  90.         or      eax,eax
  91.         jz      .loc_close_hconnection
  92.  
  93.         ; Размер контента
  94.         lea     eax,[buff]
  95.         mov     eax,[eax]
  96.         mov     [result],eax
  97.  
  98. .loc_close_hconnection:
  99.         invoke  InternetCloseHandle,ebx
  100.  
  101. .loc_close_hinet:
  102.         ; Handle на стеке
  103.         invoke  InternetCloseHandle
  104.  
  105. .loc_ret:
  106.         ; Восстановить все регистры
  107.         popa
  108.  
  109.         ; Вернуть результат в регистре EAX
  110.         mov     eax,[result]
  111.         ret
  112. endp
Результат возвращается в регистре EAX: -1 если ссылка недоступна или нет соединения, 1 - если ссылка доступна и dGetSize = FALSE, если ссылка доступна и dGetSize = TRUE, то в регистре EAX вернется размер полученных данных. Примеры использования:
  1.         ; Проверить доступность ссылки и получить размер контента
  2.         stdcall is_valid_url,url,TRUE
  3.  
  4.         ; Просто проверить доступность ссылки
  5.         stdcall is_valid_url,url,FALSE
В приложении пример программы с исходным текстом, проверяющей доступность файла по ссылке. Если файл доступен, то выводится его размер в байтах.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Is.Valid.URL.Demo.zip (2,454 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 2953 | Комментариев: 10

Метки: Assembler, сеть
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Елена (01.12.2023 в 16:24):
все понятно. благодарю!
ManHunter (01.12.2023 в 16:23):
я не пишу на masm
Елена (01.12.2023 в 16:22):
тогда другой вопрос. код переписан на масм, появляется экзешник, но не открывается. можете ли вы предположить какая в этом случае может быть проблема?
ManHunter (01.12.2023 в 16:16):
так и бдет push eax, хоть на masm, хоть на nasm, хоть на любом другом asm
Елена (01.12.2023 в 16:13):
Здравствуйте! Подскажите, пожалуйста, как можно push eax переделать на масм в этой части кода
        lea     eax,[dummy]
        push    eax
        lea     eax,[buff_len]
        push    eax
        lea     eax,[buff]
        push    eax
Заранее спасибо!
ManHunter (05.02.2022 в 14:58):
1 - возвращать состояние в CF, а данные в EAX. 2 - нет
Владимир (04.02.2022 в 21:11):
Дмитрий, добрый вечер, разбираю Вашу программу. Есть два вопроса:
1) Если dGetSize оставить TRUE и в адресе URL сделать ошибку (специально или случайно, не суть), то на выходе получается число 4 294 967 295. Можно ли это как-то красиво обработать и показать, что в адресе допустим допущена ошибка, или такой адрес не существует и всё такое ?
2) Вот этот кусок кода повторяется два раза внутри процедуры. Можно ли это как-то обыграть по другому чтобы избежать дублирования кода ?
        lea     eax,[dummy]
        push    eax
        lea     eax,[buff_len]
        push    eax
        lea     eax,[buff]
        push    eax
Заранее извиняюсь если вопросы нубские, я ещё в состоянии начал. Спасибо заранее за ответ.
С уважением,
Володя
Ромка (10.10.2017 в 00:43):
специально задал адрес несуществующего файла
снифер показывает 404 для оперы
для исходника 200 ок
ManHunter (10.10.2016 в 22:24):
Что сервер в заголовках отдал - то функция и показала. Динамический размер, естественно, кроме как полной загрузкой, никаким образом не получить.
zdm (10.10.2016 в 21:05):
Но ведь запрос размера будет работать только с теми страницами которые возвращают "Content-Length: xxx". Т.к. сайты сейчас динамические это поле почти никогда не возвращается. Верно?

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0082 сек.) / Память: 4.5 Mb
Наверх