2012-12-06 7 views
8

Im LWP zum Herunterladen einer ausführbaren Dateityp und mit der Antwort im Speicher, ich bin in der Lage, die Datei zu hacken. Wie kann ich diese Datei auf meinem System speichern? Ich denke, ich bin auf der falschen Spur mit dem, was ich unten versuche. Der Download ist erfolgreich, da ich in der Lage bin, den Hash korrekt zu generieren (ich habe es durch Herunterladen der tatsächlichen Datei und Vergleichen der Hashes überprüft).perl speichern Sie eine Datei heruntergeladen von lwp

use strict; 
use warnings; 
use LWP::Useragent; 
use Digest::MD5 qw(md5_hex); 
use Digest::MD5::File qw(file_md5_hex); 
use File::Fetch; 

my $url = 'http://www.karenware.com/progs/pthasher-setup.exe'; 
my $filename = $url; 
$filename =~ m/.*\/(.*)$/; 
$filename = $1; 
my $dir ='/download/two'; 
print "$filename\n"; 

my $ua = LWP::UserAgent->new(); 
my $response = $ua->get($url); 
die $response->status_line if !$response->is_success; 
my $file = $response->decoded_content(charset => 'none'); 
my $md5_hex = md5_hex($file); 
print "$md5_hex\n"; 
my $save = "Downloaded/$filename"; 
    unless(open SAVE, '>>'.$save) { 
     die "\nCannot create save file '$save'\n"; 
    } 
    print SAVE $file; 
    close SAVE; 

Wenn Sie sich fragen, warum lade ich nicht stattdessen alles dann analysieren Sie den Ordner für jede Datei und Hash, seine weil im all diese Dateien in einer Schleife herunterzuladen. Und während jeder Schleife lade ich die relevante Quell-URL (wo diese Datei gefunden wurde) zusammen mit dem Dateinamen und Hash in eine Datenbank auf einmal.

Antwort

9

Versuchen getstore() von LWP::Simple

use strict; 
use warnings; 
use LWP::Simple qw(getstore); 
use LWP::UserAgent; 
use Digest::MD5 qw(md5_hex); 
use Digest::MD5::File qw(file_md5_hex); 
use File::Fetch; 

my $url = 'http://www.karenware.com/progs/pthasher-setup.exe'; 
my $filename = $url; 
$filename =~ m/.*\/(.*)$/; 
$filename = $1; 
my $dir ='/download/two'; 
print "$filename\n"; 

my $ua = LWP::UserAgent->new(); 
my $response = $ua->get($url); 
die $response->status_line if !$response->is_success; 
my $file = $response->decoded_content(charset => 'none'); 
my $md5_hex = md5_hex($file); 
print "$md5_hex\n"; 
my $save = "Downloaded/$filename"; 
getstore($url,$save); 
+0

Vielen Dank, aber der Nachteil an getstore() ist, dass der Ordner bereits existieren muss. Ich wurde für einen Moment geschockt, als keine Datei/Ordner erschien. –

1

getStore eine ausgezeichnete Lösung ist jedoch für alle anderen diese Antwort auf eine etwas andere Einrichtung zu lesen, ist es das Problem nicht lösen kann.

Zunächst könnte Sie möglicherweise nur leiden unter einem Binär-/Text-Problem.

ich

ändern würde
my $save = "Downloaded/$filename"; 
unless(open SAVE, '>>'.$save) { 
    die "\nCannot create save file '$save'\n"; 
} 
print SAVE $file; 
close SAVE; 

zu

my $save = "Downloaded/$filename"; 
open my $fh, '>>', $save or die "\nCannot create save file '$save' because $!\n"; 
# on platforms where this matters 
# (like Windows) this is needed for 
# 'binary' files: 
binmode $fh; 
print $fh $file; 
close $fh; 

Der Grund, warum ich das besser gefällt, ist, dass, wenn Sie festgelegt haben oder einige Einstellungen in Ihrem Browser Objekt ($ RE) erworben, sie sind in GetStore von LWP :: Simple ignoriert, da es einen eigenen Browser verwendet.

Außerdem verwendet es die Drei-Parameter-Version von open, die sicherer sein sollte.

Eine andere Lösung wäre, die Callback-Methode zu verwenden und die Datei während des Herunterladens zu speichern, wenn Sie beispielsweise mit einer großen Datei arbeiten. Der Hash-Algorithmus müßte geändert werden, so dass es wahrscheinlich hier nicht relevant ist, aber hier ist ein Beispiel:

my $req = HTTP::Request->new(GET => $uri); 
open(my $fh, '>', $filename) or die "Could not write to '$filename': $!"; 
binmode $fh; 
$res = $ua->request($req, sub { 
    my ($data, $response, $protocol) = @_; 
    print $fh $data; 
}); 
close $fh; 

Und wenn die Größe unwichtig ist (und das Hashing ist eine andere Art und Weise getan) Sie einfach Ihren Browser fragen könnten speichern Sie es direkt:

my $req = HTTP::Request->new(GET => $uri); 
$res = $ua->request($req, $filename); 
Verwandte Themen