#!/usr/bin/perl -- # # $Id: makebait,v 1.28 1996/10/15 13:26:22 johnbob Exp johnbob $ # # # Generate HTML containing bogus addresses, and some not-so-bogus # addresses like 'postmaster'. # The idea is to keep SPAMers and junkmailers who search web pages # for addresses too busy with bogus addresses to flood valid ones. # No good web site should be without a few thousand bogus addresses # that are changed often. # $verbose=0; $body_only=0; $title='SPAM bait'; $random_title=0; $n_low=900; $n_high=1100; $cgi_mode=0; $produced_output=0; $from_mode=0; @candidate_list = ( 'abcdefghijklmnopqrstuvwxyz', 'abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz0123456789', 'abcdefghijklmnopqrstuvwxyz0123456789', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', ); @candidate_list_p = ( 844, 125, 25, 5, 1, ); @name_length_p = ( 1, 49, 100, 150, 150, 125, 100, 75, ); @word_length_p = ( 1, 100, 500, 400, 350, 300, 250, 200, 150, 100, 50, 25, 1, 1, 1, 1, ); @parts_p = ( 7, 2, 1, ); # these should be modified from # time to time to throw the 'bots off %ending_assoc = ( 'com', 40, 'edu', 30, 'org', 10, 'gov', 1, 'us', 1, 'fi', 1, 'nl', 5, 'uk', 4, 'net', 2, 'kr', 1, 'de', 5, 'se', 1, 'no', 4, 'si', 1, ); @ending_list = keys %ending_assoc; @ending_list_p = values %ending_assoc; @z_who = ('postmaster','abuse','admin','root'); @z_where_at = ('','@localhost','@loopback'); @z_autoresponders = ('jnyynpr@plorecebzb.pbz','znaerzbir@plorecebzb.pbz', 'nohfr@plorecebzb.pbz','nohfrobg@plorecebzb.pbz','fraqre@nafjrezr.pbz', 'frira@tybonysa.pbz','yra@hck.arg','grez@zbarljbeyq.pbz', 'gevdhnag@rneguyvax.arg','qvfarltebhc@nafjrezr.pbz','yvfgf@nafjrezr.pbz', 'serq@svapba.pbz','rmvar@fcelarg.pbz','ppo@ploreirefr.pbz', 'vasvavgl@haqngn.pbz','wbuaz@znaafjro.pbz','wraal31@whab.pbz', 'crtnfhf496@cbjrearg.pbz','pncf@kcbaragvny.pbz', 'fgne5@cbobk.unegyrl.ba.pn','hfpppa@unira.vbf.pbz','rkarg@obbgf.pbz', ); %options = ( '-v', '$verbose=1;', '-h', '&do_help;', '-b', '$body_only=1;', '-t', '$title=shift(@ARGV);$random_title=-1;', '-n', '$n_low=shift(@ARGV);$n_high=$n_low;', '-cgi', '$cgi_mode=1;$body_only=0;if($random_title!=-1){$random_title=1;};', '-r', '$random_title=1;', '-f', '$from_mode=1;', ); sub do_help { print "-v turn on verbose mode\n"; print "-h help\n"; print "-b generate html body only, not an entire file\n"; print "-n v how many addresses to generate\n"; print "-cgi behave like a cgi script\n"; $produced_output=1; } srand(time|$$); if ( (@ARGV) ) { while( $arg=shift(@ARGV) ) { if( defined( $options{$arg} ) ) { eval $options{$arg}; } else { &generate_to_file($arg); $produced_output=1; } } } if( ! $produced_output ) { $cgi_mode=1; $body_only=0; if($random_title!=-1){$random_title=1;} &generate_to_file("-"); } exit 0; sub generate_to_file { local($fname) = @_; if( ! open(OF,">$fname") ) { return; } if( $cgi_mode ) { print OF "Content-type: text/html\n\n"; } if( $random_title ) { local($parts)=&integer_from_to(1,6); $title = &capitalize(&random_word_p()); #$title = &capitalize(&random_pronounceable_word()); for(local($i)=1;$i<$parts;$i++) { $title .= ' ' . &capitalize(&random_word_p()); #$title .= ' ' . &capitalize(&random_pronounceable_word()); } } if( ! $body_only ) { print OF " $title "; } print OF "

$title

"; local($n_mailto) = &integer_from_to($n_low,$n_high); $verbose && print "$n_mailto\n"; for(local($i)=0;$i<$n_mailto;$i++) { $address = &fake_address; $verbose && print "[$address]\n"; if( $from_mode ) { print OF "From: $address\n"; } else { print OF "$address"; if( &integer_from_to(1,3) != 1 ) { print OF "\n"; } else { print OF " "; } } } if( ! $body_only ) { print OF " "; } close(OF); } sub integer_from_to { local($from,$to) = @_; # $verbose && print "integer_from_to $from,$to\n"; if( $from == $to ) { return $from; } if( $from > $to ) { return &integer_from_to($to,$from); } local($diff) = ($to-$from)+1; local($rv)=$from+int(rand($diff)); # $verbose && print "rv=[$rv]\n"; return $rv; } sub integer_p_function { local(@p) = @_; local($total_volume) = 0; local($v); foreach $v ( @p ) { $total_volume += $v; } local($volume) = int(rand($total_volume)); local($rv) = 0; local($sum) = 0; foreach $v ( @p ) { $sum += $v; if( $volume < $sum ) { return $rv; } $rv++; } # this should never be reached return ($rv-1); } sub fake_address { if( &integer_from_to(1,100) == 1 ) { return &zinger(); } local($parts) = &integer_p_function(@parts_p) + 1; local($index)=&integer_p_function(@candidate_list_p); local($candidates) = $candidate_list[$index]; local($rv) = &random_name_p($candidates) . '@' . &random_name_p($candidates); for(local($i)=1;$i<$parts;$i++) { $rv .= '.' . &random_name_p($candidates); } $index=&integer_p_function(@ending_list_p); $rv .= '.' . $ending_list[$index]; return $rv; } sub zinger { local($rv); if( &integer_from_to(0,3) ) { $rv = $z_who[&integer_from_to(0,$#z_who)]; $rv .= $z_where_at[&integer_from_to(0,$#z_where_at)]; } else { $rv = $z_autoresponders[&integer_from_to(0,$#z_autoresponders)]; $rv =~ y/a-zA-Z/n-za-mN-ZA-M/; } $rv = &camel_case($rv); return $rv; } sub random_name { local($candidates,$from,$to) = @_; local($rv) = ''; local($a,$b) = split(/ /,$candidates); if( ! defined($b) ) { $b = $a; } local($length) = &integer_from_to($from,$to); if( $length < 1 ) { return $rv; } $rv .= &random_letter($a); for(local($i)=1;$i<$length;$i++) { $rv .= &random_letter($b); } return $rv; } sub random_name_p { local($candidates) = @_; local($rv) = ''; local($a,$b) = split(/ /,$candidates); if( ! defined($b) ) { $b = $a; } local($length)= &integer_p_function(@name_length_p) + 1; if( $length < 1 ) { return $rv; } $rv .= &random_letter($a); for(local($i)=1;$i<$length;$i++) { $rv .= &random_letter($b); } return $rv; } sub random_letter { local($candidates) = @_; return substr($candidates,&integer_from_to(0,length($candidates)-1),1); } sub random_word_p { local($candidates) = @_; local($rv) = ''; local($length)= &integer_p_function(@word_length_p) + 1; if( $length < 1 ) { return $rv; } for(local($i)=0;$i<$length;$i++) { $rv .= &random_letter('abcdefghijklmnopqrstuvwxyz'); } return $rv; } sub random_pronounceable_word { local($candidates) = @_; local($rv) = ''; local($length)= &integer_p_function(@word_length_p) + 1; if( $length < 1 ) { return $rv; } if( $length == 1 ) { @words_of_length_1 = ( 'a','i' ); } $rv .= &random_syllable(); while(length($rv)<$length) { $rv .= &random_syllable(); } return $rv; } sub random_syllable { return (&random_letter('bcdfghjklmnpqrstvwxyz') . &random_letter('aeiou') . &random_letter('bcdfghjklmnpqrstvwxyz') ); } sub capitalize { local($word) = @_; if( ! defined($word) || $word eq '' ) { return ''; } local($c) = substr($word,0,1); $c =~ y/a-z/A-Z/; substr($word,0,1) = $c; return $word; } sub camel_case { local($word) = @_; if( ! defined($word) || $word eq '' ) { return ''; } local($c); for(local($i)=0;$i