Проверка доступности URL на Ассемблере
Проверка доступности URL на Ассемблере
Понадобилась функция проверки доступности определенного URL. Под доступностью я понимаю успешное соединение с сервером и получение от него корректного ответа с кодом 200. Дополнительно к проверке доступности я сделал возможность запрашивать размер файла по ссылке без скачивания самого файла.
Функция проверки получилась следующая. Два обязательных параметра: lpURL - указатель на строку URL в формате ASCIIZ, который надо проверить на доступность и dGetSize - надо ли запрашивать размер файла по ссылке или только проверить доступность.
Code (Assembler) : Убрать нумерацию
- ;----------------------------------------------------------------------
- ; Функция для проверки доступности URL
- ;----------------------------------------------------------------------
- ; Параметры:
- ; lpURL - указатель на строку ASCIIZ проверяемого URL
- ; dGetSize - сразу запрашивать размер данных (TRUE/FALSE)
- ; На выходе:
- ; EAX = -1 - ссылка недоступна или нет соединения
- ; EAX = 1 - если ссылка доступна и dGetSize = FALSE
- ; EAX = размер данных, если ссылка доступна и dGetSize = TRUE
- ;----------------------------------------------------------------------
- proc is_valid_url lpURL:DWORD, dGetSize:DWORD
- INTERNET_OPEN_TYPE_PRECONFIG = 0x00000000
- INTERNET_FLAG_NO_UI = 0x00000200
- HTTP_QUERY_STATUS_CODE = 0x00000013
- HTTP_QUERY_CONTENT_TYPE = 0x00000001
- HTTP_QUERY_CONTENT_LENGTH = 0x00000005
- HTTP_QUERY_FLAG_NUMBER = 0x20000000
- BUFF_LENGTH = 100h
- locals
- result dd ?
- hInet dd ?
- dummy dd ?
- buff_len dd ?
- buff rb BUFF_LENGTH
- endl
- ; Сохранить все регистры
- pusha
- ; По умолчанию все плохо
- mov [result],-1
- ; Открыть соединение
- invoke InternetOpen,NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0
- or eax,eax
- jz .loc_ret
- ; Положить Handle на стек
- push eax
- ; Запросить соединение с URL
- invoke InternetOpenUrl,eax,[lpURL],NULL,0,INTERNET_FLAG_NO_UI,0
- or eax,eax
- jz .loc_close_hinet
- mov ebx,eax
- ; Размер буфера для приема данных
- mov [buff_len],BUFF_LENGTH
- ; Получить код состояния HTTP
- lea eax,[dummy]
- push eax
- lea eax,[buff_len]
- push eax
- lea eax,[buff]
- push eax
- invoke HttpQueryInfo,ebx,\
- HTTP_QUERY_STATUS_CODE+HTTP_QUERY_FLAG_NUMBER
- or eax,eax
- jz .loc_close_hconnection
- ; Код состояния = 200 (OK)?
- lea eax,[buff]
- cmp dword [eax],200
- jne .loc_close_hconnection
- ; Надо ли сразу запрашивать размер данных?
- cmp [dGetSize],TRUE
- jz @f
- ; Ссылка просто доступна
- mov [result],1
- jmp .loc_close_hconnection
- @@:
- ; Получить размер возвращаемого контента
- lea eax,[dummy]
- push eax
- lea eax,[buff_len]
- push eax
- lea eax,[buff]
- push eax
- invoke HttpQueryInfo,ebx,\
- HTTP_QUERY_CONTENT_LENGTH+HTTP_QUERY_FLAG_NUMBER
- or eax,eax
- jz .loc_close_hconnection
- ; Размер контента
- lea eax,[buff]
- mov eax,[eax]
- mov [result],eax
- .loc_close_hconnection:
- invoke InternetCloseHandle,ebx
- .loc_close_hinet:
- ; Handle на стеке
- invoke InternetCloseHandle
- .loc_ret:
- ; Восстановить все регистры
- popa
- ; Вернуть результат в регистре EAX
- mov eax,[result]
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ; Проверить доступность ссылки и получить размер контента
- stdcall is_valid_url,url,TRUE
- ; Просто проверить доступность ссылки
- stdcall is_valid_url,url,FALSE
Просмотров: 2953 | Комментариев: 10
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Елена
(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
Заранее спасибо!
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
Заранее извиняюсь если вопросы нубские, я ещё в состоянии начал. Спасибо заранее за ответ.
С уважением,
Володя
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 ок
снифер показывает 404 для оперы
для исходника 200 ок
ManHunter
(10.10.2016 в 22:24):
Что сервер в заголовках отдал - то функция и показала. Динамический размер, естественно, кроме как полной загрузкой, никаким образом не получить.
zdm
(10.10.2016 в 21:05):
Но ведь запрос размера будет работать только с теми страницами которые возвращают "Content-Length: xxx". Т.к. сайты сейчас динамические это поле почти никогда не возвращается. Верно?
Добавить комментарий
Заполните форму для добавления комментария