#!/usr/bin/perl use strict; # add_from_net用 LWPで手抜きしたいけどヘッダ調べたいし50kbをメモリにぶち込むのもなんだし、で use Socket; use FileHandle; my $version = '1.00'; # linux # my $hostsfile = '/etc/hosts'; # winXP my $hostsfile = 'C:\WINDOWS\system32\drivers\etc\hosts'; my $msg = 'がない'; my $input = ' ' x 20; my $return = ' ' x 5; my $flag = 0; my %hostslist; my @datas = ; my $allurls = 'http://www.mvps.org/winhelp2002/hosts.txt'; my %funclist = ( '1' => \&add_4_jword, '2' => \&add_4_ads, '3' => \&add_4_brows, '4' => \&add_from_net, '5' => \&add_by_manual, 'q' => \&goodbyebaby ); $\ = "\n"; print 'hosts編集にいらっしゃ〜い ばーじょん',$version; print '今んとこ削除はできましぇん'; if(!(-f $hostsfile)){ while(1){ print '[',$hostsfile,']',$msg,'みたいなので、hostsファイル指定してね'; $input = ; $hostsfile = ($input =~ /([^\n\r]*)/)[0]; if(-f $hostsfile){ while(1){ print '[',$hostsfile,']でいいのね?(y/n/q)'; $input = ; $return = &b2s(($input =~ /([^\n\r]*)/)[0]); if($return eq 'y' || $return eq 'yes'){ $flag = 1; last; }elsif($return eq 'n' || $return eq 'no'){ $msg = 'じゃだめ'; last; }elsif($return eq 'q' || $return eq 'quit'){ # 暇つぶし print 'そ、そんなに私のことが嫌いなのね・・・!'; print 'いいわっ、このファイル削除してやるんだから・・・っ!!!'; sleep(1); print '- [',$hostsfile,']を削除しました -'; sleep(3); print 'なんてね 冗談だよばいばい'; sleep(2); exit; } } last if($flag); }else{ $msg = 'はない'; } } }else{ print '[',$hostsfile,']はあったよ、ラッキー'; } if(! (-w $hostsfile)){ print '[',$hostsfile,']には書き込み権限ないよ'; print 'rootあたりでやってみて んじゃばいばい'; sleep(2); exit; } print 'んじゃ、',$hostsfile,'を読み込んで解析するわ 待って'; open(FN,$hostsfile); while(){ $input = ($_ =~ /([^\n\r]*)/)[0]; next if($input =~ /^\s*#/); $input =~ s/#.*//; # hostsの文法よーわからんけどこんなもんでしょ if($input =~ /([0-9\.]+)\s+([^\s]+)/){ $hostslist{$2} = $1; } } close(FN); while(1){ # print foreach(keys %hostslist); print <<'EOM'; えーと、どうする?(アイフル〜♪) 1. JWord予防セットを入れる 2. 普通の広告カットセットを入れる 3. 有名ブラクラ予防セットを入れる 4. まとめサイトのデータから入れる 5. 手動で入れる(編集もここから) Q. 貴方にあえて嬉しかった けど、もう・・・さよならの時間なの EOM $input = ; $return = b2s(($input =~ /([^\n\r]*)/)[0]); if($funclist{$return}){ &{$funclist{$return}}(\$hostsfile,\%hostslist,\$allurls,\@datas); # hostsの場所 , リスト , ネット用アドレス , }else{ print 'んなのねえよ'; } } # big to small sub b2s{ # map(かforeach)とかunpackとか使えばもっと楽にできると思うよ {if($_ < 91 && $_ > 64){$_ += 32;} $str2 .= pack('C',$_);}map(unpack('C*',$str)); どっちが速いか誰かやって my $str = $_[0]; my $str2 = ' ' x length($str); my $i = -1; my $s = ''; my $n = 0; $str2 = ''; while($s = substr($str,++$i,1)){ $n = ord($s); if($n < 91 && $n > 64){ $s = pack('C',$n + 32); } $str2 .= $s; } # $str = \$str2; return $str2; } # add_4_xxxは統合できるけど別々のほうが管理が楽 sub add_4_jword{ my $hostsfile = $_[0]; my $hostslist = $_[1]; my $datas = $_[3]; my $flag = 0; my $data; my $ip; my $addr; print 'JWord予防セットを入れようとしてみますよ'; foreach(@{$datas}){ $data = ($_ =~ /([^\n\r]*)/)[0]; next if(!$flag && $data !~ /^#jword/); if(!$flag){ $flag++; next; } last if($data =~ /^#/); if($data =~ /([0-9\.]+)\s+([\S]+)/){ $ip = $1; $addr = $2; if($hostslist->{$addr}){ print $addr.'を'.$ip.'に修正しました'; }else{ print $addr.'を'.$ip.'に設定しました'; } $hostslist->{$addr} = $ip; } } &save_hosts($hostsfile,$hostslist); } sub add_4_ads{ my $hostsfile = $_[0]; my $hostslist = $_[1]; my $datas = $_[3]; my $flag = 0; my $data; my $ip; my $addr; print '普通の広告カットセットを入れようとしてみますよ'; foreach(@{$datas}){ $data = ($_ =~ /([^\n\r]*)/)[0]; next if(!$flag && $data !~ /^#ads/); if(!$flag){ $flag++; next; } last if($data =~ /^#/); if($data =~ /([0-9\.]+)\s+([\S]+)/){ $ip = $1; $addr = $2; if($hostslist->{$addr}){ print $addr.'を'.$ip.'に修正しました'; }else{ print $addr.'を'.$ip.'に設定しました'; } $hostslist->{$addr} = $ip; } } &save_hosts($hostsfile,$hostslist); } sub add_4_brows{ my $hostsfile = $_[0]; my $hostslist = $_[1]; my $datas = $_[3]; my $flag = 0; my $data; my $ip; my $addr; print '有名ブラクラ予防セットを入れようとしてみますよ'; foreach(@{$datas}){ $data = ($_ =~ /([^\n\r]*)/)[0]; next if(!$flag && $data !~ /^#crasher/); if(!$flag){ $flag++; next; } last if($data =~ /^#/); if($data =~ /([0-9\.]+)\s+([\S]+)/){ $ip = $1; $addr = $2; if($hostslist->{$addr}){ print $addr.'を'.$ip.'に修正しました'; }else{ print $addr.'を'.$ip.'に設定しました'; } $hostslist->{$addr} = $ip; } } &save_hosts($hostsfile,$hostslist); } # ネット経由で入れる めんどくせえええええ sub add_from_net{ my $hostsfile = $_[0]; my $hostslist = $_[1]; my $allurls = ${$_[2]}; my $flag = 0; my $data; my $ip; my $addr; my $server; my $path; my $serv_ip; my $socket; my $port = 80; my $buffer = ''; print 'まとめサイトのデータから入れてみようとしてみますよ'; if($allurls =~ /http:\/\/([^\?\/]+)(.*)/){ $server = $1; $path = $2; }else{ print 'アドレスがなんかおかしいっぽいよ'; return; } if($server =~ /(.*):(\d*)/){ $server = $1; $port = $2; } $buffer =<<"EOM"; GET $path HTTP/1.1 Host: $server Connection: Close EOM print '[',$server,']に接続するよ'; $serv_ip = inet_aton($server) || &httperror($server.'が見つかりませんでした'); socket($socket,PF_INET,SOCK_STREAM,0) || &httperror('socketが作れませんでした'); connect($socket,pack_sockaddr_in($port,$serv_ip)) || &httperror('connectがエラー吐きました・・・'); autoflush $socket (1); print '[',$server,']にバッファを送るよ'; print $socket $buffer; print '[',$server,']にリクエストを送ったよ!'; while(<$socket>){ $_ =~ s/[\n\r]*//; if($_ =~ /HTTP\/1.\d 200 OK/i){ $flag = 1; } last if(!$_); } if($flag){ print 'あーよかった、ファイルあったよ!'; }else{ &httperror('あらいやだ、'.$allurls.'からエラー返ってきたじゃないの・・・ちゃんとアドレス確認してちょんまげ'); } print 'んじゃ解析しまっす'; while(<$socket>){ $data = ($_ =~ /([^\n\r]*)/)[0]; next if($data =~ /^\s*#/); $data =~ s/#.*//; if($data =~ /([0-9\.]+)\s+([\S]+)/){ $ip = $1; $addr = $2; if($hostslist->{$addr}){ print $addr.'を'.$ip.'に修正しました'; }else{ print $addr.'を'.$ip.'に設定しました'; } $hostslist->{$addr} = $ip; } } &save_hosts($hostsfile,$hostslist); } sub add_by_manual{ my $hostsfile = $_[0]; my $hostslist = $_[1]; my $flag = 0; my $input = ' ' x 20; my $return = ' ' x 5; my $ip; my $addr; while(1){ $flag = 0; print '先にドメイン(hogehoge.comなど)を入力し、後からそれに対応させるIP(0.0.0.0など)を入力します'; while(1){ print 'ではまずドメインを入力してください'; $input = ( =~ /([^\n\r]*)/)[0]; next if(!$input); next if($input =~ /[^a-zA-Z0-9\.\-_]/); last; } $addr = $input; while(1){ print 'では次に',$addr,'に対応させるIPを入力してください'; $input = ( =~ /([^\n\r]*)/)[0]; next if(!$input); next if($input =~ /[^\d\.]/); last; } $ip = $input; while(1){ print $addr,'を',$ip,'に対応させます おk? y/n/c'; $input = ; $return = &b2s(($input =~ /([^\n\r]*)/)[0]); if($return eq 'y' || $return eq 'yes'){ $flag = 1; last; }elsif($return eq 'n' || $return eq 'no'){ last; }elsif($return eq 'c' || $return eq 'cancel'){ return; } } last if($flag); } if($hostslist->{$addr}){ print $addr.'を'.$ip.'に修正しました'; }else{ print $addr.'を'.$ip.'に設定しました'; } $hostslist->{$addr} = $ip; &save_hosts($hostsfile,$hostslist); } sub goodbyebaby{ print 'ばいばい'; sleep(1); exit; } sub httperror{ print STDERR $_[0]; sleep(2); exit; } sub save_hosts{ my $hostsfile = ${$_[0]}; my %hostslist = %{$_[1]}; my $i = -1; print '[',$hostsfile,']に保存します'; print 'ちょっとまってね'; while(-f $hostsfile.'.'.(++$i)){ } rename($hostsfile,$hostsfile.'.'.$i); open(FN,"> ".$hostsfile); foreach(keys %hostslist){ print FN $hostslist{$_},' ',$_; } close(FN); print '保存完了'; print '以前のファイルは[',$hostsfile,'.',$i,']にリネームしました'; } __END__ #jword 0.0.0.0 jword.co.jp 0.0.0.0 jword.jp 0.0.0.0 jword.ne.jp 0.0.0.0 jword.info 0.0.0.0 j-word.jp 0.0.0.0 3721.com 0.0.0.0 9199.co.jp 0.0.0.0 9199.com 0.0.0.0 9199.jp 0.0.0.0 adjustnetwork.com 0.0.0.0 202.83.135.107 0.0.0.0 202.83.135.108 0.0.0.0 210.174.160.69 0.0.0.0 210.174.160.70 0.0.0.0 downloads.kingsoft.jp #ads 0.0.0.0 ad.jp.doubleclick.net 0.0.0.0 ad.doubleclick.net 0.0.0.0 ad.us.doubleclick.net 0.0.0.0 banner.mixi.jp 0.0.0.0 download.jword.jp 0.0.0.0 ad.jp.ap.valuecommerce.com 0.0.0.0 ck.jp.ap.valuecommerce.com 0.0.0.0 hpad.www.infoseek.co.jp 0.0.0.0 ads.lidr.valueclick.jp 0.0.0.0 bc.geocities.yahoo.co.jp 0.0.0.0 img.ads.mixi.jp 0.0.0.0 ads.mixi.jp 0.0.0.0 img.x-beat.com 0.0.0.0 oz.valueclick.ne.jp 0.0.0.0 popup11.tok2.com 0.0.0.0 popup3.tok2.com #crasher 0.0.0.0 raus.de 0.0.0.0 www.raus.de #end