Как считает Ларри Уол - одно из величайших качеств любого прогрммиста - это его лень. Согласен. Надоели наши каналы, надоело платить деньги за три строки текста, и самое главное - надоело грузить иксы и Нетскейп что бы бесплатно отправить sms.
Хорошо что этот самый ленивый Уол изобрел perl, а остальые линивцы - модуля.
К делу. Задача - отправлять sms из командной строки не загружая браузера. При успешном выполнении - широковещательную неограниченную рассылку (спамом неохота это называть) sms.
1. Ищем подходящий ресурс рассылки. Неоднократно отсылаем sms разным операторам, Засекаем время доставки и надежность. 2. Смотрим на систему безопасности ресурса и кем предоставлен гейт. Мне было принципиально важно гейт Киевстара т.к. на него шлю чаще всего а свою страничку они защитили лучше всего (.gif не разбереш, хотя послушал бы мнения).
По первым двум пунктам мое внимани привлек ресурс Телекома http://telecom.com.ua он не только очень быстро доставляет смс на Киевстар но там жирным светилась надпись Программное обеспечение для гейта предоставлено компанией Киевстар GSM. У меня аж ручки зачесались. Бегло ознакомившись с формой (разлядывая html)- никаких преград. Три параметра запроса:
1. Номер получателя, в форме to_addr. 2. Щелкунчик - принимает ли телефон кирилицу, в форме dcs. 3. Собственно сам текст смс, в форме new_body.
Неужели все так просто? И тут вижу еще два непонятных параметра с пометочко hidden: один из них менял свое значение с каждой загрузкой причем что name что value имели абсолютно умопомрачительные названия кот нормальный человек в нормальном состоянии никогда бы не придумал. Второй - типа закоментированный no_spam - из наблюдений и последнего названия делаем вывод: "кинули" в нас цифровой подписю! Значит атакой "в лоб" не получится.
Алгоритм прост: Выгребаем страницу, разбираем, достаем значения динамически изменяемых параметров подписи как то хеш и саму подпись. Пишем письмо другу, к нему атачим эти же параметры. Засовываем серверу и пусть жует. С криком - "Нет преграды патриотам!" достал из CPANа и заточил HTML::Parser.
Вот что получается...
#!/usr/bin/perl warn Загрузка ...nn;
# модули
use strict; use warnings; use LWP; use HTTP::Request::Common; use HTML::Parser;
# константы: 1-я адрес странички с формой, 2-я адресс самого скрипта.
use constant SMS_CENTER => http://telecom.com.ua/smsgate/; use constant SMS_SCRIPT => http://telecom.com.ua/cgi-bin/sms/sms.pl;
########################### Прием данных для отсылки KOI8-ru ###############
print Kyiv Star 067XXXXXXXn UMC 050XXXXXXXn Goblin Telecom 039XXXXXXn WellCOM 068XXXXXn Номер телефона получателя:n; my $to_addr = <STDIN>; chomp($to_addr); $to_addr = 0000000000 unless $to_addr;
######################## Подключение к серверу ############# $=1; ### отключаем буферизацию my $ua = LWP::UserAgent -> new; $ua -> agent(@ns_headers, push@{$ua->requests_redirectable},POST);
###### Идем за новой страницей с формой #########
my $request = HTTP::Request -> new(GET => SMS_CENTER); my $parser = HTML::Parser->new(api_version => 3); ### новый обьект разборщика
############# Настройка разборщика
### здесь разбирается название хэша и его значение. Этим займется функция start my ($hash_name,$hash) = $parser ->handler(start => &start, tagname,attr); ### как атрибуты функции передаются имя тега и его значение
### значение цифровой подписи - функция hidden my $cifer = $parser -> handler(comment =>&hidden, tagname); ## тут нам нужно только имя тега
my $response = $ua -> request($request, sub{$parser->parse(shift)}); ### получаем страницу и передаем разборщику $parser->eof;### разборщик больше не нужен
die $response->status_line unless $response->is_success; ### умираем если нет ответа
system (clear); ### очищаем экран print Получены данные...n Номер получателя: $to_addrn Получение кирилицы: $dcsn Сообщение: $new_bodyn Данные хэша: $hash_name = $hashn Подпись: $cifernn ;
print $response->content;##### получаем (для отладки) ответ сервера
######################## functions ################# ######## Все функции прозрачны если нужно описание будет.
sub start{ my ($tag, $attr) = @_; if ($tag eq input){ return unless $attr->{type}; if($attr->{type} eq hidden){ $hash_name=$attr->{name}; $hash = $attr->{value}; return; } }
} sub hidden{ my ($tag) = @_; if ($tag =~ m/(input type=hidden name=no_spam value=)(w+)(*)/i){ $cifer = $2; return; } }
Ну и под конец скажу, что дл я остальных "зверей "подключил это все дело через CGI с возможностью рассылки до 30 абонентам сразу, выложил на серваке в офисе, все счастливы и довольны такой халяве.
Сразу предупреждаю, там же стоит вычислялка IP, так что без нормального маскарада все равно не получится отправить больше 5 смс. И этот сервак хреновенько шлет на номера UMC (гейт все таки Киевстаровский). Так что берите другие и долбите. Кстати у UMC все реализовано не сложнее чем у "Телекома". Делайте выводы :)