in reply to Re^2: dynamic extractor based off static references in file (perl)
in thread dynamic extractor based off static references in file (perl)

it prints the data from $infile, but not in binary form

Sure it does, you used binmode on both filehandles, you read the data, its binary form, there is no doubt; if you need a different format you'll need to do something about it

  • Comment on Re^3: dynamic extractor based off static references in file (perl)

Replies are listed 'Best First'.
Re^4: dynamic extractor based off static references in file (perl)
by james289o9 (Acolyte) on Dec 06, 2013 at 08:38 UTC
    Yes sir, and that happens to be where im stuck at. when i try to put the $buffer (location) into the variable $reference, it works. but when i try to use $location in sysseek i gives me the error:
    Argument "\0^D&" isn't numeric in sysseek

      Argument "\0^D&" isn't numeric in sysseek

      Based on those bytes/octets, to turn them a "number", it all depends on what kind ... see pack, unpack, perlpacktut

      Just guessing at the right one (guessing is bad, knowing is better)

      use Data::Dump qw/ dd pp /; dd( unpack q{c*}, "\0^D&" );# (0, 94, 68, 38) dd( unpack q{C*}, "\0^D&" );# (0, 94, 68, 38) dd( unpack q{W*}, "\0^D&" );# (0, 94, 68, 38) dd( unpack q{s*}, "\0^D&" );# (24064, 9796) dd( unpack q{S*}, "\0^D&" );# (24064, 9796) dd( unpack q{l*}, "\0^D&" );# 642014720 dd( unpack q{L*}, "\0^D&" );# 642014720 dd( unpack q{i*}, "\0^D&" );# 642014720 dd( unpack q{I*}, "\0^D&" );# 642014720 dd( unpack q{n*}, "\0^D&" );# (94, 17446) dd( unpack q{N*}, "\0^D&" );# 6177830 dd( unpack q{v*}, "\0^D&" );# (24064, 9796) dd( unpack q{V*}, "\0^D&" );# 642014720 dd( unpack q{q*}, "\0^D&" );# () dd( unpack q{Q*}, "\0^D&" );# ()
        Here is my code so far.
        open(my $infile, '<', "./file") or die "Cannot open file: $!"; binmode($infile); open(my $outfile, '>', "./reference1") or die "Cannot create file: $!" +; binmode($outfile); my $buffer = ''; sysseek $infile, 0x15, 0; sysread $infile, $buffer, 0x03; syswrite $outfile, $buffer; $buffer =~ s/(.)/sprintf("%x",ord($1))/eg; #this converts it into hex. print $buffer, "\n"; #this prints the converted $buffer (04C0)
        Maybe I am trying to go about this the wrong way.
        $buffer = (04C0)
        It would be really nice to be able to use $buffer like this but I dont think its possible that way:
        sysseek $infile, $buffer, 1; sysread $infile, $new, 0x40000; syswrite $newfile, $new;
        Remember that $buffer contains the 04C0, which is a reference to the actual data further into the file. so I get the reference values with this:
        my $buffer = ''; sysseek $infile, 0x15, 0; sysread $infile, $buffer, 0x03; syswrite $outfile, $buffer;
        Then I try to sysseek to that position in the file like this, using the reference i obtained with the code above:
        sysseek $infile, $buffer, 1; sysread $infile, $new, 0x40000; syswrite $newfile, $new;
        Also Anonomous Monk, please let me thank you for the help so far. Im not exactly pro at programming, but I know how i want it to work, I am just having a hard time setting this up to work. I feel like i am going in circles now.
        $buffer stores the reference to where the actual data is in the file.
        so it will look like this:
        my $buffer = ''; sysseek $file, 0x15, 0; sysread $file, $buffer, 0x03; syswrite $outfile, $buffer;
        And 0x15 is the reference to the actual data in this file. this code will get that reference and store it in $buffer.
        What I want to be able to do is use $buffer in sysseek like this:
        sysseek $file, $buffer, 0;
        as opposed to:
        sysseek $file, 0x400, 0;