Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
#! perl -w
#
# This script processes a file in Berkeley mailbox format and locates
# EarthLink Challenge-Response URLs (there's a bunch of other domains
# that use the same system besides earthlink.com). It then automatically
# fetches the challenge webpage and constructs a POST response. If the
# CAPTCHA on the page is a repeat of a known value it will put up a
# little Tk widget for human assistance. If, as will be usual after a
# while, the CAPTCHA is a known one, the response will be sent without
# further human assistance.
#
# Written December 2005 Richard Clayton richard AT highwayman.com
# Last edit 12 FEB 2006
#
# This script may be freely used and adapted by anyone who is not
# going to use it to send spam. It would be polite to leave my name
# upon it as the initial author :)
#
# If you are unable to make the script work for you or you do not understand
# what environment it needs to operate or you have any other problems
# with it then please discard it and get on with the rest of your life.
# I have zero interest in holding your hand in order to make it work!
#
# Note also that you use this script at your own risk. It is undoubtedly
# possible to craft special emails which -- when this script is run -- will
# cause your machine to visit websites and send information to them that
# you will later regret. If you do not understand how to prevent this
# occurring then once again this script is not suitable for your use.
#
# Use at your own risk. No warranty of any kind is made about this script.
#
use strict;
use Fcntl;
use LWP::UserAgent;
use HTTP::Request::Common;
use Tk;
use Tk::JPEG;
use Tk::Entry;
use MD5;
my $TRUE = 1;
my $FALSE = 0;
my $ua = LWP::UserAgent->new;
push @{ $ua->requests_redirectable }, 'POST';
my $mw;
my $text;
my $entry;
my $server;
die "usage: perl earthlink.pl mboxfile...\n" if ($#ARGV < 0);
my $history = "history"; # history directory
open (LOG,">>logfile.txt") or die "Cannot open LOG file 'logfile.txt'";
my ($s,$m,$h,$D,$M,$Y,$wd,$yd,$dst) = localtime(time);
my $now = sprintf("%4d-%02d-%02d %02d:%02d:%02d", $Y+1900, $M+1, $D, $h, $m, $s);
#====================
# process our history
#====================
my $md5 = new MD5;
my %hashes;
my $maxIMAGE = 0;
if (open (HIST,"<$history\/history.txt"))
{
while ()
{
if (/^File=(\d{8})\.jpg, MD5=([0-9a-f]{32}), Text=(\w+|\?\?\?)$/)
{
$maxIMAGE = $1 if ($1 > $maxIMAGE);
$hashes{$2} = $3;
}
else
{
die "Bad HIST file line: '$_'";
}
}
close HIST;
}
else
{
print STDERR "Failed to open existing HISTORY file $history\/history\n";
unless (-e ($history))
{
mkdir($history) or die "Failed to create HISTORY directory: $history\\\n";
}
die "HISTORY directory '$history' is not in fact a directory\n" unless -d $history;
}
#===============
# process emails
#===============
open (HIST,">>$history\/history.txt") or die "Cannot open HISTORY file '$history\/history.txt'";
open (RESULTS,">>$history\/results.txt") or die "Cannot open RESULTS file '$history\/results.txt'";
foreach (@ARGV)
{
my $argument = $_;
my (@filelist) = glob($argument);
foreach my $filename (@filelist)
{
open(EMAIL, "$filename") || die "Unable to open $filename: $!\n";
print STDERR "\nProcessing $filename\n";
emailparse();
close(EMAIL);
}
}
close RESULTS;
close HIST;
close EMAIL;
close LOG;
#end of MAIN
#=============
sub emailparse
#=============
{
my $done = $FALSE;
while ()
{
if (/^From /)
{
$done = $FALSE;
}
elsif (/(https:\/\/webmail.[\.\w]+)(\/wam\/addme?.*?&id=\w*)$/)
{
unless ($done)
{
$server = $1;
respond($2);
}
$done = $TRUE;
}
}
}
#==========
sub respond
#==========
{
my ($details) = @_;
print "Trying $details\n";
my $result = $ua->request(GET $server.$details);
if ($result->is_success)
{
my $ok = ($result->content =~ /ERROR: Unable to process Allowed Sender request/);
if ($ok)
{
print "Too late to try this one\n";
print RESULTS "$now TOO LATE: $server $details\n";
return;
}
$ok = ($result->content =~ /(\/wam\/verificationImageServlet\?input=.*?\&x=[\-\d]+\")/);
my $image = $1;
unless ($ok)
{
print "Failed to locate image prompt\n";
print LOG $result->content;
print RESULTS "$now BAD PAGE: $server $details\n";
return;
}
my $ires = $ua->request(GET $server.$image);
if ($ires->is_success)
{
print "Image retrieved OK\n";
my $hex = $md5->hexhash($ires->content);
$text = $hashes{$hex};
$text = "???" unless $text;
if ($text eq "???")
{
my $imageFile = sprintf("%08d.jpg", ++$maxIMAGE);
if (sysopen (IMAGE, "$history\/$imageFile", O_BINARY | O_WRONLY | O_CREAT))
{
print IMAGE $ires->content;
close IMAGE;
interact("$history\/$imageFile");
print HIST "File=$imageFile, MD5=$hex, Text=$text\n";
die "Failed to provide a string\n" if ($text eq "???");
$hashes{$hex} = $text;
}
else
{
die ("Failed to open $imageFile, $!");
}
}
else
{
print "Already know text is $text\n";
}
}
else
{
print "Failed to retrieve Image\n";
print $ires->status_line, "\n";
print RESULTS "$now NO IMAGE $server $details $image\n";
return;
}
$ok = $result->content =~ /type=hidden name="id" value="(.*?)"/;
my $id = $1;
$ok .= $result->content =~ /type=hidden name="a" value="(.*?)"/;
my $a = $1;
$ok .= $result->content =~ /type=hidden name="from_email" value="(.*?)"/;
my $from = $1;
$ok .= $result->content =~ /type=hidden name="subject" value="(.*?)"/;
my $subject = $1;
if (!$ok)
{
print "Failed to find all components of form\n";
print LOG $result->content;
print RESULTS "$now BAD FORM $server $details $image\n";
return;
}
submit($id, $a, $from, $subject, $details, $image);
}
else
{
print "Failed to get challenge page\n";
print $result->status_line, "\n";
print RESULTS "$now NO PAGE $server $details";
}
}
#=========
sub submit
#=========
{
my ($id, $a, $from, $subject, $details, $image) = @_;
my $result = $ua->request(
POST $server.'/wam/addmeSubmit',
[
multi => 'no',
id => $id,
a => $a,
from_email => $from,
subject => $subject,
first => 'Richard',
middle => '',
last => 'Clayton',
reason => 'Your tedious challenge-response system sends junk to me whenever you receive spam. Turn it off!',
challenge => $text
]);
if ($result->is_success)
{
if ($result->content =~ /chooses to allow email from your address, the message\(s\) that have been intercepted will be delivered immediately/)
{
print "Challenge Accepted OK\n";
print RESULTS "$now OK $server $details $image $text\n";
}
else
{
print "Problem with $id:$a\n";
print LOG $result->content;
print RESULTS "$now FAIL $server $details $image $text\n";
}
}
else
{
print $result->status_line, "\n";
print RESULTS "$now DIED $server $details $image $text\n";
}
}
#===========
sub interact
#===========
{
my ($file) = @_;
$mw = MainWindow->new();
my $image = $mw->Photo(-file => $file, -format => "jpeg" );
$mw->Label(-image => $image)->pack(-expand => 1, -fill => 'both');
$entry = $mw->Entry(-width => 20, -takefocus=>1)->pack;
$mw->Button(-text => 'Done', -command => \&quitCommand)->pack;
MainLoop;
}
#==============
sub quitCommand
#==============
{
$text = $entry->get();
$mw->destroy;
}
#ends