Поставил я недавно перед собой задачку программным образом подключиться к админке роутера, для начала решил сделать это простыми методами, первое что пришло в голову: - Telnet - IdHTTP1 (стандартный компонент) - WebBrowser1 (стандартный компонент)
Вариант с использованием Telnet я отбросил сразу так как он слишком топорный, следующее по списку было использовать "IdHTTP1" для коннекта к админке через:
но при анализе трафика снифером, оказалось что роутер в ответ постоянно возвращает
Код
HTTP/1.0 401 Unauthorized.
и тут я вспомнил про стандартные скрипты управления роутером и команду авторизации:
Код
http://admin:parol@192.168.1.1/
для простоты эксперимента я воспользовался стандартным компонентом "WebBrowser1", и впринципе все заработало как нужно, но тут есть один недостаток, дело в том что когда пароль не правильный, или если в нем ошибка, то выскакивает стандартное Windows'кое окно авторизации где нужно вручную ввести логин и пароль, из за этого окна вся дальнейшая работа программы останавливается!
В интернете искал информацию о том как запретить вывод данного диалогового окна, или как автоматически ответить программе отменой на данное окно, но ничего так и не нашел, может быть кто то сможет подсказать как решить данную проблему?
PS: прикрепил исходники, может пригодится еще кому.
Я думаю, что стоит копать в сторону http запросов. Попробуй передать туда ещё User-agent.
в передаваемом трафике все что можно выловить это Get запрос к адресу роутера, в ответ на который роутер отправляет нам специальным образом сгенерированные данные на которые Windows отвечает вызовом такого вот окна авторизации, User-agent так же передается, тут, как мне кажется, он особой роли не играет, задача в том что бы вообще не выводить это окно, при этом необходимо получать ответ от роутера не блокируя его!
Путем некоторого анализа, удалось выяснить что в процессе вызова данного окна, Windows задействует некоторые свои системные библиотеки, следовательно можно попробовать поставить хук на вызов этих самых библиотек.
Так же есть еще один вариант, процесс авторизации на роутере через WEB интерфейс происходит в 4 этапа:
1) Сначало от нас уходит простой Get запрос (практически без каких либо данных), на роутер по указанному адресу;
2) Роутер на наш запрос отвечает пакетом данных на авторизацию, в них указывается тип шифрования и еще некоторые параметры;
(по логике вещей, именно этот ответный пакет от роутера и задействует процедуру авторизации, то есть следующий пакет от нас к роутеру как раз и несет в себе смысловую нагрузку в виде Логина и зашифрованного Пароля с некоторыми дополнительными данными)
3) Отправляем к роутеру наш ответный пакет с Логином и зашифрованным паролем;
4) Роутер отправляет нам данные конечного результата авторизации, если успешно, то придут пакеты с панелью админки, если Логин или Пароль были указаны неверно, то от роутера к нам прилетит точно такой же пакет как и в шаге 2) только с измененной переменной времени и даты.
В принципе ничего сложного, вся разница только в способе авторизации, в случае когда мы пытаемся авторизоваться через скрипт, шаг 3) выполняется автоматически, без вывода окна авторизации, но если Логин или Пароль в скрипте были указаны неверно, то на шаге 4) окно авторизации все же появится, а если же мы пытаемся авторизироваться в обычном режиме (отправляя роутеру обычный Get запрос, без указания Логина и пароля на 1) этапе), то окно авторизации высветится нам сразу после выполнения 2) этапа.
Таким образом получается что можно собственноручно блокировать входящий пакет от роутера, если он указывает на ошибку авторизации, а в программе рисовать уже собственное окно авторизации с подходящим для нас интерфейсом, но это слишком топорно на мой взгляд, ведь такой способ подходит лишь для разовой (однократной) попытки авторизации, а если скажем мы вдруг забыли свой Пароль и нам нужно попытаться его вспомнить, то при многократных попытках авторизации сниффер будет сильно тормозить процесс, по этому и нужно попытаться реализовать задачу через функции Windows нежели через трафик.