#!/usr/bin/perl use MIME::Base64 qw( encode_base64 ); use File::Basename; use Getopt::Std; use vars qw/ %opt /; # # Codifica ficheros en series de comandos de DOS # # # Command line options processing # sub init() { my $opt_string = 'i:o:h'; getopts( "$opt_string", \%opt ) or usage(); usage() if $opt{h}; } # # Help! # sub usage() { print STDERR << "EOF"; Codifica ficheros en series de comandos de DOS. -i: Input file -o: Output file -h: Show help example: $0 -i /tmp/file.exe -o file.bat EOF exit; } sub copy () { open OUTFILE, '>', $OUTPUT; print OUTFILE 'cd %TEMP%' . "\n"; # Encode input file into base64 open INFILE, '<', $FILE; binmode INFILE; my $buf; my $redirecter = '>'; my $b64; my $numline = 0; my $filesize = -s $FILE; my $percent = 0; my $last_percent = -1; while ( read( INFILE, $buf, 54) ) { $b64 = encode_base64($buf); chop($b64); print OUTFILE 'echo ' . $b64 . ' ' . $redirecter . ' file.b64' . "\n"; if ( $redirecter == '>' ){ $redirecter = '>>'; } $numline++; $percent = int($numline*5400/$filesize); if ($percent != $last_percent) { $last_percent = $percent; } } close INFILE; # Copy expand script print OUTFILE 'echo Option Explicit > base64.vbs' . "\n"; print OUTFILE 'echo Dim a, inFile, outFile, b64Enc, b64Dec, s, DM, EL >> base64.vbs' . "\n"; print OUTFILE 'echo Set a = WScript.Arguments >> base64.vbs' . "\n"; print OUTFILE 'echo set s=WScript.CreateObject(\"ADODB.Stream\") >> base64.vbs' . "\n"; print OUTFILE 'echo Set DM = CreateObject(\"Microsoft.XMLDOM\") >> base64.vbs' . "\n"; print OUTFILE 'echo Set EL = DM.createElement(\"tmp\") >> base64.vbs' . "\n"; print OUTFILE 'echo inFile = a(0) >> base64.vbs' . "\n"; print OUTFILE 'echo outFile = a(1) >> base64.vbs' . "\n"; print OUTFILE 'echo s.Open >> base64.vbs' . "\n"; print OUTFILE 'echo s.type=2 >> base64.vbs' . "\n"; print OUTFILE 'echo s.CharSet=\"ascii\" >> base64.vbs' . "\n"; print OUTFILE 'echo s.LoadFromFile(inFile) >> base64.vbs' . "\n"; print OUTFILE 'echo b64Enc=s.ReadText() >> base64.vbs' . "\n"; print OUTFILE 'echo s.Close >> base64.vbs' . "\n"; print OUTFILE 'echo EL.DataType = \"bin.base64\" >> base64.vbs' . "\n"; print OUTFILE 'echo EL.Text = b64Enc >> base64.vbs' . "\n"; print OUTFILE 'echo b64Dec=EL.NodeTypedValue >> base64.vbs' . "\n"; print OUTFILE 'echo s.Type=1 >> base64.vbs' . "\n"; print OUTFILE 'echo s.Open >> base64.vbs' . "\n"; print OUTFILE 'echo s.Write b64Dec >> base64.vbs' . "\n"; print OUTFILE 'echo s.SaveToFile outFile, 2 >> base64.vbs' . "\n"; print OUTFILE 'echo s.Close >> base64.vbs' . "\n"; # Exe expand script and del temp files print OUTFILE 'cscript base64.vbs file.b64 '. basename($FILE) . "\n"; print OUTFILE 'del base64.vbs file.b64' . "\n"; close OUTFILE; } ################################ init(); $OUTPUT = $opt{o} if $opt{o}; $FILE = $opt{i} if $opt{i}; usage() if !(defined($OUTPUT) && defined($FILE)); copy();