3 Stimmen

@INC-Haken unbekannt fataler Fehler

Hey, ich schreibe ein Programm, das einen @INC-Hook verwendet, um den echten Perl-Quellcode von Blowfish zu entschlüsseln. Ich habe ein ziemlich ärgerliches Problem, das nicht mit Warnungen oder einer meiner Standardtricks auftaucht... Wenn ich zum Erstellen des neuen Cipher-Objekts komme, springt die Schleife zum nächsten Objekt in @INC, ohne dass ein Fehler oder irgendetwas.... Ich weiß nicht, was ich tun soll!

#!/usr/bin/perl -w
use strict;
use Crypt::CBC;
use File::Spec;

sub load_crypt {
    my ($self, $filename) = @_;
    print "Key?\n: ";
    chomp(my $key = <STDIN>);
    for my $prefix (@INC) {
            my $buffer = undef;
            my $cipher = Crypt::CBC->new( -key => $key, -cipher => 'Blowfish');
            my $derp = undef;
            $cipher ->start('decrypting');
            open my $fh, '<', File::Spec->($prefix, "$filename.nc") or next;
            while (read($fh,$buffer,1024)) {
                    $derp .= $cipher->crypt($buffer);
            }
            $derp .= $cipher->finish;
            return ($fh, $derp);
    }
}

BEGIN {
    unshift @INC, \&load_crypt;
}
require 'gold.pl';

Auch wenn ich den tatsächlichen Schlüssel in die Initialisierungsmethode einfüge, schlägt es immer noch fehl

4voto

cjm Punkte 60581

Sie haben hier eine Reihe von Problemen. Zunächst einmal verwenden Sie File::Spec falsch. Zweitens geben Sie einen Filehandle zurück, der bereits am Ende der Datei ist, und einen String, der kein gültiger Rückgabewert ist. (Außerdem würde ich den Key Prompt außerhalb des Hooks platzieren.)

#!/usr/bin/perl -w
use strict;
use Crypt::CBC;
use File::Spec;

# Only read the key once:
print "Key?\n: ";
chomp(my $key = <STDIN>);

sub load_crypt {
  my ($self, $filename) = @_;
  return unless $filename =~ /\.pl$/;
  for my $prefix (@INC) {
    next if ref $prefix;
    #no autodie 'open'; # VERY IMPORTANT if you use autodie!
    open(my $fh, '<:raw', File::Spec->catfile($prefix, "$filename.nc"))
        or next;
    my $buffer;
    my $cipher = Crypt::CBC->new( -key => $key, -cipher => 'Blowfish');
    my $derp;
    $cipher->start('decrypting');
    while (read($fh,$buffer,1024)) {
      $derp .= $cipher->crypt($buffer);
    }
    $derp .= $cipher->finish;
    # Subroutine writes 1 line of code into $_ and returns 1 (false at EOF):
    return sub { $derp =~ /\G(.*\n?)/g and ($_ = $1, 1) };
  }
  return; # Didn't find the file; try next @INC entry
} # end load_crypt

# This doesn't need a BEGIN block, because we're only using the hook
# with require, and that's a runtime operation:
unshift @INC, \&load_crypt;
require 'gold.pl';

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X