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

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&" );# ()
  • Comment on Re^5: dynamic extractor based off static references in file (perl)
  • Download Code

Replies are listed 'Best First'.
Re^6: dynamic extractor based off static references in file (perl)
by james289o9 (Acolyte) on Dec 06, 2013 at 17:21 UTC
    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.
      Thank you all for helping. i finally got it to work like this:
      # this gets the reference to the actual data in the file my $buffer = ''; sysseek $infile, 0x15, 0; sysread $infile, $buffer, 0x03; $buffer =~ s/(.)/sprintf("%x",ord($1))/eg; # this will move the CUR to the actual data as specified from the refe +rence and will extract it to file. open(my $newfile, '>', "./file"); my $new; sysseek $infile,hex($buffer), 0; sysread $infile, $new, 0x40000; syswrite $newfile, $new;

      If you notice in the second set of sysseek, i had to hex($buffer). That solved the problem and allowed me to input "04C0" i am now extracting the data successfully.
      Thanks to everyone who took their time to help me :)
        pack n An unsigned short (16-bit) in "network" (big-endian) order.
        my $bytes = qq[\4\xC0]; my $ushortbe = unpack q[n], $bytes; printf qq[0x%04X 0b%b %d\n], ($ushortbe ) x 3; __END__ 0x04C0 0b10011000000 1216

        but in all the code you've pasting you've been reading 3 bytes, a 16 bit integer takes 2 bytes ( 2x8) not 3 , so .... :)

        ridiculous, but what do I care